在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实现sublime3的less编译插件示例
Apr 27 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python实现读取json文件到excel表
Nov 18 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
python3实现多线程聊天室
Dec 12 Python
python移位运算的实现
Jul 15 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
基于python调用psutil模块过程解析
Dec 20 Python
如何使用python socket模块实现简单的文件下载
Sep 04 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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
php FPDF类库应用实现代码
2009/03/20 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
gearman的安装启动及python API使用实例
2014/07/08 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
pytorch forward两个参数实例
2020/01/17 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
新闻记者实习自我鉴定
2013/09/19 职场文书
春风化雨观后感
2015/06/11 职场文书
法律讲堂观后感
2015/06/11 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
java实现面板之间切换功能
2022/06/10 Java/Android