OpenCv ORB例子代码

时间:2022-03-29 20:10:22
  1. #include "opencv2/objdetect/objdetect.hpp"  
  2. #include "opencv2/features2d/features2d.hpp"  
  3. #include "opencv2/highgui/highgui.hpp"  
  4. #include "opencv2/calib3d/calib3d.hpp"  
  5. #include "opencv2/imgproc/imgproc_c.h"  
  6. #include "opencv2/imgproc/imgproc.hpp"  
  7.     
  8. using namespace std;  
  9. using namespace cv;  
  10.     
  11. char* image_filename1 ="apple_vinegar_0.png";  
  12. char* image_filename2 ="apple_vinegar_2.png";  
  13.     
  14. unsigned int hamdist(unsignedintx, unsignedinty)  
  15. {   
  16. unsigned int dist = 0, val = x ^ y;  
  17.     
  18. // Count the number of set bits  
  19. while(val)  
  20. {   
  21. ++dist;   
  22. val &= val - 1;   
  23. }   
  24.     
  25. returndist;  
  26. }   
  27.     
  28. unsigned int hamdist2(unsignedchar* a, unsignedchar* b,size_tsize)  
  29. {   
  30. HammingLUT lut;   
  31.     
  32. unsigned int result;  
  33. result = lut((a), (b), size);  
  34. return result;  
  35. }   
  36.     
  37. void naive_nn_search(vector& keys1, Mat& descp1,  
  38. vector& keys2, Mat& descp2,  
  39. vector& matches)   
  40. {   
  41. for(inti = 0; i < (int)keys2.size(); i++){  
  42. unsigned int min_dist = INT_MAX;  
  43. int min_idx = -1;  
  44. unsigned char* query_feat = descp2.ptr(i);  
  45. for(int j = 0; j < (int)keys1.size(); j++){  
  46. unsigned char* train_feat = descp1.ptr(j);  
  47. unsigned int dist =  hamdist2(query_feat, train_feat, 32);  
  48.     
  49. if(dist < min_dist){  
  50. min_dist = dist;   
  51. min_idx = j;   
  52. }   
  53. }   
  54.     
  55. //if(min_dist <= (unsigned int)(second_dist * 0.8)){  
  56. if(min_dist <= 50){  
  57. matches.push_back(DMatch(i, min_idx, 0, (float)min_dist));  
  58. }   
  59. }   
  60. }   
  61.     
  62. void naive_nn_search2(vector& keys1, Mat& descp1,  
  63. vector& keys2, Mat& descp2,  
  64. vector& matches)   
  65. {   
  66. for(int i = 0; i < (int)keys2.size(); i++){  
  67. unsigned int min_dist = INT_MAX;  
  68. unsigned int sec_dist = INT_MAX;  
  69. int min_idx = -1, sec_idx = -1;  
  70. unsigned char* query_feat = descp2.ptr(i);  
  71. for(intj = 0; j < (int)keys1.size(); j++){  
  72. unsigned char* train_feat = descp1.ptr(j);  
  73. unsigned int dist =  hamdist2(query_feat, train_feat, 32);  
  74.     
  75. if(dist < min_dist){  
  76. sec_dist = min_dist;  
  77. sec_idx = min_idx;  
  78. min_dist = dist;   
  79. min_idx = j;   
  80. }elseif(dist < sec_dist){  
  81. sec_dist = dist;   
  82. sec_idx = j;   
  83. }   
  84. }   
  85.     
  86. if(min_dist <= (unsignedint)(sec_dist * 0.8) && min_dist <=50){  
  87. //if(min_dist <= 50){  
  88. matches.push_back(DMatch(i, min_idx, 0, (float)min_dist));  
  89. }   
  90. }   
  91. }   
  92.     
  93. int main(intargc,char* argv[])  
  94. {   
  95. Mat img1 = imread(image_filename1, 0);  
  96. Mat img2 = imread(image_filename2, 0);  
  97. //GaussianBlur(img1, img1, Size(5, 5), 0);  
  98. //GaussianBlur(img2, img2, Size(5, 5), 0);  
  99.     
  100. ORB orb1(3000, ORB::CommonParams(1.2, 8));  
  101. ORB orb2(100, ORB::CommonParams(1.2, 1));  
  102.     
  103. vector keys1, keys2;  
  104. Mat descriptors1, descriptors2;  
  105.     
  106. orb1(img1, Mat(), keys1, descriptors1,false);  
  107. printf("tem feat num: %d\n", keys1.size());   
  108.     
  109. int64 st, et;   
  110. st = cvGetTickCount();  
  111. orb2(img2, Mat(), keys2, descriptors2,false);  
  112. et = cvGetTickCount();  
  113. printf("orb2 extraction time: %f\n", (et-st)/(double)cvGetTickFrequency()/1000.);  
  114. printf("query feat num: %d\n", keys2.size());   
  115.     
  116. // find matches  
  117. vector matches;  
  118.     
  119. st = cvGetTickCount();  
  120. //for(int i = 0; i < 10; i++){  
  121. naive_nn_search2(keys1, descriptors1, keys2, descriptors2, matches);  
  122. //}   
  123. et = cvGetTickCount();  
  124.     
  125. printf("match time: %f\n", (et-st)/(double)cvGetTickFrequency()/1000.);  
  126. printf("matchs num: %d\n", matches.size());   
  127.     
  128. Mat showImg;   
  129. drawMatches(img2, keys2, img1, keys1, matches, showImg, CV_RGB(0, 255, 0), CV_RGB(0, 0, 255));  
  130. string winName ="Matches";  
  131. namedWindow( winName, WINDOW_AUTOSIZE );  
  132. imshow( winName, showImg );  
  133. waitKey();   
  134.     
  135. vector   
  136. pt1;   
  137. vector   
  138. pt2;   
  139.     
  140. for(inti = 0; i < (int)matches.size(); i++){  
  141. pt1.push_back(Point2f(keys2[matches[i].queryIdx].pt.x, keys2[matches[i].queryIdx].pt.y));  
  142.     
  143. pt2.push_back(Point2f(keys1[matches[i].trainIdx].pt.x, keys1[matches[i].trainIdx].pt.y));  
  144. }   
  145.     
  146. Mat homo;   
  147.     
  148. st = cvGetTickCount();  
  149. homo = findHomography(pt1, pt2, Mat(), CV_RANSAC, 5);  
  150. et = cvGetTickCount();  
  151. printf("ransac time: %f\n", (et-st)/(double)cvGetTickFrequency()/1000.);  
  152.     
  153. printf("homo\n"  
  154. "%f %f %f\n"  
  155. "%f %f %f\n"  
  156. "%f %f %f\n",  
  157. homo.at(0,0), homo.at(0,1), homo.at(0,2),  
  158. homo.at(1,0), homo.at(1,1), homo.at(1,2),  
  159. homo.at(2,0),homo.at(2,1),homo.at(2,2));  
  160.     
  161. vector   
  162. reproj;   
  163. reproj.resize(pt1.size());  
  164.     
  165. perspectiveTransform(pt1, reproj, homo);  
  166.     
  167. Mat diff;   
  168. diff = Mat(reproj) - Mat(pt2);  
  169.     
  170. int inlier = 0;  
  171. doubleerr_sum = 0;  
  172. for(inti = 0; i < diff.rows; i++){   
  173. float* ptr = diff.ptr(i);  
  174. floaterr = ptr[0]*ptr[0] + ptr[1]*ptr[1];  
  175. if(err < 25.f){  
  176. inlier++;   
  177. err_sum += sqrt(err);  
  178. }   
  179. }   
  180. printf("inlier num: %d\n", inlier);   
  181. printf("ratio %f\n", inlier / (float)(diff.rows));  
  182. printf("mean reprojection error: %f\n", err_sum / inlier);   
  183.     
  184. return0;  
  185. }  
[cpp]  view plain copy
  1. <p>#include <iostream>  
  2. #include "opencv2/core/core.hpp"  
  3. #include "opencv2/features2d/features2d.hpp"  
  4. #include "opencv2/highgui/highgui.hpp"  
  5. #include <iostream>  
  6. #include <vector>  
  7. using namespace cv;  
  8. using namespace std;  
  9. int main()  
  10. {  
  11.  Mat img_1 = imread("D:\\image\\img1.jpg");  
  12.  Mat img_2 = imread("D:\\image\\img2.jpg");  
  13.  if (!img_1.data || !img_2.data)  
  14.  {  
  15.   cout << "error reading images " << endl;  
  16.   return -1;  
  17.  }</p><p> ORB orb;  
  18.  vector<KeyPoint> keyPoints_1, keyPoints_2;  
  19.  Mat descriptors_1, descriptors_2;</p><p> orb(img_1, Mat(), keyPoints_1, descriptors_1);  
  20.  orb(img_2, Mat(), keyPoints_2, descriptors_2);  
  21.    
  22.  BruteForceMatcher<HammingLUT> matcher;  
  23.  vector<DMatch> matches;  
  24.  matcher.match(descriptors_1, descriptors_2, matches);</p><p> double max_dist = 0; double min_dist = 100;  
  25.  //-- Quick calculation of max and min distances between keypoints  
  26.  forint i = 0; i < descriptors_1.rows; i++ )  
  27.  {   
  28.   double dist = matches[i].distance;  
  29.   if( dist < min_dist ) min_dist = dist;  
  30.   if( dist > max_dist ) max_dist = dist;  
  31.  }  
  32.  printf("-- Max dist : %f \n", max_dist );  
  33.  printf("-- Min dist : %f \n", min_dist );  
  34.  //-- Draw only "good" matches (i.e. whose distance is less than 0.6*max_dist )  
  35.  //-- PS.- radiusMatch can also be used here.  
  36.  std::vector< DMatch > good_matches;  
  37.  forint i = 0; i < descriptors_1.rows; i++ )  
  38.  {   
  39.   if( matches[i].distance < 0.6*max_dist )  
  40.   {   
  41.    good_matches.push_back( matches[i]);   
  42.   }  
  43.  }</p><p> Mat img_matches;  
  44.  drawMatches(img_1, keyPoints_1, img_2, keyPoints_2,  
  45.   good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),  
  46.   vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);  
  47.  imshow( "Match", img_matches);  
  48.  cvWaitKey();  
  49.  return 0;  
  50. }</p>