OpenCV运动显著性检测报错求助:Unknown C++ exception from OpenCV code
运动显著性检测报错修复与视频保存方案
核心报错修复
cv2.saliency.MotionSaliencyBinWangApr2014类创建实例后,必须先调用init()方法完成初始化,且要传入目标灰度图的宽高参数。原代码跳过了这一步,直接调用computeSaliency会触发OpenCV底层C++异常。
代码中的其他问题
- 缺失视频帧读取校验:当视频读取到末尾或文件路径错误时,
success会返回False,此时frame为None,后续执行cv2.cvtColor会直接报错。 - 未初始化视频写入对象:原代码仅定义了编码格式和帧率,但未创建
cv2.VideoWriter实例,无法保存处理后的显著性视频。 - 播放速度不匹配:
waitKey(1)会导致视频播放速度远快于原视频,应根据原视频帧率计算等待时长,保证播放速度正常。
修正后的完整代码(含视频保存)
import cv2 # 初始化视频读取 vid = cv2.VideoCapture('vids/test.mp4') if not vid.isOpened(): print("无法打开视频文件") exit() # 获取视频基本参数 fps = vid.get(cv2.CAP_PROP_FPS) width = int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 初始化运动显著性检测器并完成初始化 saliency = cv2.saliency.MotionSaliencyBinWangApr2014_create() saliency.init(width, height) # 初始化视频写入对象(保存显著性图视频) fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output_saliency.mp4', fourcc, fps, (width, height), isColor=False) while True: success, frame = vid.read() if not success: break # 读取完毕或出错,退出循环 # 转为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 计算显著性图 ret, img_sal = saliency.computeSaliency(gray) # 转换为8位灰度图格式 saliencyMap = (img_sal * 255).astype('uint8') # 显示结果 cv2.imshow('Saliency Map', saliencyMap) # 写入视频文件 out.write(saliencyMap) # 按q退出,等待时长匹配原视频帧率 key = cv2.waitKey(int(1000/fps)) & 0xFF if key == ord("q"): break # 释放资源 cv2.destroyAllWindows() vid.release() out.release()
关键说明
- 新增视频文件打开校验,避免路径错误导致的后续异常。
- 先读取视频尺寸后初始化显著性检测器,解决核心报错。
- 创建
VideoWriter时指定isColor=False,因为显著性图是单通道灰度图。 - 调整
waitKey参数,保证播放速度与原视频一致。
内容的提问来源于stack exchange,提问作者user2381342
相关产品推荐
相关产品推荐

