Advertisement
Guest User

features

a guest
Nov 24th, 2017
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include "opencv2/core/core.hpp"
  5. #include "opencv2/features2d/features2d.hpp"
  6. #include "opencv2/highgui/highgui.hpp"
  7. #include "opencv2/calib3d/calib3d.hpp"
  8. #include "opencv2/imgcodecs/imgcodecs.hpp"
  9. #include <opencv2/videoio/videoio.hpp>
  10. #include <opencv2/video/video.hpp>
  11. #include "opencv2/xfeatures2d/nonfree.hpp"
  12. #include "opencv2/xfeatures2d.hpp"
  13. #include "opencv2/imgproc/imgproc.hpp"
  14. #include "opencv2/objdetect.hpp"
  15. #include "opencv2/calib3d.hpp"
  16. #include <stdlib.h>
  17.  
  18.  
  19.  
  20. using namespace cv;
  21. using namespace std;
  22. using namespace cv::xfeatures2d;
  23. FlannBasedMatcher matcher;
  24. Mat src;
  25. int thresh = 100;
  26. int max_thresh = 255;
  27. RNG rng(12345);
  28.  
  29. Mat img_prev, img_curr, result;
  30.  
  31. //void BoundingBox(Mat& img, vector<DMatch>& good_matches,double Dist);
  32.  
  33. /** @function main */
  34. int main( int argc, char** argv )
  35. {
  36.  
  37.  
  38. VideoCapture cap(0);
  39. if (!cap.isOpened())
  40. {
  41. cout << "Cannot access camera" << endl;
  42. return -1;
  43. }
  44.  
  45. for(;;)
  46. {
  47.  
  48. cap >> img_curr;
  49.  
  50. if(img_curr.empty()){
  51. cout<<"no image"<<endl;
  52. break;
  53. }
  54.  
  55. //img_prev = cv::Mat::zeros(img_curr.size(), img_curr.type()); // prev frame as black
  56.  
  57.  
  58. img_curr.copyTo(img_prev);
  59.  
  60. cv::imshow ("current frame",img_curr);
  61.  
  62. cv::imshow("previous frame", img_prev);
  63.  
  64. if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
  65.  
  66. //cvtColor( img_curr, src_gray, CV_BGR2GRAY );
  67.  
  68. //-- Step 1: Detect the keypoints using SURF Detector
  69. int minHessian = 2000;
  70. //Ptr<xfeatures2d::SURF> detector = xfeatures2d::SURF::create(minHessian);
  71. clock_t begin = clock();
  72. Ptr<SURF> detector = SURF::create(minHessian);
  73. // SurfFeatureDetector detector( minHessian );
  74.  
  75. std::vector<KeyPoint> keypoints_object, keypoints_scene;
  76.  
  77. detector->detect( img_curr, keypoints_scene);
  78. detector->detect( img_prev, keypoints_object);
  79.  
  80. //printf("-- Max dist : %f \n", max_dist );
  81. //printf("-- Min dist : %f \n", min_dist );
  82.  
  83. //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist,
  84. //-- or a small arbitary value ( 0.02 ) in the event that min_dist is very
  85. //-- small)
  86. //-- PS.- radiusMatch can also be used here.y );
  87.  
  88. //-- Step 2: Calculate descriptors (feature vectors)
  89. //SurfDescriptorExtractor extractor;
  90. Ptr<SURF> extractor = SURF::create();
  91.  
  92. Mat descriptors_object, descriptors_scene;
  93.  
  94. extractor->compute( img_curr, keypoints_scene, descriptors_scene);
  95. extractor->compute( img_prev, keypoints_object, descriptors_object);
  96.  
  97. //-- Step 3: Matching descriptor vectors using FLANN matcher
  98. FlannBasedMatcher matcher;
  99. std::vector< DMatch > matches;
  100. matcher.match( descriptors_object, descriptors_scene, matches );
  101.  
  102. double max_dist = 0; double min_dist = 100;
  103.  
  104. //-- Quick calculation of max and min distances between keypoints
  105. for( int i = 0; i < descriptors_scene.rows; i++ )
  106. { double dist = matches[i].distance;
  107. if( dist < min_dist ) min_dist = dist;
  108. if( dist > max_dist ) max_dist = dist;
  109. }
  110.  
  111. std::vector< DMatch > good_matches;
  112.  
  113. for( int i = 0; i < descriptors_scene.rows; i++ )
  114. { if( matches[i].distance <= max(2*min_dist, 0.02) )
  115. { good_matches.push_back( matches[i]); }
  116. }
  117.  
  118. //-- Draw only "good" matches
  119. Mat img_matches;
  120. drawMatches( img_curr, keypoints_scene, img_prev, keypoints_object,
  121. good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
  122. vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
  123.  
  124.  
  125.  
  126.  
  127.  
  128. /// Detect edges using Threshold
  129. //cvtColor(img_matches,src,CV_BGR2GRAY,1);
  130. //-- Localize the object
  131. std::vector<Point2f> obj;
  132. std::vector<Point2f> scene;
  133.  
  134. //int myradius=10;
  135.  
  136. for( int i = 0; i < (int)good_matches.size(); i++ )
  137. {
  138.  
  139. //-- Get the keypoints from the good matches
  140. obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
  141. scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
  142. // circle(img_matches,cvPoint(scene[i].x,scene[i].y),myradius,CV_RGB(100,0,0),-1,8,0);
  143.  
  144.  
  145. // printf( "-- Good Match [%d] Keypoint scene: %d -- Keypoint object: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }
  146. //Rect r = boundingRect(src);
  147.  
  148. // Rect Min_Rect=boundingRect(src);
  149. // rectangle(src, pt1, pt2, CV_RGB(255,0,0), 1);
  150. //cout<<"channels"<<src.channels();
  151. //cout<<"type"<<src.type();
  152. //imshow( "Good Matches",src);
  153.  
  154. //else
  155.  
  156. //return -1;
  157.  
  158. Mat H = findHomography(obj,scene, CV_RANSAC );
  159. std::vector<Point2f> obj_corners(4);
  160. obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( obj[i].x, 0 );
  161. obj_corners[2] = cvPoint( obj[i].x, obj[i].y ); obj_corners[3] = cvPoint( 0, obj[i].y );
  162. std::vector<Point2f> scene_corners(4);
  163.  
  164. perspectiveTransform( obj_corners, scene_corners, H);
  165.  
  166. line( img_matches, scene_corners[0] + Point2f( img_prev.cols, 0), scene_corners[1] + Point2f( img_prev.cols, 0), Scalar(0, 255, 0), 4 );
  167. line( img_matches, scene_corners[1] + Point2f( img_prev.cols, 0), scene_corners[2] + Point2f( img_prev.cols, 0), Scalar( 0, 255, 0), 4 );
  168. line( img_matches, scene_corners[2] + Point2f( img_prev.cols, 0), scene_corners[3] + Point2f( img_prev.cols, 0), Scalar( 0, 255, 0), 4 );
  169. line( img_matches, scene_corners[3] + Point2f( img_prev.cols, 0), scene_corners[0] + Point2f( img_prev.cols, 0), Scalar( 0, 255, 0), 4 );
  170.  
  171. cout<<"here"<<endl;
  172. imshow( "Good Matches & Object detection", img_matches );
  173. cout<<"object"<<obj<<"scene"<<scene<<endl;
  174. clock_t end = clock();
  175. double elapsed_secs = double (end-begin)/CLOCKS_PER_SEC;
  176. cout<<"total time"<<elapsed_secs<<"s"<<endl;
  177.  
  178. }
  179.  
  180.  
  181. }
  182.  
  183. return 0;
  184. }
  185. /*
  186. void BoundingBox(Mat& img, vector<DMatch>& good_matches,double Dist, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
  187. {
  188. if(img.empty())
  189. {
  190.  
  191. break;
  192. }
  193. else
  194. {
  195. cout<<"we are inside box"<<endl;
  196. for(int i = 0; i >= 20; i++)
  197. {
  198. Dist = good_matches[i].distance;
  199.  
  200. }
  201. }
  202. }
  203. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement