Python-OpenCV中的图像处理-视频分析

Python-OpenCV中的图像处理-视频分析

视频分析

学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象:

Meanshift算法

Meanshift 算法的基本原理是和很简单的。假设我们有一堆点(比如直方

图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗

口移动到最大灰度密度处(或者是点最多的地方)。如下图所示:

初始窗口是蓝色的"C1",它的圆心为蓝色方框"C1_o",而窗口中所有点质心却是"C1_r"(小的蓝色圆圈),很明显圆心和点的质心没有重合。所以移动圆心 C1_o 到质心 C1_r,这样我们就得到了一个新的窗口。这时又可以找到新窗口内所有点的质心,大多数情况下还是不重合的,所以重复上面的操作:将新窗口的中心移动到新的质心。就这样不停的迭代操作直到窗口的中心和其所包含点的质心重合为止(或者有一点小误差)。按照这样的操作我们的窗口最终会落在像素值(和)最大的地方。如上图所示"C2"是窗口的最后位址,我们可以看出来这个窗口中的像素点最多。

要在 OpenCV 中使用 Meanshift 算法首先我们要对目标对象进行设置,

计算目标对象的直方图,这样在执行 meanshift 算法时我们就可以将目标对

象反向投影到每一帧中去了。另外我们还需要提供窗口的起始位置。在这里我

们值计算 H( Hue)通道的直方图,同样为了避免低亮度造成的影响,我们使

用函数 cv2.inRange() 将低亮度的值忽略掉。

python 复制代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 视频下载地址https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4
cap = cv2.VideoCapture('./resource/opencv/video/slow_traffic_small.mp4')

ret,frame = cap.read()

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

# set up the ROI for tracking
roi = frame[y:y+h, x:x+w]

hsv_roi = cv2.cvtColor(frame, 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)

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)

        ret, track_window = cv2.meanShift(dst, track_window, term_crit)

        x,y,w,h = track_window
        img2 = cv2.rectangle(frame, (x,y), (x+w, y+h), 255, 2)

        k = cv2.waitKey(60)&0xFF
        if k == 27:
            break
        else:
            cv2.imshow('img', img2)
    else:
        break

cap.release()
cv2.destroyAllWindows()


Camshift算法

与 Meanshift 基本一样,但是返回的结果是一个带旋转角度的矩形以及这个矩形的参数(被用到下一次迭代过程中)。

python 复制代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 视频下载地址https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4
cap = cv2.VideoCapture('./resource/opencv/video/slow_traffic_small.mp4')

# take first frame of the video
ret, frame = cap.read()

# setup initial location of window
x, y, w, h = 300, 200, 100, 50 # simply hardcoded the values
track_window = (x, y, w, h)
# set up the ROI for tracking
roi = frame[y:y+h, x:x+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 at least 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 camshift 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)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
        else:
            cv2.imshow('img2',img2)
    else:
        cap.release()
        cv2.destroyAllWindows()


光流

  • 光流的概念以及 Lucas-Kanade 光流法
  • 函数 cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪
相关推荐
天才测试猿6 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
张小凡vip7 小时前
python--爬虫--成熟的爬虫框架Scrapy
爬虫·python·scrapy
Pluchon7 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
不瘦80斤不改名8 小时前
01-vibe-coding-起源与本质
人工智能·python
夜雪一千8 小时前
如何对新闻数据进行模糊去重
python
oyguyteggytrrwwwrt10 小时前
3dgs渲染部分详细注释
python
天天爱吃肉821812 小时前
【重磅发布:拿下新超仁达代理权 】
大数据·人工智能·python·功能测试·汽车
神王宝宝 王者小学12 小时前
面向领域驱动架构的查询实现方式
前端·python·架构
ningmengjing_13 小时前
Redis 从入门到实战:Python操作全攻略
数据库·redis·python
️学习的小王13 小时前
智能文档助手:基于RAG的本地化文档问答系统实战指南
人工智能·python·机器学习