OpenCV人脸检测触发CascadeClassifier::detectMultiScale断言失败如何解决?
报错含义
Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale错误本质是你初始化的CascadeClassifier级联分类器对象为空,调用检测接口时触发了OpenCV的内部断言校验,直接导致程序崩溃,说明你的分类器文件根本没有加载成功。
解决方案
- 第一,修正级联分类器的文件路径
你当前代码里写的路径是错误的:
// 错误路径 faceCascade.load("C:/ComputerVision/opencv/build/etc/haarcascades_frontalface_alt.xml");
OpenCV自带的人脸检测级联分类器存放在haarcascades文件夹下,正确路径应该是:
// 修正后的路径,注意中间多了一层haarcascades目录,文件名前缀是haarcascade没有末尾的s faceCascade.load("C:/ComputerVision/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
- 第二,增加分类器加载结果校验,避免无意义的后续崩溃
在load语句后增加判断逻辑,加载失败直接给出提示并退出:
cv::CascadeClassifier faceCascade; if (!faceCascade.load("你的分类器文件完整路径")) { std::cout << "级联分类器加载失败,请确认文件路径是否正确" << std::endl; return -1; }
- 第三,修正视频流读取的冗余代码
你当前的循环逻辑里重复读取了视频帧,会导致一半的帧被丢弃:
while (video.read(frame)) // 这里已经读了一帧存入frame { video >> frame; // 这里又读了一帧,上一帧直接被覆盖,属于冗余代码,删掉即可 // 其余逻辑 }
删掉video >> frame;这行即可。
验证步骤
做完以上修改后先运行程序,看控制台是否会打印分类器加载失败的提示,如果没有提示,就可以正常看到带人脸框的视频流了。
内容的提问来源于stack exchange,提问作者user16449543
相关产品推荐
相关产品推荐

