在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中append()与extend()用法分享
Mar 24 Python
浅谈Python中的数据类型
May 05 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
pandas删除指定行详解
Apr 04 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
Python安装whl文件过程图解
Feb 18 Python
Python的in,is和id函数代码实例
Apr 18 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
模仿OSO的论坛(五)
2006/10/09 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
form自动提交实例讲解
2017/07/10 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
浅析Ajax语法
2016/12/05 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
js实现随机抽奖
2020/03/19 Javascript
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python 如何展开嵌套的序列
2020/08/01 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
感恩老师演讲稿400字
2014/08/28 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
党员示范岗材料
2014/12/19 职场文书
教师年度个人总结
2015/02/11 职场文书
小爸爸观后感
2015/06/15 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js