2014-02-05 6 views
0

2D 이미지 안에 코 포인트 랜드 마크를 찾으려고합니다. 100 % 정확하지는 않지만 첫 번째 방법으로는 완전히 만족합니다.전체 이미지와 관련하여 포인트의 X와 Y 좌표를 찾으십시오.

vector<Rect> noses; 
vector<Rect> faces; 
vector<Rect> eyes; 
Mat frame_gray; 
Mat matched_frame; //frame with matched face 
Mat gray; 
Rect region_of_interest; 

cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 

face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); 

for (int i = 0; i < faces.size(); i++) 
{ 
     Point pt1(faces[i].x, faces[i].y); // Display detected faces on main window - live stream from camera 
     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); 

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

     //NOSE TIP DETECTION 
     Rect noseROI1; 
     noseROI1.x = (faces[i].x); 
     noseROI1.y = faces[i].y + (faces[i].height/2.5); 
     noseROI1.width = (faces[i].width); 
     noseROI1.height = (faces[i].height/2.8); 

     Point ptNoseX(noseROI1.x, noseROI1.y); 
     Point ptNoseY(noseROI1.x+noseROI1.width, noseROI1.y+noseROI1.height); 
     //Rectangle around region of interest concentrated on nose 
     rectangle(frame, ptNoseX,ptNoseY, Scalar(0,255,255), 2, 2, 0); 

     Mat image_roi_nose = frame(noseROI1); 

     nose_cascade.detectMultiScale(image_roi_nose, noses, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(40, 30)); 

     for (int i = 0; i < noses.size(); i++) 
     { 
      region_of_interest.x = noses[i].x; 
      region_of_interest.y = noses[i].y; 
      region_of_interest.width = (noses[i].width); 
      region_of_interest.height = (noses[i].height); 

      matched_frame = frame(region_of_interest); 

      cvtColor(matched_frame, gray, CV_BGR2GRAY); 

      Point pt1(noses[i].x, noses[i].y); 
      Point pt2((noses[i].x + noses[i].height), (noses[i].y + noses[i].width)); 
      rectangle(image_roi_nose, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0); 

      int x1 = noses[i].x + (noses[i].height/2); 
      int y1 = noses[i].y + (noses[i].width/2); 


      circle(image_roi_nose, Point(x1, y1), 2, CV_RGB(255,0,0),2, 8, 0); 
     } 

이 코드는 코 끝을 발견하지만 어떻게 전체 이미지와 관련이 점의 좌표를 계산할 수있다, 나에게 x1Mat image_roi_nose 관련 y1을 반환? 내 질문에 불명확 한 점이 있으면 더 자세히 설명해 드리겠습니다.

모두에게 감사드립니다.

답변

1
x = x1 + noseROI1.x; 
y = y1 + noseROI1.y;