运行OpenCV Lucas Kanade光流代码出现Assertion Failed报错如何解决
OpenCV Lucas-Kanade光流calc断言报错解决方案
报错信息:error: OpenCV(4.1.2) /io/opencv/modules/video/src/lkpyramid.cpp:1250: error: (-215:Assertion failed) (npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function 'calc'
该报错核心原因为传入cv.calcOpticalFlowPyrLK()的前序特征点参数prevPts不符合接口要求,可按以下步骤逐一排查修复:
- 校验特征点检测返回结果,避免传入空数组
goodFeaturesToTrack在当前帧无符合阈值的角点时会返回空值,需提前加判断逻辑拦截:
corners = cv.goodFeaturesToTrack(old_gray, mask=None, **feature_params) if corners is None or len(corners) == 0: # 无有效角点时跳过当前帧或调低检测阈值重试 continue
- 保留特征点的维度结构,不要修改默认返回的三维格式
goodFeaturesToTrack默认返回维度为(N,1,2)的数组,转换float32时不要随意降维,保留原始结构即可:
# 正确写法,保留(N,1,2)维度 prevPts = corners.astype(np.float32) # 错误写法,降维到(N,2)会触发格式校验失败 # prevPts = corners.reshape(-1,2).astype(np.float32)
- 校验输入帧格式合法性
光流计算要求输入前后帧均为单通道灰度图,避免直接传入三通道BGR图:
old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY) new_gray = cv.cvtColor(new_frame, cv.COLOR_BGR2GRAY)
- 调整角点检测阈值,保证能获取有效特征点
若频繁出现空角点返回,调低goodFeaturesToTrack的qualityLevel参数(如从0.3调整到0.1),缩小minDistance参数,提升角点检出数量。 - 校验帧读取有效性
如果是从视频文件/摄像头读取帧数据,先判断读取返回状态,避免拿空帧跑特征检测:
ret, frame = cap.read() if not ret: break
内容的提问来源于stack exchange,提问作者Anshuman Srivastava
相关产品推荐
相关产品推荐

