2016-12-01 2 views
0

여기에서 참조로 동질성을 계산 중입니다. http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.htmlopencv 기능 일치를 사용하여 동질 찾기 찾기

그러나 참조 코드 임에도 불구하고 오류가 있습니다. min_dist 값은 항상 0이므로 코드에서 good_matches의 크기는 0입니다.

무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

int main(int argc, char **argv) 
{ 

    cv::VideoCapture cam(0); 
    cv::Mat img(480, 640, CV_8UC3, cv::Scalar(0, 0, 0)); 
    cv::Mat img2(480, 640, CV_8UC3, cv::Scalar(0, 0, 0)); 

    cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create(); 
    std::vector<cv::KeyPoint> kp; 
    cv::Mat descr; 

    while (1) 
    { 
     cam >> img; 
     cv::Mat aka; 
     akaze->detectAndCompute(img, cv::noArray(), kp, descr); 
     cv::drawKeypoints(img, kp, aka); 
     cv::imshow("AKAZE", aka); 

     if (cv::waitKey(10) == 's') 
     { 
      break; 
     } 
     kp.clear(); 
    } 
    akaze.release(); 

    std::vector<cv::KeyPoint> kp_query; 
    cv::Mat descr_query; 
    cv::Ptr<cv::AKAZE> akaze2 = cv::AKAZE::create(); 

    while (1) 
    { 
     cv::Mat aka; 
     cam >> img2; 
     akaze2->detectAndCompute(img2, cv::noArray(), kp_query, descr_query); 

     cv::BFMatcher matcher(cv::NORM_HAMMING); 
     std::vector<cv::DMatch> matches; 
     matcher.match(descr_query, descr, matches); 

     double max_dist = 0, min_dist = 100.0; 
     for (int i = 0; i<descr_query.rows; i++) 
     { 
      double dist = matches[i].distance; 
      if (dist < min_dist) min_dist = dist; 
      if (dist > max_dist) max_dist = dist; 
     } 
     printf("-- Max dist : %f \n", max_dist); 
     printf("-- Min dist : %f \n", min_dist); 
     std::vector<cv::DMatch> good_matches; 

     for (int i = 0; i<descr_query.rows; i++) 
     { 
      if (matches[i].distance < 3 * min_dist) 
       good_matches.push_back(matches[i]); 
     } 

     std::vector<cv::Point2f> train, query; 

     for (int i = 0; i<good_matches.size(); i++) 
     { 
      train.push_back(kp[good_matches[i].queryIdx].pt); 
      query.push_back(kp_query[good_matches[i].trainIdx].pt); 
     } 

     cv::Mat output_mask; 
     cv::Mat H = cv::findHomography(train, query, CV_RANSAC, 3, output_mask); 


     cv::Mat m; 
     cv::drawMatches(img, kp, img2, kp_query, good_matches, m, cv::Scalar::all(-1), cv::Scalar::all(-1), 
     std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 
     cv::imshow("match", m); 

     cv::drawKeypoints(img2, kp_query, aka); 

     cv::waitKey(10); 
     kp_query.clear(); 
    } 
} 

답변

0

지금까지는 코드에서 잘못된 프로 시저를 볼 수 없었지만 3 채널 8 비트 이미지가 있습니다. 연결된 채널 자습서의 이미지 형식이므로 1 채널 8 비트 이미지를 사용해보십시오. 따라서 cv::Mat img2(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));cv::Mat img2(480, 640, CV_8UC1, cv::Scalar(0, 0, 0));으로 변경해보십시오. 두 이미지 모두. 이것이 cam >> img에서 작동하지 않으면 캠에서 이미지를 읽은 후 이미지를 CV_8UC1으로 변환해야합니다.