文章目录
- 一、项目思路
- 二、算法详解
- 2.1、计算两个数组或数组与标量之间的每个元素的绝对差。
- 2.2、轮廓检测 + 绘制物体轮廓 + 绘制矩阵轮廓
- 2.3、连续窗口显示
- 2.4、读取视频,显示视频,保存视频
- 三、项目实战:实时动态目标检测
实时动态目标检测
一、项目思路
1、获取视频、读取帧图像
2、计算连续两张图像的像素绝对差获取动态目标
3、图像预处理:灰度图、高斯模糊、二值化、膨胀
4、轮廓检测、绘制矩阵轮廓、绘制物体轮廓
5、分别实时显示矩阵轮廓、物体轮廓
python进阶——人工智能实时目标跟踪
二、算法详解
2.1、计算两个数组或数组与标量之间的每个元素的绝对差。
函数说明:cv2.absdiff(src1,src2)输入参数: src1:第一个输入数组或标量 src2:第二个输入数组或标量2.2、轮廓检测 + 绘制物体轮廓 + 绘制矩阵轮廓
####################################################################### (1)轮廓检测:contours, hierarchy = cv2.findContours(img, mode, method)# 输入参数 mode: 轮廓检索模式# (1)RETR_EXTERNAL: 只检索最外面的轮廓;# (2)RETR_LIST: 检索所有的轮廓,但检测的轮廓不建立等级关系,将其保存到一条链表当中,# (3)RETR_CCOMP: 检索所有的轮廓,并建立两个等级的轮廓。顶层是各部分的外部边界,内层是的边界信息;# (4)RETR_TREE: 检索所有的轮廓,并建立一个等级树结构的轮廓;(最常用)# method: 轮廓逼近方法# (1)CHAIN_APPROX_NONE: 存储所有的轮廓点,相邻的两个点的像素位置差不超过1。 例如:矩阵的四条边。(最常用)# (2)CHAIN_APPROX_SIMPLE: 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标。 例如:矩形的4个轮廓点。# 输出参数 contours:所有的轮廓# hierarchy:每条轮廓对应的属性# 备注0:轮廓就是将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。# 备注1:函数输入图像是二值图,即黑白的(不是灰度图)。所以读取的图像要先转成灰度的,再转成二值图。# 备注2:函数在opencv2只返回两个值:contours, hierarchy。# 备注3:函数在opencv3会返回三个值:img, countours, hierarchy####################################################################### (2)绘制轮廓:v2.drawContours(image, contours, contourIdx, color, thickness) ———— (在图像上)画出图像的轮廓# 输入参数 image: 需要绘制轮廓的目标图像,注意会改变原图# contours: 轮廓点,上述函数cv2.findContours()的第一个返回值# contourIdx: 轮廓的索引,表示绘制第几个轮廓。-1表示绘制所有的轮廓# color: 绘制轮廓的颜色(RGB)# thickness: (可选参数)轮廓线的宽度,-1表示填充# 备注:图像需要先复制一份copy(), 否则(赋值操作的图像)与原图会随之一起改变。####################################################################### (3)绘制矩形边框:cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness)# (x, y): 矩形定点# (x+w, y+h): 矩形的宽高# color: 矩形的边框颜色(0, 255, 0)# thickness: 矩形边框宽度######################################################################2.3、连续窗口显示
# 显示图像:cv2.imshow(window_title, img)# 输入参数 window_title: 自定义窗口的名字# img: 待显示图像# 备注1:窗口会自适应图像大小# 备注2:指定多个窗口名称,可以显示多幅图像# 备注3:显示多幅图像的时候,若cv2.imshow()指定相同的窗口名,这样后面显示的图像会覆盖前面的图像,从而只产生一个(连续)窗口。2.4、读取视频,显示视频,保存视频
OpenCV—读取视频,显示视频,保存视频
三、项目实战:实时动态目标检测
importcv2# (1)参数设置Pixel_points=500# 像素点数(只检测大于该值的目标,小于该值的目标自动忽略)video_path=r'C:\Users\my\Videos\car.mov'# 视频存放地址(路径中不能有中文,将导致读取失败。)if__name__=='__main__':# (2)读取视频cap=cv2.VideoCapture(video_path)# 读取视频流_,frame1=cap.read()# 读取第一帧_,frame2=cap.read()# 读取第二帧whilecap.isOpened():# 检测视频是否可以打开# (3)图像预处理diff=cv2.absdiff(frame1,frame2)# 计算两张图像之间的每个像素的绝对差gray=cv2.cvtColor(diff,cv2.COLOR_BGR2GRAY)# 灰度图blur=cv2.GaussianBlur(gray,(5,5),0)# 高斯滤波_,thresh=cv2.threshold(blur,20,255,cv2.THRESH_BINARY)# 二值化mask=cv2.dilate(thresh,None,iterations=3)# 膨胀操作contours,_=cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 轮廓检测# (4)轮廓检测forcontourincontours:(x,y,w,h)=cv2.boundingRect(contour)# 获取矩阵轮廓的宽和高ifcv2.contourArea(contour)<Pixel_points:# 判断检测得到的矩形轮廓,体积是否满足大小设置continuecv2.rectangle(frame1,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,0,255),thickness=10)# 绘制矩形轮廓# cv2.drawContours(frame1, contours, -1, (0, 255, 0), 2) # 绘制物体轮廓# (5)绘图cv2.imshow('frame',frame1)# 实时显示轮廓图Frame# cv2.imshow('mask', mask) # 实时显示掩膜图MASKframe1=frame2# 保存当前帧(循环-计算最近的两帧图像的像素差)ret,frame2=cap.read()# 读取下一帧(循环-计算最近的两帧图像的像素差)# (6)如果读到的帧数不为空,则继续读取;如果为空,则退出。ifframe2isNone:break# (7)使用 waitKey 可以控制视频的播放速度。数值越小,播放速度越快。ifcv2.waitKey(50)==ord(' '):# ord(' '): 按空格结束breakcap.release()# 释放摄像头cv2.destroyAllWindows()# 摧毁所有图窗