用opencv自带的Haar做人脸检测生成成功但是调试一直中断

omqapntc 2015-09-14 05:29:30
运行到CvHaarClassifierCascade *pHaarCascade =(CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName,0,0,0);这一步的时候提示:0x74f3812f (KernelBase.dll) 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0022f184 处的 cv::Exception。
网上看了看解决方法没有完全理解,折腾一圈还是不行,Haar用不起来呢,求大神指点迷津。
总体程序如下:

#include "cv.h"
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>



using namespace std;
using namespace cv;
int main()
{
// 加载Haar特征检测分类器
//haarcascade_frontalface_alt.xml系OpenCV自带的分类器
const char *pstrCascadeFileName = "haarcascade_frontalface_alt2.xml";
CvHaarClassifierCascade *pHaarCascade =(CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName,0,0,0);


// 载入图像
double sacle =1.2;
const char *pstrImageName = "qq.jpg";
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);

IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
IplImage *small_img = cvCreateImage(cvSize(cvRound(pSrcImage->width/sacle),cvRound(pSrcImage->height/sacle)), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
cvResize(pGrayImage,small_img,CV_INTER_LINEAR);
cvEqualizeHist(small_img,small_img);

// 人脸识别与标记
if (pHaarCascade != NULL)
{
CvScalar FaceCirclecolors[] =
{
{{0, 0, 255}},
{{0, 128, 255}},
{{0, 255, 255}},
{{0, 255, 0}},
{{255, 128, 0}},
{{255, 255, 0}},
{{255, 0, 0}},
{{255, 0, 255}}
};

CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 识别
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(small_img, pHaarCascade, pcvMStorage,1.1,2,0/*CV_HAAR_DOCANNY_PRUNING*/,cvSize(30,30));
dwTimeEnd = GetTickCount();

printf("人脸个数: %d 识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);

// 标记
for(int i = 0; i <pcvSeqFaces->total; i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width * 0.5));
center.y = cvRound((r->y + r->height * 0.5));
radius = cvRound((r->width + r->height) * 0.25);
cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage);
}

const char *pstrWindowsTitle = "人脸识别 ";
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle, pSrcImage);

cvWaitKey(0);

cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
return 0;
}
...全文
530 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
songyimin1208 2015-11-22
  • 打赏
  • 举报
回复
分类器有问题
赵4老师 2015-09-17
  • 打赏
  • 举报
回复
对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
omqapntc 2015-09-16
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
OpenCV是开源的。你不懂某个函数,可以单步跟踪到函数实现的源代码中去一探究竟。
嗯 它应该是加载分类器用的 可以为什么换成)cvLoad就加载不了了呢
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
OpenCV是开源的。你不懂某个函数,可以单步跟踪到函数实现的源代码中去一探究竟。
omqapntc 2015-09-16
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
谢谢 还想请问您一下 opencv自带例子里面这样一段代码什么意思呢 我发现把它去掉就不会检测了 for( int i = 1; i < argc; i++ ) { cout << "Processing " << i << " " << argv[i] << endl; if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 ) { cascadeName.assign( argv[i] + cascadeOptLen ); cout << " from which we have cascadeName= " << cascadeName << endl; } else if( nestedCascadeOpt.compare( 0, nestedCascadeOptLen, argv[i], nestedCascadeOptLen ) == 0 ) { if( argv[i][nestedCascadeOpt.length()] == '=' ) nestedCascadeName.assign( argv[i] + nestedCascadeOpt.length() + 1 ); if( !nestedCascade.load( nestedCascadeName ) ) cerr << "WARNING: Could not load classifier cascade for nested objects" << endl; } else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 ) { if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale < 1 ) scale = 1; cout << " from which we read scale = " << scale << endl; } else if( tryFlipOpt.compare( 0, tryFlipOptLen, argv[i], tryFlipOptLen ) == 0 ) { tryflip = true; cout << " will try to flip image horizontally to detect assymetric objects\n"; } else if( argv[i][0] == '-' ) { cerr << "WARNING: Unknown option %s" << argv[i] << endl; } else inputName.assign( argv[i] ); } if( !cascade.load( cascadeName ) ) { cerr << "ERROR: Could not load classifier cascade" << endl; return -1; }
赵4老师 2015-09-15
  • 打赏
  • 举报
回复
引用 3 楼 omqapntc 的回复:
引用 1 楼 zhao4zhong1 的回复:
建议楼主先编译链接调试OpenCV自带的相关例子代码。
我试过那本学习opencv里面关于检测人脸的代码了一样的错误诶 不知道为什么
“学习OpenCV书中的代码”和“OpenCV自带的相关例子代码”不是一回事!
omqapntc 2015-09-15
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
引用 3 楼 omqapntc 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 建议楼主先编译链接调试OpenCV自带的相关例子代码。
我试过那本学习opencv里面关于检测人脸的代码了一样的错误诶 不知道为什么
“学习OpenCV书中的代码”和“OpenCV自带的相关例子代码”不是一回事![/quote]嗯 我也试了Opencv自带的程序运行是没有问题的 没有错误 但就是这个有问题 不知是为什么
omqapntc 2015-09-14
  • 打赏
  • 举报
回复
引用 2 楼 CharlesSimonyi 的回复:
try catch 捕获该cv::Exception异常并输出该异常的相关信息,看看究竟是什么错误
能具体告诉我怎么做吗 我是小白 不太会操作 谢谢啦
omqapntc 2015-09-14
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
建议楼主先编译链接调试OpenCV自带的相关例子代码。
我试过那本学习opencv里面关于检测人脸的代码了一样的错误诶 不知道为什么
encoderlee 2015-09-14
  • 打赏
  • 举报
回复
try catch 捕获该cv::Exception异常并输出该异常的相关信息,看看究竟是什么错误
赵4老师 2015-09-14
  • 打赏
  • 举报
回复
建议楼主先编译链接调试OpenCV自带的相关例子代码。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧