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() 对图像中的特征点进行跟踪
相关推荐
学测绘的小杨9 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz31016 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐16 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱2 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理