用opencv自带的Haar做人脸检测生成成功但是调试一直中断
运行到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;
}