Note that there are some explanatory texts on larger screens.

plurals
  1. PODrawing rectangle around detected object using SURF
    primarykey
    data
    text
    <p>I am trying to detect an object from the following code involving surf detector, I do not want to draw matches, I want to draw a rectangle around the detected object, but somehow I am unable to get correct Homography, please can anyone point out where I am going wrong.</p> <pre><code>#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/calib3d/calib3d.hpp" using namespace cv; int main() { Mat object = imread( "sample.jpeg", CV_LOAD_IMAGE_GRAYSCALE ); if( !object.data ) { std::cout&lt;&lt; "Error reading object " &lt;&lt; std::endl; return -1; } //Detect the keypoints using SURF Detector int minHessian = 500; SurfFeatureDetector detector( minHessian ); std::vector&lt;KeyPoint&gt; kp_object; detector.detect( object, kp_object ); //Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat des_object; extractor.compute( object, kp_object, des_object ); FlannBasedMatcher matcher; VideoCapture cap(0); namedWindow("Good Matches",0); cvResizeWindow("Good Matches",800,800); std::vector&lt;Point2f&gt; obj_corners(4); //Get the corners from the object obj_corners[0] = (cvPoint(0,0)); obj_corners[1] = (cvPoint(object.cols,0)); obj_corners[2] = (cvPoint(object.cols,object.rows)); obj_corners[3] = (cvPoint(0, object.rows)); char key = 'a'; int framecount = 0; while (key != 27) { Mat frame; cap &gt;&gt; frame; if (framecount &lt; 5) { framecount++; continue; } Mat des_image, img_matches; std::vector&lt;KeyPoint&gt; kp_image; std::vector&lt;vector&lt;DMatch &gt; &gt; matches; std::vector&lt;DMatch &gt; good_matches; std::vector&lt;Point2f&gt; obj; std::vector&lt;Point2f&gt; scene; std::vector&lt;Point2f&gt; scene_corners(4); Mat H; Mat image; cvtColor(frame, image, CV_RGB2GRAY); detector.detect( image, kp_image ); extractor.compute( image, kp_image, des_image ); matcher.knnMatch(des_object, des_image, matches, 2); for(int i = 0; i &lt; min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS { if((matches[i][0].distance &lt; 0.6*(matches[i][1].distance)) &amp;&amp; ((int) matches[i].size()&lt;=2 &amp;&amp; (int) matches[i].size()&gt;0)) { good_matches.push_back(matches[i][0]); } } //Draw only "good" matches // drawMatches( object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector&lt;char&gt;(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); if (good_matches.size() &gt;= 4) { for( int i = 0; i &lt; good_matches.size(); i++ ) { //Get the keypoints from the good matches obj.push_back( kp_object[ good_matches[i].queryIdx ].pt ); scene.push_back( kp_image[ good_matches[i].trainIdx ].pt ); } H = findHomography( obj, scene, CV_RANSAC ); perspectiveTransform( obj_corners, scene_corners, H); //Draw lines between the corners (the mapped object in the scene image ) line( image, scene_corners[0] + Point2f( object.cols, 0), scene_corners[1] + Point2f( object.cols, 0), Scalar(0, 255, 0), 4 ); line( image, scene_corners[1] + Point2f( object.cols, 0), scene_corners[2] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 ); line( image, scene_corners[2] + Point2f( object.cols, 0), scene_corners[3] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 ); line( image, scene_corners[3] + Point2f( object.cols, 0), scene_corners[0] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 ); } //Show detected matches imshow( "Good Matches", image ); key = waitKey(1); } return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload