2014-01-21 3 views
1

저는 2D 이미지에서 얼굴을 찾다가 나중에 같은 이미지에서 입을 찾고 싶습니다.하지만 지금 당장 문제가 있습니다. 지금까지 내 코드 :OpenCv 어설 션이 실패했습니다.

for (int i = 0; i < faces.size(); i++) 
{ 
     Point pt1(faces[i].x, faces[i].y); 
     Point pt2((faces[i].x + faces[i].height), (faces[i].y + faces[i].width)); 
     rectangle(frame, pt1, pt2, Scalar(255,0 , 0), 2, 8, 0); 

        //I WANT ROI(FOR MOUTH DETECTION) TO BE ONLY HALF OF THE RECTANGLE WITH FACE 
     Rect mouthROI; 
     mouthROI.x = (faces[i].x); 
     mouthROI.y = faces[i].y*(1.5); 
     mouthROI.width = (faces[i].x + faces[i].height); 
     mouthROI.height = (faces[i].y + faces[i].width); 

        //I CHECK IF NEW RECTANGLE IS EXACTLY BOTTOM HALF OF PREVIOUS ONE 
     Point ptAA(mouthROI.x, mouthROI.y); 
     Point ptBB(mouthROI.width, mouthROI.height); 
     rectangle(frame, ptBB, ptAA, Scalar(0,0 , 255), 2, 2, 0); 


     Mat image_roi = frame(mouthROI); 

     cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 
     equalizeHist(frame_gray, frame_gray); 

        // DETECTING MOUTH INSIDE ROI OF EARLIER DETECTED FACE 
     mouth_cascade.detectMultiScale(image_roi, mouths, 1.1, 2, 0, Size(30, 30)); 

     for(int i = 0; i < mouths.size(); i++) 
     { 
      Point pt1(mouths[i].x, mouths[i].y); // Display detected faces on main window - live stream from camera 
      Point pt2((mouths[i].x + mouths[i].height), (mouths[i].y + mouths[i].width)); 
      rectangle(frame, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0); 
     } 

} 

불행히도이 코드는 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in cv::Mat::Mat(const cv::Mat&, const cv::Rect&), file C:/build/2_4_PackSlave-win32-vc11-shared/opencv/modules/core/src/matrix.cpp, line 323 

이 오류는 어떻게 해결할 수 있습니까? 모두에게 도움을 주셔서 감사합니다!

+0

어설 션을 던지는 함수에 전달하는 매개 변수가 잘못되었습니다. 디버거를 사용하여 어설 션을 던지는 함수를 찾고 호출을 시작하는 코드의 행으로 역 추적하십시오. –

+0

오류가 이곳에 있습니다. 'Mat image_roi = frame (mouthROI);',하지만 여전히 이유를 모르겠다 ... – user2592968

+0

[유사한 링크] (http://stackoverflow.com/questions/20855192/assertion- error-in-grabcut) 그리고 동일한 오류를 저 지르지 않았는지 확인하십시오. – BlueSword

답변

5

초기화 방법은 mouthROI입니다. 그것은, 대신이 같아야합니다

<previous code> 
mouthROI.width = (faces[i].height); 
mouthROI.height = (faces[i].width); 

Point ptAA(mouthROI.x, mouthROI.y); 
Point ptBB(mouthROI.x+mouthROI.width, mouthROI.y+mouthROI.height); 

그 이력서를 기억 :: 사각형이 위치 사각형의을지지 않습니다, 그것은 왼쪽 상단의 위치와 높이 소요 .. 자세한 내용은 documentation을 참조하십시오.

HTH