在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实用日期时间处理方法汇总
May 09 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
Python实现简单的四则运算计算器
Nov 02 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
机器学习python实战之决策树
Nov 01 Python
Python3中的bytes和str类型详解
May 02 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python ChainMap的使用和说明详解
Jun 11 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
关于tf.reverse_sequence()简述
Jan 20 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/01 无线电
PHP 5.3.0 安装分析心得
2009/08/07 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
js实现数字每三位加逗号的方法
2015/02/05 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
javascript制作2048游戏
2015/03/30 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python奇偶行分开存储实现代码
2018/03/19 Python
python迭代dict的key和value的方法
2018/07/06 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
python与mysql数据库交互的实现
2020/01/06 Python
django 模版关闭转义方式
2020/05/14 Python
Python网页解析器使用实例详解
2020/05/30 Python
python如何对链表操作
2020/10/10 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
普天C++笔试题
2016/03/20 面试题
struct与class的区别
2014/02/03 面试题
学生党员思想汇报
2013/12/28 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
军训学生自我鉴定
2014/02/12 职场文书
退学证明范本3篇
2014/10/29 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
运动员代表致辞
2015/07/29 职场文书
Java获取字符串编码格式实现思路
2022/09/23 Java/Android