在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中turtle作图示例
Nov 15 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
python实现扫描ip地址的小程序
Apr 16 Python
python批量下载抖音视频
Jun 17 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 Python
Python类如何定义私有变量
Feb 03 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
浅谈python 类方法/静态方法
Sep 18 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
深入分析php之面向对象
2013/05/15 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python类的继承和多态代码详解
2017/12/27 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
Tesserocr库的正确安装方式
2018/10/19 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Python中的__init__作用是什么
2020/06/09 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
模特职业生涯规划范文
2014/02/26 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
解放思想演讲稿
2014/09/11 职场文书
营销总监岗位职责
2014/09/16 职场文书
技术入股协议书
2016/03/22 职场文书
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python