个体户做盈利网站,网站设计案例欣赏,许昌优化公司,wordpress会员充值管理系统Python-OpenCV中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流 视频分析
学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象:
Meanshift算法
Meanshift 算法的基本原理是和很简单的。假设我们有一堆点#xff08;比如直方 图反向投影得到的点比如直方 图反向投影得到的点和一个小的圆形窗口我们要完成的任务就是将这个窗 口移动到最大灰度密度处或者是点最多的地方。如下图所示 初始窗口是蓝色的“C1”它的圆心为蓝色方框“C1_o”而窗口中所有点质心却是“C1_r”(小的蓝色圆圈)很明显圆心和点的质心没有重合。所以移动圆心 C1_o 到质心 C1_r这样我们就得到了一个新的窗口。这时又可以找到新窗口内所有点的质心大多数情况下还是不重合的所以重复上面的操作将新窗口的中心移动到新的质心。就这样不停的迭代操作直到窗口的中心和其所包含点的质心重合为止或者有一点小误差。按照这样的操作我们的窗口最终会落在像素值和最大的地方。如上图所示“C2”是窗口的最后位址我们可以看出来这个窗口中的像素点最多。 要在 OpenCV 中使用 Meanshift 算法首先我们要对目标对象进行设置 计算目标对象的直方图这样在执行 meanshift 算法时我们就可以将目标对 象反向投影到每一帧中去了。另外我们还需要提供窗口的起始位置。在这里我 们值计算 H Hue通道的直方图同样为了避免低亮度造成的影响我们使 用函数 cv2.inRange() 将低亮度的值忽略掉。
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:yh, x:xw]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_windowimg2 cv2.rectangle(frame, (x,y), (xw, yh), 255, 2)k cv2.waitKey(60)0xFFif k 27:breakelse:cv2.imshow(img, img2)else:breakcap.release()
cv2.destroyAllWindows()Camshift算法
与 Meanshift 基本一样但是返回的结果是一个带旋转角度的矩形以及这个矩形的参数被用到下一次迭代过程中。
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:yh, x:xw]
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 locationret, track_window cv2.CamShift(dst, track_window, term_crit)# Draw it on imagepts cv2.boxPoints(ret)pts np.int0(pts)img2 cv2.polylines(frame,[pts],True, 255,2)k cv2.waitKey(30) 0xffif k 27:breakelse:cv2.imshow(img2,img2)else:cap.release()cv2.destroyAllWindows()光流
光流的概念以及 Lucas-Kanade 光流法函数 cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪