1.首先需要导入我们所需要的包
import cv2 import numpy as np
2.然后就可以导入相关的视频了
cap = cv2.VideoCapture('红绿灯.mp4') # 读取视频 fps = cap.get(cv2.CAP_PROP_FPS) # 获取帧率
3.接下来就可以调整视频窗口大小
while cap.isOpened(): ret, frame = cap.read()
cv2.namedWindow("frame", 0) # 0可调大小,注意:窗口名必须imshow里面的一窗口名一致 cv2.resizeWindow("frame", 960, 540) # 设置长和宽
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将视频以灰度图展示 cv2.putText(gray, 'fps: ' + str(fps), (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) # 在展示窗口中显示帧率
4.然后就可以划定感兴趣区域
R = gray[452:454, 594:596]
Y = gray[446:448, 630:632]
G = gray[444:446, 672:674]
# 为划定的感兴趣区域赋予变量
sum_R = np.sum(R)
sum_Y = np.sum(Y)
sum_G = np.sum(G)
5.然后就可以进行判断
# 判断模块 if sum_R > 200: # 如果R中那四个像素点的灰度值之和大于200,则显示红灯 cv2.putText(frame, 'Red', (580, 400), 2, 2, (0, 0, 255), 3) cv2.putText(frame, 'Red', (1460, 650), 2, 2, (0, 0, 255), 3) cv2.putText(frame, 'Red', (1230, 670), 2, 2, (0, 0, 255), 3) # 用法 putText(选定的视频[或赋予其的变量], "要显示的文字", 字体[0为默认], 字体粗细程度, [颜色 BGR]( , , ,), 字体大小) elif sum_Y > 200: # 如果Y中那四个像素点的灰度值之和大于200,则显示黄灯 cv2.putText(frame, 'Yellow', (550, 410), 2, 2, (0, 255, 255), 3) cv2.putText(frame, 'Yellow', (1460, 650), 2, 2, (0, 255, 255), 3) cv2.putText(frame, 'Yellow', (1230, 670), 2, 2, (0, 255, 255), 3) elif sum_G > 200: # 如果G中那四个像素点的灰度值之和大于200,则显示绿灯 cv2.putText(frame, 'Green', (550, 410), 2, 2, (0, 255, 0), 3) cv2.putText(frame, 'Green', (1460, 650), 2, 2, (0, 255, 0), 3) cv2.putText(frame, 'Green', (1230, 670), 2, 2, (0, 255, 0), 3) else: # 如果都小于200,则显示等待 cv2.putText(frame, 'Wait', (550, 410), 2, 2, (255, 255, 255), 3) cv2.putText(frame, 'Wait', (1460, 650), 2, 2, (255, 255, 255), 3)
6.输出视频
cv2.imshow('frame', frame) # 显示原视频
# 按 'm' 退出 if cv2.waitKey(1) & 0xFF == ord('m'): break cap.release() # 释放 cv2.destroyAllWindows('ROIR') # 用来删除窗口的,()里不指定任何参数,则删除所有窗口,删除特定的窗口,往()输入特定的窗口值。
全代码如下:
import cv2 import numpy as np cap = cv2.VideoCapture('红绿灯.mp4') # 读取视频 fps = cap.get(cv2.CAP_PROP_FPS) # 获取帧率 while cap.isOpened(): ret, frame = cap.read()
cv2.namedWindow("frame", 0) # 0可调大小,注意:窗口名必须imshow里面的一窗口名一致 cv2.resizeWindow("frame", 960, 540) # 设置长和宽
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将视频以灰度图展示 cv2.putText(gray, 'fps: ' + str(fps), (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) # 在展示窗口中显示帧率
# 划定三个感兴趣区域分别为R, Y, G # ROI划定规则:图像矩阵名称[上 : 下, 左 : 右] R = gray[452:454, 594:596] Y = gray[446:448, 630:632] G = gray[444:446, 672:674] # 为划定的感兴趣区域赋予变量 sum_R = np.sum(R) sum_Y = np.sum(Y) sum_G = np.sum(G) # 判断模块 if sum_R > 200: # 如果R中那四个像素点的灰度值之和大于200,则显示红灯 cv2.putText(frame, 'Red', (580, 400), 2, 2, (0, 0, 255), 3) cv2.putText(frame, 'Red', (1460, 650), 2, 2, (0, 0, 255), 3) cv2.putText(frame, 'Red', (1230, 670), 2, 2, (0, 0, 255), 3) # 用法 putText(选定的视频[或赋予其的变量], "要显示的文字", 字体[0为默认], 字体粗细程度, [颜色 BGR]( , , ,), 字体大小) elif sum_Y > 200: # 如果Y中那四个像素点的灰度值之和大于200,则显示黄灯 cv2.putText(frame, 'Yellow', (550, 410), 2, 2, (0, 255, 255), 3) cv2.putText(frame, 'Yellow', (1460, 650), 2, 2, (0, 255, 255), 3) cv2.putText(frame, 'Yellow', (1230, 670), 2, 2, (0, 255, 255), 3) elif sum_G > 200: # 如果G中那四个像素点的灰度值之和大于200,则显示绿灯 cv2.putText(frame, 'Green', (550, 410), 2, 2, (0, 255, 0), 3) cv2.putText(frame, 'Green', (1460, 650), 2, 2, (0, 255, 0), 3) cv2.putText(frame, 'Green', (1230, 670), 2, 2, (0, 255, 0), 3) else: # 如果都小于200,则显示等待 cv2.putText(frame, 'Wait', (550, 410), 2, 2, (255, 255, 255), 3) cv2.putText(frame, 'Wait', (1460, 650), 2, 2, (255, 255, 255), 3)
cv2.imshow('frame', frame) # 显示原视频
# 按 'm' 退出 if cv2.waitKey(1) & 0xFF == ord('m'): break cap.release() # 释放 cv2.destroyAllWindows('ROIR') # 用来删除窗口的,()里不指定任何参数,则删除所有窗口,删除特定的窗口,往()输入特定的窗口值。
效果图如下: