如何用Python保存摄像头采集的Canny边缘检测视频?
实现Canny边缘检测视频的保存(基于OpenCV)
要保存Canny边缘检测后的视频,你需要在代码中添加视频写入器初始化和帧写入的逻辑,具体步骤和修改后的代码如下:
需要添加的核心部分
- 初始化
cv2.VideoWriter对象,指定输出路径、编码器、帧率和分辨率 - 在循环中将Canny处理后的灰度帧转换为视频编码器支持的格式(通常为三通道BGR)
- 循环结束后释放视频写入器
修改后的完整代码
import cv2 import numpy as np cap = cv2.VideoCapture(0) # 获取摄像头的分辨率 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 设置视频参数:输出路径、编码器、帧率、分辨率 # 保存为MP4格式用'MP4V',AVI格式用'XVID' fourcc = cv2.VideoWriter_fourcc(*'MP4V') # 注意:Canny输出的是单通道灰度图,需转成三通道BGR才能被多数编码器支持 out = cv2.VideoWriter('canny_edges_output.mp4', fourcc, 20.0, (frame_width, frame_height)) # loop runs if capturing has been initialized while 1: ret, frame = cap.read() if not ret: break # 读取失败则退出循环 # converting BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of red color in HSV lower_red = np.array([5,50,50]) upper_red = np.array([15,255,255]) # create a red HSV colour boundary and # threshold HSV image mask = cv2.inRange(hsv, lower_red, upper_red) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame,frame, mask= mask) # Display an original image cv2.imshow('Original',frame) # finds edges in the input image image and # marks them in the output map edges edges = cv2.Canny(frame,100,200) # 将单通道灰度图转为三通道BGR,适配视频编码器 edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) # 写入处理后的帧到视频文件 out.write(edges_bgr) # Display edges in a frame cv2.imshow('Edges',edges) # Wait for Esc key to stop k = cv2.waitKey(5) & 0xFF if k == 27: break # 释放资源 cap.release() out.release() # 必须释放视频写入器 cv2.destroyAllWindows()
关键说明
- 编码器选择:如果要保存为AVI格式,将
fourcc = cv2.VideoWriter_fourcc(*'MP4V')改为fourcc = cv2.VideoWriter_fourcc(*'XVID'),同时修改输出文件名为canny_edges_output.avi - 帧率设置:代码中用20.0,你可以根据摄像头实际帧率调整(可用
cap.get(cv2.CAP_PROP_FPS)获取) - 异常处理:添加了
if not ret: break来处理摄像头读取失败的情况,避免程序崩溃
内容的提问来源于stack exchange,提问作者Jed
相关产品推荐
相关产品推荐

