在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中使用异步Socket编程性能测试
Jun 25 Python
Python重新引入被覆盖的自带function
Jul 16 Python
python爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 Python
python妹子图简单爬虫实例
Jul 07 Python
Unicode和Python的中文处理
Mar 19 Python
python实现二叉树的遍历
Dec 11 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
python异常处理try except过程解析
Feb 03 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
python实现AdaBoost算法的示例
Oct 03 Python
python实现文件分片上传的接口自动化
Nov 19 Python
python绘制箱型图
Apr 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
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
vue组件学习教程
2017/09/09 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
vue.js响应式原理解析与实现
2020/06/22 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python 调用HBase的简单实例
2016/12/18 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
民生工程实施方案
2014/03/22 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
如何写好自荐信
2014/04/07 职场文书
合作协议书范本
2014/04/17 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2016公务员年度考核评语
2015/12/01 职场文书