在OpenCV里使用Camshift算法的实现


Posted in Python onNovember 22, 2019

前面学习过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算法的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python代码过长的换行方法
Jul 19 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
Python数据可视化之画图
Jan 15 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
Python 如何安装Selenium
May 06 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 #Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 #Python
python快速排序的实现及运行时间比较
Nov 22 #Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 #Python
Python Celery多队列配置代码实例
Nov 22 #Python
python 协程 gevent原理与用法分析
Nov 22 #Python
python 并发下载器实现方法示例
Nov 22 #Python
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
对laravel in 查询的使用方法详解
2019/10/09 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
Python+Opencv识别两张相似图片
2020/03/23 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python线程中同步锁详解
2018/04/27 Python
python的concat等多种用法详解
2018/11/28 Python
Python 支持向量机分类器的实现
2020/01/15 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
经济与贸易专业应届生求职信
2013/11/19 职场文书
高中体育教学反思
2014/01/24 职场文书
抽样调查项目计划书
2014/04/24 职场文书
会员卡清退活动总结
2014/08/27 职场文书
安全教育的主题班会
2015/08/13 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Python办公自动化解决world文件批量转换
2021/09/15 Python