Opencv Surf Bug error -
anyone familiar error? tested surf descriptor in real-time , worked after few seconds crashes , got error.
it related when no points detected. run code again , have detected object stays more 2 mins , still no error. when removed object , there no points, crashes again after 40 secs.
#include <stdio.h> #include <iostream> #include <fstream> #include <string> #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" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/legacy/legacy.hpp" using namespace cv; using namespace std; char key = 'a'; int framecount = 0; surffeaturedetector detector(1000); surfdescriptorextractor extractor; flannbasedmatcher matcher; mat frame, des_object, image; mat des_image, img_matches, h; std::vector<keypoint> kp_object; std::vector<point2f> obj_corners(4); std::vector<keypoint> kp_image; std::vector<vector<dmatch > > matches; std::vector<dmatch > good_matches; std::vector<point2f> obj; std::vector<point2f> scene; std::vector<point2f> scene_corners(4); int main() { //reference image mat object = imread("d:/milo.jpg", cv_load_image_grayscale ); if( !object.data ) { std::cout<< "error reading object " << std::endl; return -1; } //compute detectors , descriptors of reference image detector.detect( object, kp_object ); extractor.compute( object, kp_object, des_object ); //create video capture object cvcapture* capture = cvcapturefromcam(0); cvsetcaptureproperty(capture, cv_cap_prop_frame_width, 270); cvsetcaptureproperty(capture, cv_cap_prop_frame_height, 190); //get corners 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 ); //wile loop real time detection while (key != 27) { mat frame; frame = cvqueryframe(capture); if (framecount < 5) { framecount++; continue; } mat des_image, img_matches; std::vector<keypoint> kp_image; std::vector<vector<dmatch > > matches; std::vector<dmatch > good_matches; std::vector<point2f> obj; std::vector<point2f> scene; std::vector<point2f> 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); int goodmatchescounter =0; for(int = 0; < min(des_image.rows-1,(int) matches.size()); i++) //this loop sensitive segfaults { if(((int)matches[i].size()<=2 && (int)matches[i].size()>0) && (matches[i} [0].distance<0.6*(matches[i][1].distance))) { // good_matches.push_back(matches[i][0]); obj.push_back( kp_object[ matches[i][0].queryidx ].pt ); scene.push_back( kp_image[ matches[i][0].trainidx ].pt ); goodmatchescounter++; } } //draw "good" matches // drawmatches( object, kp_object, image, kp_image, good_matches, img_matches, scalar::all(-1), scalar::all(-1), vector<char>(), drawmatchesflags::not_draw_single_points ); if (goodmatchescounter >= 4) { h = findhomography( obj, scene, cv_ransac ); perspectivetransform( obj_corners, scene_corners, h); //draw lines between corners (the mapped object in scene image ) line( image, scene_corners[0], scene_corners[1], scalar( 0, 0, 0), 4 ); line( image, scene_corners[1], scene_corners[2], scalar( 0, 0, 0), 4 ); line( image, scene_corners[2], scene_corners[3], scalar( 0, 0, 0), 4 ); line( image, scene_corners[3], scene_corners[0], scalar( 0, 0, 0), 4 ); } //show detected matches imshow( "good matches", image ); key = waitkey(1); } return 0; }
Comments
Post a Comment