• Python Opencv实践 - 视频目标追踪CamShift


            CamShift是MeanShift的改进,能够动态自适应跟踪目标大小,而不是一个固定窗口。在opencv中使用CamShift进行目标追踪的方法和MeanShift差不多,只需要替换meanShift方法并且使用cv.polylines绘制出结果多边形窗口即可。

    参考资料

    Python Opencv实践 - 视频目标追踪MeanShift_亦枫Leonlew的博客-CSDN博客

    python opencv入门 Meanshift 和 Camshift 算法(40)_meanshift源码opencv_红鲤鱼遇绿鲤鱼的博客-CSDN博客

    1. import cv2 as cv
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. #打开视频
    5. video = cv.VideoCapture("../SampleVideos/milo.mp4")
    6. #读取第一帧图像
    7. ret,frame = video.read()
    8. plt.figure(figsize=(16,16))
    9. plt.imshow(frame[:,:,::-1])
    10. cv.imwrite("tmp.jpg", frame)
    11. #设置跟踪目标的位置(行,高,列,宽)
    12. row,height,col,width = 670,80,360,120
    13. obj_track_window = (col, row, width, height)
    14. #设置ROI区域
    15. roi = frame[row:row+height,col:col+width]
    16. plt.imshow(roi[:,:,::-1])
    17. #计算ROI的直方图
    18. #1. 转换到HSV色彩空间
    19. roi_hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
    20. #2. 计算ROI区域直方图
    21. roi_hist = cv.calcHist([roi_hsv],[0],None,[180],[0,180])
    22. # 直方图归一化
    23. cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
    24. #进行目标追踪
    25. #1. 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
    26. #参考资料:https://blog.csdn.net/csg3140100993/article/details/102613843
    27. term_crit = (cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT, 10, 1)
    28. #2. 处理每一帧
    29. while (True):
    30. ret,frame = video.read()
    31. if ret == False:
    32. break;
    33. #计算直方图反向投影
    34. #cv.calcBackProject(image, channels, hist, ranges, scale[, dst])
    35. #image:输入图像(HSV),要用中括号[]括起来
    36. #channels:用于计算反向投影的通道列表,通道数必须与直方图的维度匹配
    37. #hist:模板图像的直方图
    38. #ranges:直方图中每个维度bin的取值范围
    39. #scale:缩放因子,一般为1
    40. #参考资料:https://www.jianshu.com/p/d0a2c70cf99e
    41. hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    42. target = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)
    43. #使用MeanShit追踪
    44. #cv.CamShift(probImage, window, criteria)
    45. #probImage:ROI区域,即目标直方图的反向投影
    46. #window:初始搜索窗口,就是定义ROI的rect
    47. #criteria:确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等
    48. #参考资料:https://blog.csdn.net/tengfei461807914/article/details/80412482
    49. ret,obj_track_window = cv.CamShift(target, obj_track_window, term_crit)
    50. #绘制追踪目标多边形
    51. points = cv.boxPoints(ret)
    52. points = np.intp(points)
    53. img_track = cv.polylines(frame, [points], True, (0,255,0), 2)
    54. cv.imshow('MeanShift Demo', img_track)
    55. if cv.waitKey(30) & 0xFF == ord('q'):
    56. break;
    57. video.release()
    58. cv.destroyAllWindows()

     

  • 相关阅读:
    TS中泛型的使用
    高可用k8s集群(k8s-1.29.2)
    学位英语短语
    ssh连接防止断开程序中断
    【无标题】
    uniapp父组件使用prop将异步的数据传给子组件
    【Unity3D】激光雷达特效
    第二期 微信云开发之位置信息获取(wx.getLocation)
    从一道题到贪心入门
    【模型训练】yolov7猫狗检测
  • 原文地址:https://blog.csdn.net/vivo01/article/details/133100759