在OpenCV里使用Camshift算法的实现

作者:caimouse 时间:2023-01-24 20:46:40 

前面学习过Meanshift算法,在观察这个结果标记时,会发现有这样一个问题,如下图:

在OpenCV里使用Camshift算法的实现

汽车比较远时,用一个很小的窗口就可以把它框住,这是符合近大远小的投影原理,当比较近的时候如下:

在OpenCV里使用Camshift算法的实现

相同大小的窗口已经不能包围它了,那么这样跟踪目标对象就成为了一个问题,怎么样来更改它呢?那么就是Camshift (Continuously Adaptive Meanshift)算法引入的原因了。同时还会有一个问题,怎么样判断物体旋转的方向,这个算法也会解决这样的问题。这个算法发表在1998年的论文《Computer Vision Face Tracking for Use in a Perceptual User Interface》里。

这个算法,首先应用meanshift找到最大密度,然后再更新窗口的大小,接着计算最适合外包椭圆;如果不合适又进入一轮迭代过程。直满足meanshift的条件,并且窗口大小也合适为止。

Camshift函数返回两个值,第一个值ret是一个旋转的窗口,第二个值是窗口搜索位置给下一次搜索使用的。例子如下:


#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

capture = cv2.VideoCapture(1)
if not capture.isOpened:
 print('Unable to open: ')
 exit(0)

#获取第一帧图片
ret,frame = capture.read()

#设置目标窗口
#读取文件
find = cv2.imread('luohu1.png')
h,w = find.shape[:2]
roi = find[10: 120, 10: 120]
x = 10
y = 10
width = 120 - x
height = 120 - y
track_window = (x, y, w, h)
print(track_window)
#跟踪目标
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)

#设置迭代条件,每10移动一点
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

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

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

#使用 meanshift获得新位置
   ret, track_window = cv2.CamShift(dst, track_window, term_crit)

#显示标记
   pts = cv2.boxPoints(ret)
   pts = np.int0(pts)
   img2 = cv2.polylines(frame,[pts],True, (255,0,0),2)
   cv2.imshow('img2',img2)

cv2.imshow("dst", dst)
   cv2.imshow("roi", roi)
   keyboard = cv2.waitKey(1)
   if keyboard == ord('q') or keyboard == ord('Q'):
     break
 else:
   break

capture.release()
cv2.destroyAllWindows()

结果输出如下:

在OpenCV里使用Camshift算法的实现

比较远的照片

在OpenCV里使用Camshift算法的实现

比较近的照片

在OpenCV里使用Camshift算法的实现

来源:https://blog.csdn.net/caimouse/article/details/102731607

标签:OpenCV,Camshift
0
投稿

猜你喜欢

  • 一段压缩MS SQLServer日志的语句

    2024-01-14 23:42:07
  • SWFObject 2.1以上版本语法介绍

    2024-04-10 10:49:18
  • 实现 Python 脚本生成命令行

    2022-08-26 01:05:56
  • Python3+Pygame实现射击游戏完整代码

    2022-10-14 00:15:02
  • 深入C++ string.find()函数的用法总结

    2024-01-13 05:21:48
  • 面向对象的CSS

    2009-07-03 12:23:00
  • 老生常谈Python startswith()函数与endswith函数

    2023-06-03 02:02:42
  • golang获取网卡信息操作

    2024-02-22 01:57:17
  • python多项式拟合之np.polyfit 和 np.polyld详解

    2022-09-12 13:32:49
  • python实现批量修改图片格式和尺寸

    2021-02-12 10:47:35
  • Python趣味挑战之用pygame实现飞机塔防游戏

    2022-07-18 04:00:02
  • python中list*n生成多维数组与for循环生成多维数组的区别说明

    2022-01-10 08:57:33
  • python使用xlsx和pandas处理Excel表格的操作步骤

    2021-05-19 02:30:20
  • 简单了解python shutil模块原理及使用方法

    2023-02-12 22:07:44
  • 用CSS实现柱状图(Bar Graph)的方法(四)—table实现复杂柱状图

    2008-05-28 12:55:00
  • vue使用v-if v-show页面闪烁,div闪现的解决方法

    2024-04-28 09:31:49
  • JS实现页面打印(整体、局部)

    2024-04-26 17:14:27
  • SQLServer行转列实现思路记录

    2024-01-18 05:42:43
  • .NET中开源文档操作组件DocX的介绍与使用

    2024-06-05 09:28:18
  • Mysql更新自增主键id遇到的问题

    2024-01-17 23:56:02
  • asp之家 网络编程 m.aspxhome.com