OpenCV meanshift目标追踪

meanshift原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。

Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。

cv.meanShift(probImage, window, criteria)

参数:

  • probImage: ROI区域,即目标的直方图的反向投影

  • window: 初始搜索窗口,就是定义ROI的rect

  • criteria: 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等。

实现Meanshift的主要流程是:

  1. 读取视频文件:cv.videoCapture()
  2. 感兴趣区域设置:获取第一帧图像,并设置目标区域,即感兴趣区域
  3. 计算直方图:计算感兴趣区域的HSV直方图,并进行归一化
  4. 目标追踪:设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框。
import cv2 as cv

# 1.获取图像
cap = cv.VideoCapture('./1.mp4')

# 2.获取第一帧图像,并指定目标位置
ret, frame = cap.read()

# 2.1 目标位置(行,高,列,宽)
r, h, c, w = 197, 141, 0, 208
track_window = (c, r, w, h)

# 2.2 指定目标的感兴趣区域
roi = frame[r:r+h, c:c+w]

# 3. 计算直方图
# 3.1 转换色彩空间(HSV)
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)

# 3.2 去除低亮度的值
# mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))

# 3.3 计算直方图
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])

# 3.4 归一化
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)

# 4. 目标追踪
# 4.1 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)

while(True):

    # 4.2 获取每一帧图像
    ret, frame = cap.read()
    if ret == True:

        # 4.3 计算直方图的反向投影
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

        # 4.4 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 4.5 将追踪的位置绘制在视频上,并进行显示
        x, y, w, h = track_window
        img2 = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
        cv.imshow('frame', img2)

        if cv.waitKey(60) & 0xFF == ord('q'):
            break
    else:
        break

# 5. 资源释放        
cap.release()
cv.destroyAllWindows()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于OpenCV实现的优化版MeanShift目标跟踪算法的C++代码: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture(0); Mat frame, hsv_frame, mask, hist; Rect track_window; int hbins = 30, sbins = 32, histSize[] = { hbins, sbins }; float hranges[] = { 0, 180 }, sranges[] = { 0, 256 }; const float* ranges[] = { hranges, sranges }; while (waitKey(30) != 27) { capture >> frame; if (frame.empty()) break; // 将BGR图像转化为HSV图像 cvtColor(frame, hsv_frame, COLOR_BGR2HSV); // 提取目标区域的直方图 inRange(hsv_frame, Scalar(0, 60, 32), Scalar(180, 255, 255), mask); calcHist(&hsv_frame, 1, 0, mask, hist, 2, histSize, ranges, true, false); normalize(hist, hist, 0, 255, NORM_MINMAX); // 进行MeanShift目标跟踪 track_window = Rect(0, 0, frame.cols, frame.rows); TermCriteria criteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); meanShift(hsv_frame, track_window, criteria); rectangle(frame, track_window, Scalar(0, 0, 255), 3); // 显示图像 imshow("MeanShift Object Tracking", frame); } return 0; } ``` 以上代码中,通过调用`meanShift()`函数实现了优化版MeanShift目标跟踪算法。该算法首先将BGR图像转化为HSV图像,然后提取目标区域的直方图,并对直方图进行归一化处理。接着,调用`meanShift()`函数进行目标跟踪,最后在原图像上绘制出目标区域的矩形框。 通过运行以上代码,可以实现优化版MeanShift目标跟踪算法,并在屏幕上显示跟踪结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值