OpenCV4.1.2运行稠密光流代码触发cvtColor报错-215如何解决
报错根因
这个!_src.empty()报错是cv2.cvtColor接收的输入帧为空导致的,触发场景有两个:
- 初始化
VideoCapture时未能成功打开animal.avi文件,读取到的帧都是空值 - 视频读取到末尾后,
cap.read()返回的帧为空,代码没有做合法性校验直接传入了cvtColor处理
具体修复步骤
- 首先确认
animal.avi文件路径正确:如果在Colab环境运行,需先将视频文件上传到当前工作目录,或挂载Google Drive后填写文件的绝对路径 - 补充所有帧读取的合法性校验,读取失败时直接终止流程避免操作空帧
修复后完整代码
import cv2 import numpy as np from google.colab.patches import cv2_imshow # 打开视频文件 cap = cv2.VideoCapture("animal.avi") # 新增:判断视频是否成功打开 if not cap.isOpened(): print("视频文件打开失败,请检查路径是否正确") exit() # 读取第一帧并校验 ret, frame1 = cap.read() if not ret: print("第一帧读取失败,视频文件可能损坏") cap.release() exit() prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) hsv = np.zeros_like(frame1) hsv[...,1] = 255 while(1): ret, frame2 = cap.read() # 新增:读取到视频末尾直接跳出循环 if not ret: break next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY) flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0) mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) hsv[...,0] = ang*180/np.pi/2 hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) cv2_imshow(rgb) k = cv2.waitKey(30) & 0xff if k == 27: break elif k == ord('s'): cv2.imwrite('opticalfb.png',frame2) cv2.imwrite('opticalhsv.png',rgb) prvs = next cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者stefano
相关产品推荐
相关产品推荐

