在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 26 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
python队列Queue的详解
May 10 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python根据服务获取端口号的方法
Sep 25 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
基于python实现模拟数据结构模型
Jun 12 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
Python实现byte转integer
Jun 03 Python
Python时间操作之pytz模块使用详解
Jun 14 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&&mysql)四
2006/10/09 PHP
linux下 C语言对 php 扩展
2008/12/14 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
python实现查询IP地址所在地
2015/03/29 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
Python排序算法实例代码
2017/08/10 Python
对Python3 序列解包详解
2019/02/16 Python
python实现图书借阅系统
2019/02/20 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
python 如何将office文件转换为PDF
2020/09/22 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
工作会议欢迎词
2014/01/16 职场文书
电子商务实训报告总结
2014/11/05 职场文书
贷款承诺书
2015/01/20 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers