在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聊天室程序(基础版)
Apr 01 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python实现双色球随机选号
Jan 01 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
Django分组聚合查询实例分享
Apr 29 Python
python中可以声明变量类型吗
Jun 18 Python
Python如何使用vars返回对象的属性列表
Oct 17 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
python自动化测试之Selenium详解
Mar 13 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
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
javascript date格式化示例
2013/09/25 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
jQuery自定义多选下拉框效果
2017/06/19 jQuery
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vuex的简单使用教程
2018/02/02 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python进行TCP端口扫描的实现
2018/12/21 Python
python 为什么说eval要慎用
2019/03/26 Python
Python如何绘制日历图和热力图
2020/08/07 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
作风建设演讲稿
2014/05/23 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
2014年民政工作总结
2014/11/26 职场文书
聘任通知书
2015/09/21 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript