在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开发之list操作实例分析
Feb 22 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
Python3 pandas 操作列表实例详解
Sep 23 Python
Python列表切片常用操作实例解析
Dec 16 Python
python操作gitlab API过程解析
Dec 27 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
python中rc1什么意思
Jun 19 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
PHP引用返回用法示例
2016/05/28 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
Python 列表list使用介绍
2014/11/30 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python生成特定分布数的实例
2019/12/05 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
python实现拼接图片
2020/03/23 Python
Python 多进程原理及实现
2020/12/21 Python
python如何调用php文件中的函数详解
2020/12/29 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
几个常见的软件测试问题
2016/09/07 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
学习十八大报告感言
2014/02/04 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
投标保密承诺书
2014/05/19 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis