在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使用urllib2模块获取gravatar头像实例
Dec 18 Python
python连接mysql调用存储过程示例
Mar 05 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
python去除文件中空格、Tab及回车的方法
Apr 12 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
pycharm配置git(图文教程)
Aug 16 Python
Python读取yaml文件的详细教程
Jul 21 Python
pandas 实现将NaN转换为None
May 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
实用函数3
2007/11/08 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物