资讯专栏INFORMATION COLUMN

opencv python Meanshift 和 Camshift

KitorinZero / 2380人阅读

摘要:算法的基本原理简单假设我们有一堆点,和一个小的圆形窗口,算法就是不断移动小圆形窗口,直到找到圆形区域内最大灰度密度处为止初始窗口以蓝色圆圈显示,名称为其原始中心标有蓝色矩形,名为但是,这个窗口当中所有点的点集构成的质心在蓝色圆形点处圆环的型

Meanshift and Camshift

Meanshift

Meanshift 算法的基本原理简单,假设我们有一堆点,和一个小的圆形窗口,Meanshift 算法就是不断移动小圆形窗口,直到找到圆形区域内最大灰度密度处为止.

初始窗口以蓝色圆圈显示,名称为“C1”,其原始中心标有蓝色矩形,名为“C1_o”.但是,这个窗口当中所有点的点集构成的质心在蓝色圆形点处,圆环的型心和质心并不重合,所以,移动蓝色的窗口以使型心与之前得到的质心重合.
不断执行上面的移动过程,直到型心和质心大致重合结束.
通常通过直方图反投影图像和初始目标位置,当物体移动时,移动反映在直方图反投影图像中,最后圆形的窗口会落到像素分布最大的地方,也就是图中的绿色圈并命名为C2.

meanshift in OpenCV

首先要设定目标,并计算的直方图,然后对这个直方图在每一帧当中进行反向投影.需要提供一个初试的窗口位置,计算HSV模型当中H(色调)的直方图,为了避免低亮度造成的影响,使用 cv2.inRange()将低亮度值忽略.

import numpy as np
import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture("test.mp4")
# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 50,200,50,100  # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
hsv_roi =  cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
    ret ,frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply meanshift to get the new location
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        # Draw it on image
        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv2.polylines(frame,[pts],True, 255,2)
        cv2.imshow("img2",img2)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        else:
            cv2.imwrite(chr(k)+".jpg",img2)

    else:
        break

cv2.destroyAllWindows()
cap.release()

CamShift

在目标跟踪中,物体的大小不是固定的,所以设置的跟踪窗口也应该随之变化,CAMshift算法,首先使用meanshift算法找到目标,然后调整窗口大小,而且还会计算目标对象的的最佳外接圆的角度,并调整窗口,并使用调整后的窗口对物体继续追踪.

Camshift in OpenCV

它与meanshift几乎相同,但它返回一个旋转的矩形.

import numpy as np
import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture("test.mp4")
# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 50,200,50,100  # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
hsv_roi =  cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
    ret ,frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply meanshift to get the new location
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        # Draw it on image
        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv2.polylines(frame,[pts],True, 255,2)
        cv2.imshow("img2",img2)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        else:
            cv2.imwrite(chr(k)+".jpg",img2)

    else:
        break

cv2.destroyAllWindows()
cap.release()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42097.html

相关文章

  • 基于卷积神经网络的奶牛个体身份识别

    摘要:将躯干图像灰度化后经插值运算和归一化变换为大小的矩阵,作为结构的卷积神经网络的输入进行个体识别。卷积神经网络构建为减少数据量并保证输入图像的细节信息,将奶牛躯干图像灰度化后通过插值计算变化为的图像,并除以归一化后作为输入数据。 最近看了一个有趣的人工智能应用,给大家分享一下~这是一个人工智能与农业的结合,在农业中我们经常需要给个体动物做标记,目的是对奶牛做身份识别,然后可以对动物做养殖和繁殖...

    MyFaith 评论0 收藏0
  • OpenCV Python安装教程

    摘要:比较复杂的是下载源代码使用安装。上安装的方法先上可以直接编译安装首先要安装编译需要的依赖包下载的源代码解压编译并安装另外在上使用调用需要安装对应的包完整脚本地址使用一个简单用来验证是否能够调用的方法可以得到版本 OpenCV全称:Open Source Computer Vision Library,是一个开源的跨平台计算机视觉库,github地址:https://github.com...

    summerpxy 评论0 收藏0
  • OpenCV-Python,计算机视觉开发利器

    摘要:而这其中,很多应用都涉及到计算机视觉这样一个细分领域。常见的图像处理灰度图二值化平滑边缘提取这几种都属于数字图像处理的常用方法。对这方面知识感兴趣的,可以找本数字图像处理的相关教材系统地看一遍,了解数字图像处理的基础。 人工智能 ,一个已经被谈论了几十年的概念(最早是 图灵 在 1950年 提出)。如今这几年,相关技术的发展速度是越来越快。高大上如无人驾驶、智能安防、AI辅助诊断,接地...

    阿罗 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<