在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实现钉钉发送报警消息的方法
Feb 20 Python
Python实现打砖块小游戏代码实例
May 18 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
python 动态迁移solr数据过程解析
Sep 04 Python
浅谈Python type的使用
Nov 19 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
python学习笔记之多进程
Aug 06 Python
PYTHON InceptionV3模型的复现详解
May 06 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
举例说明类变量和实例变量的区别
2016/06/30 面试题
工程造价自荐信
2013/10/09 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
销售经理竞聘书
2014/03/31 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
Golang解析JSON对象
2022/04/30 Golang