0
Eclipse에서 opencv2를 사용하여 얼굴을 감지하려고합니다. 나는 이미에서 "haarcascade_frontalface_alt.xml"을 추가 한opencv와 eclipse를 사용하여 facedetect 프로그램에서 'CvHaarClassifierCascade *'사용
#include <cv.h>
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/core/core.hpp"
#include"opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade);
String face_cascade_name = "src/haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade* cascade;
int main(int argc, const char* argv[])
{
CvCapture* capture =0;
capture = cvCaptureFromCAM(0);
IplImage* inputImg=0;
if(!cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
while(true)
{
inputImg = cvQueryFrame(capture);
if(!inputImg) break;
namedWindow("My_capture",CV_WINDOW_AUTOSIZE);
CvRect outputImg;
outputImg = detectFaceInImage(inputImg, cascade);
}
return 0;
}
// Perform face detection on the input image, using the given Haar Cascade.
// Returns a rectangle for the detected region in the given image.
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
{
// Smallest face size.
CvSize minFeatureSize = cvSize(20, 20);
// Only search for 1 face.
int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
// How detailed should the search be.
float search_scale_factor = 1.1f;
IplImage *detectImg;
IplImage *greyImg = 0;
CvMemStorage* storage;
CvRect rc;
double t;
CvSeq* rects;
CvSize size;
int ms, nFaces;
storage = cvCreateMemStorage(0);
cvClearMemStorage(storage);
// If the image is color, use a greyscale copy of the image.
detectImg = (IplImage*)inputImg;
if (inputImg->nChannels > 1)
{
size = cvSize(inputImg->width, inputImg->height);
greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1);
cvCvtColor(inputImg, greyImg, CV_BGR2GRAY);
detectImg = greyImg; // Use the greyscale image.
}
// Detect all the faces in the greyscale image.
t = (double)cvGetTickCount();
rects = cvHaarDetectObjects(detectImg, cascade, storage,search_scale_factor, 3, flags, minFeatureSize);
t = (double)cvGetTickCount() - t;
ms = cvRound(t/((double)cvGetTickFrequency() * 1000.0));
nFaces = rects->total;
printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
// Get the first detected face (the biggest).
if (nFaces > 0)
rc = *(CvRect*)cvGetSeqElem(rects, 0);
else
rc = cvRect(-1,-1,-1,-1); // Couldn't find the face.
if (greyImg)
cvReleaseImage(&greyImg);
cvReleaseMemStorage(&storage);
//cvReleaseHaarClassifierCascade(&cascade);
return rc; // Return the biggest face found, or (-1,-1,-1,-1).
}
하지만이 오류를 얻고있다 ...
../src/test3.cpp:28:15: error: request for member ‘load’ in ‘cascade’, which is of non-class type ‘CvHaarClassifierCascade*’
나도 같은 위해 다음과 같은 프로그램을 사용하고 ... 원본 폴더. 캐스케이드를 CascadeClassifier로 정의 할 때 호환성 오류가 발생합니다.
내가 너무 PLZ
이봐, 내가 일을 할 수 아니에요,
something->
: 당신이 뭔가에 대한 포인터를 가지고있는 경우BTW보다 최신 버전에 대한
look here, 당신은으로 접근 할 필요가 이미 제공 한 링크에서 언급 한 프로그램의 도움을 받아 얼굴 검색을 할 수 있습니다. 그러나 나는 정말로 위의 문제에 대한 문제를 파악하고 싶습니다 ... 당신이 전달하고 싶은 것을 정교하게 부탁드립니다 ... 당신에게 매우 감사 할 것입니다. – venus
'CvHaarClassifierCascade * cascade; if (! cascade-> load (face_cascade_name))'CvHaarClassifierCascade에 대한 포인터를 가지고 있으므로'.' 대신'->'를 사용해야합니다. 또한, 포인터가 instanciated 적이 없다'CvHaarClassifierCascade * cascade = createHaarClassifierCascade(); 또는 이와 유사한, 나는 잊었다. 다시, 새로운, C++ API를 고수하고 재미있게 지내십시오! 답장을 보내 주셔서 감사합니다. – berak
정말 도움이됩니다. – venus