You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:55:17