在OpenCV里使用Camshift算法的实现
作者:caimouse 时间:2023-01-24 20:46:40
前面学习过Meanshift算法,在观察这个结果标记时,会发现有这样一个问题,如下图:
汽车比较远时,用一个很小的窗口就可以把它框住,这是符合近大远小的投影原理,当比较近的时候如下:
相同大小的窗口已经不能包围它了,那么这样跟踪目标对象就成为了一个问题,怎么样来更改它呢?那么就是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()
结果输出如下:
比较远的照片
比较近的照片
来源:https://blog.csdn.net/caimouse/article/details/102731607
标签:OpenCV,Camshift


猜你喜欢
一段压缩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
