当前位置: 首页 > news >正文

opencv python Meanshift 和 Camshift

Meanshift and Camshift

Meanshift

Meanshift 算法的基本原理简单,假设我们有一堆点,和一个小的圆形窗口,Meanshift 算法就是不断移动小圆形窗口,直到找到圆形区域内最大灰度密度处为止.

clipboard.png

初始窗口以蓝色圆圈显示,名称为“C1”,其原始中心标有蓝色矩形,名为“C1_o”.但是,这个窗口当中所有点的点集构成的质心在蓝色圆形点处,圆环的型心和质心并不重合,所以,移动蓝色的窗口以使型心与之前得到的质心重合.
不断执行上面的移动过程,直到型心和质心大致重合结束.
通常通过直方图反投影图像和初始目标位置,当物体移动时,移动反映在直方图反投影图像中,最后圆形的窗口会落到像素分布最大的地方,也就是图中的绿色圈并命名为C2.

meanshift in OpenCV

首先要设定目标,并计算的直方图,然后对这个直方图在每一帧当中进行反向投影.需要提供一个初试的窗口位置,计算HSV模型当中H(色调)的直方图,为了避免低亮度造成的影响,使用 cv2.inRange()将低亮度值忽略.

import numpy as np
import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture('test.mp4')
# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 50,200,50,100  # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
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)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
    ret ,frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply meanshift to get the new location
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        # Draw it on image
        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv2.polylines(frame,[pts],True, 255,2)
        cv2.imshow('img2',img2)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        else:
            cv2.imwrite(chr(k)+".jpg",img2)

    else:
        break

cv2.destroyAllWindows()
cap.release()

图片描述

图片描述

CamShift

在目标跟踪中,物体的大小不是固定的,所以设置的跟踪窗口也应该随之变化,CAMshift算法,首先使用meanshift算法找到目标,然后调整窗口大小,而且还会计算目标对象的的最佳外接圆的角度,并调整窗口,并使用调整后的窗口对物体继续追踪.

Camshift in OpenCV

它与meanshift几乎相同,但它返回一个旋转的矩形.

import numpy as np
import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture('test.mp4')
# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 50,200,50,100  # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
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)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
    ret ,frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply meanshift to get the new location
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        # Draw it on image
        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv2.polylines(frame,[pts],True, 255,2)
        cv2.imshow('img2',img2)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        else:
            cv2.imwrite(chr(k)+".jpg",img2)

    else:
        break

cv2.destroyAllWindows()
cap.release()

clipboard.png

clipboard.png

相关文章:

  • Scala基础
  • mysql进阶(七)数据库锁
  • caffe问题
  • HDU 6330--Visual Cube(构造,计算)
  • mysql 数据库修改名字
  • 设计模式-简单工厂、工厂方法模式、抽象工厂模式详解
  • 9种数据分析方法
  • 人群估值一般性算法
  • oracle获取过去两年的今天时间
  • SOFATracer 中 Disruptor 实践
  • C#抽象类与接口的区别【转】
  • 区块链时代的拜占庭容错:Tendermint(一)
  • 一致性算法Hash(Consistent Hashing)
  • Java 多线程
  • 微信小程序登录JAVA后台
  • bearychat的java client
  • CSS实用技巧
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JAVA之继承和多态
  • MySQL主从复制读写分离及奇怪的问题
  • Spring声明式事务管理之一:五大属性分析
  • 搞机器学习要哪些技能
  • 前嗅ForeSpider中数据浏览界面介绍
  • 移动端唤起键盘时取消position:fixed定位
  • 追踪解析 FutureTask 源码
  • Prometheus VS InfluxDB
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #Lua:Lua调用C++生成的DLL库
  • #QT项目实战(天气预报)
  • #Z0458. 树的中心2
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (02)Hive SQL编译成MapReduce任务的过程
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (区间dp) (经典例题) 石子合并
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Unity3DUnity3D在android下调试
  • .bat批处理(六):替换字符串中匹配的子串
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 发展历程
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net和jar包windows服务部署
  • .so文件(linux系统)
  • ::什么意思
  • @Mapper作用