5
내가 찾으려

/메인 이미지의 서브 이미지/템플릿 이미지를 확인하고 그 좌표를 알고 싶어, 내가 그것을 구현하기 위해 링크를 다음에 주어진 코드를 사용했다홈페이지/큰 이미지

에 (확장) 템플릿 imge 일치, 템플릿 화상의 크기가 더 큰 이미지의 일치 부분의 크기와 정확하게 동일한 경우

Check presence of subimage in image in iOS

그것은, 잘 작동된다.

그러나 큰 이미지의 일부와 일치하는 경우 하위 이미지가 축소되거나 크기가 조정되면 결과가 제대로 표시되지 않습니다.

+0

http://stackoverflow.com/questions/14132951/how-to-obtain-the 템플릿 매칭보다 더 정확 -scale-and-rotation-angle-logpolar-transform – mrgloom

+0

나는 하나를 보았지만 답변을 upvoted에서 아무 것도 이해할 수 없다. –

+0

두 가지의 쉬운 (그러나 효율적이지 않은) 방법 : 템플릿의 크기를 재조정하고 원본 이미지 또는 이미지의 크기를 조정하고 원본 템플릿과 일치시킵니다. 템플릿 일치가 축척이 일정하지 않습니다. 당신은 '스케일 불변성'(그리고 어쩌면 회전 불변의) 템플릿 매칭 메소드를 찾기 위해 문학을 검색하거나, SIFT 나 SURF와 같은 스케일 불변의 특징 (예 : 특징 매칭)과 같은보다 강력한 메소드로 전환하고 싶을 수도 있습니다. – Micka

답변

4

OpenCV 기능 감지를 사용하십시오. 그것은 ..

이 코드를 시도해보세요 ..

-(void)featureDetection:(UIImage*)largerImage withImage:(UIImage*)subImage 
{ 
    cv::Mat tempMat1 = [largerImage CVMat]; 
    cv::Mat tempMat2 = [subImage CVMat]; 

    cv::cvtColor(tempMat1, tempMat1, CV_RGB2GRAY); 
    cv::cvtColor(tempMat2, tempMat2, CV_RGB2GRAY); 

    if(!tempMat1.data || !tempMat2.data) { 
     return; 
    } 

    //-- Step 1: Detect the keypoints using SURF Detector 
    int minHessian = 25; 

    cv::SurfFeatureDetector detector(minHessian); // More Accurate bt take more time.. 
    //cv::FastFeatureDetector detector(minHessian); //Less Accurate bt take less time.. 

    std::vector<cv::KeyPoint> keypoints_1, keypoints_2; 

    detector.detect(tempMat1, keypoints_1); 
    detector.detect(tempMat2, keypoints_2); 

    //-- Step 2: Calculate descriptors (feature vectors) 
    cv::SurfDescriptorExtractor extractor; 

    cv::Mat descriptors_1, descriptors_2; 

    extractor.compute(tempMat1, keypoints_1, descriptors_1); 
    extractor.compute(tempMat2, keypoints_2, descriptors_2); 

    std::vector<cv::Point2f> obj_corners(4); 

    //Get the corners from the object 
    obj_corners[0] = (cvPoint(0,0)); 
    obj_corners[1] = (cvPoint(tempMat2.cols,0)); 
    obj_corners[2] = (cvPoint(tempMat2.cols,tempMat2.rows)); 
    obj_corners[3] = (cvPoint(0, tempMat2.rows)); 

    //-- Step 3: Matching descriptor vectors with a brute force matcher 
    //cv::BruteForceMatcher < cv::L2<float> > matcher; 
    cv::FlannBasedMatcher matcher; 
    //std::vector<cv::DMatch> matches; 
    std::vector<cv::vector<cv::DMatch > > matches; 

    std::vector<cv::DMatch > good_matches; 
    std::vector<cv::Point2f> obj; 
    std::vector<cv::Point2f> scene; 
    std::vector<cv::Point2f> scene_corners(4); 
    cv::Mat H; 

    matcher.knnMatch(descriptors_2, descriptors_1, matches,2); 

    for(int i = 0; i < cv::min(tempMat1.rows-1,(int) matches.size()); i++) { 

     if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) { 
      good_matches.push_back(matches[i][0]); 
     } 
    } 
    cv::Mat img_matches; 
    drawMatches(tempMat2, keypoints_2, tempMat1, keypoints_1, good_matches, img_matches); 

    NSLog(@"good matches %lu",good_matches.size()); 

    if (good_matches.size() >= 4) { 

     for(int i = 0; i < good_matches.size(); i++) { 
      //Get the keypoints from the good matches 
      obj.push_back(keypoints_2[ good_matches[i].queryIdx ].pt); 
      scene.push_back(keypoints_1[ good_matches[i].trainIdx ].pt); 
     } 

     H = findHomography(obj, scene, CV_RANSAC); 

     perspectiveTransform(obj_corners, scene_corners, H); 

     NSLog(@"%f %f",scene_corners[0].x,scene_corners[0].y); 
     NSLog(@"%f %f",scene_corners[1].x,scene_corners[1].y); 
     NSLog(@"%f %f",scene_corners[2].x,scene_corners[2].y); 
     NSLog(@"%f %f",scene_corners[3].x,scene_corners[3].y); 


     //Draw lines between the corners (the mapped object in the scene image) 
     line(tempMat1, scene_corners[0], scene_corners[1], cvScalar(0, 255, 0), 4); 

     line(tempMat1, scene_corners[1], scene_corners[2], cvScalar(0, 255, 0), 4); 

     line(tempMat1, scene_corners[2], scene_corners[3], cvScalar(0, 255, 0), 4); 

     line(tempMat1, scene_corners[3], scene_corners[0], cvScalar(0, 255, 0), 4); 
    } 

    // View matching.. 

    UIImage *resultimage = [UIImage imageWithCVMat:img_matches]; 
    UIImageView *imageview = [[UIImageView alloc] initWithImage:resultimage]; 
    imageview.frame = CGRectMake(0, 0, 320, 240); 
    [self.view addSubview:imageview]; 

    // View Result 

    UIImage *resultimage2 = [UIImage imageWithCVMat:tempMat1]; 
    UIImageView *imageview2 = [[UIImageView alloc] initWithImage:resultimage2]; 
    imageview2.frame = CGRectMake(0, 240, 320, 240); 
    [self.view addSubview:imageview2]; 
} 
당신은 logpolar 변환 시도 할 수
+0

정말 고마워요. –