在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 相关文章推荐
python批量修改文件名的实现代码
Sep 01 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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
基于mysql的bbs设计(三)
2006/10/09 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
微信小程序-API接口安全详解
2019/07/16 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
从django的中间件直接返回请求的方法
2018/05/30 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
学生档案自我鉴定
2013/10/07 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
科研课题实施方案
2014/03/18 职场文书
国际贸易系求职信
2014/08/09 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
大班上学期个人总结
2015/02/13 职场文书
自主招生专家推荐信
2015/03/26 职场文书
学生检讨书怎么写
2015/05/07 职场文书
天河观后感
2015/06/11 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
2019个人工作总结
2019/06/21 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server