c – OpenCV cv :: findHomography运行时错误
发布时间:2020-12-16 05:39:05 所属栏目:百科 来源:网络整理
导读:我正在使用从 Features2D + Homography to find a known object教程编译和运行代码,我得到这个 OpenCV Error: Assertion failed (npoints = 0 points2.checkVector(2) == npoints points1.type() == points2.type()) in unknown function,file c:Usersvpw
我正在使用从
Features2D + Homography to find a known object教程编译和运行代码,我得到这个
OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) == npoint s && points1.type() == points2.type()) in unknown function,file c:Usersvpwor kocvopencvmodulescalib3dsrcfundam.cpp,line 1062 运行时错误.调试后我发现程序在findHomography功能崩溃. Unhandled exception at 0x760ab727 in OpenCVTemplateMatch.exe: Microsoft C++ exception: cv::Exception at memory location 0x0029eb3c.. 在OpenCV的Introduction中,“cv命名空间”一章说
我改变了我的代码,并使用明确的命名空间说明符,但问题没有解决.如果可以,请帮我解决这个问题,或者说哪个功能和findHomography相同,不要崩溃程序. 这是我的代码 #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" void readme(); /** @function main */ int main( int argc,char** argv ) { if( argc != 3 ) { readme(); return -1; } cv::Mat img_object = cv::imread( argv[1],CV_LOAD_IMAGE_GRAYSCALE ); cv::Mat img_scene = cv::imread( argv[2],CV_LOAD_IMAGE_GRAYSCALE ); if( !img_object.data || !img_scene.data ) { std::cout<< " --(!) Error reading images " << std::endl; return -1; } //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 400; cv::SurfFeatureDetector detector( minHessian ); std::vector<cv::KeyPoint> keypoints_object,keypoints_scene; detector.detect( img_object,keypoints_object ); detector.detect( img_scene,keypoints_scene ); //-- Step 2: Calculate descriptors (feature vectors) cv::SurfDescriptorExtractor extractor; cv::Mat descriptors_object,descriptors_scene; extractor.compute( img_object,keypoints_object,descriptors_object ); extractor.compute( img_scene,keypoints_scene,descriptors_scene ); //-- Step 3: Matching descriptor vectors using FLANN matcher cv::FlannBasedMatcher matcher; std::vector< cv::DMatch > matches; matcher.match( descriptors_object,descriptors_scene,matches ); double max_dist = 0; double min_dist = 100; //-- Quick calculation of max and min distances between keypoints for( int i = 0; i < descriptors_object.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 ); //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist ) std::vector< cv::DMatch > good_matches; for( int i = 0; i < descriptors_object.rows; i++ ) { if( matches[i].distance < 3*min_dist ) { good_matches.push_back( matches[i]); } } cv::Mat img_matches; cv::drawMatches( img_object,img_scene,good_matches,img_matches,cv::Scalar::all(-1),std::vector<char>(),cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); //-- Localize the object std::vector<cv::Point2f> obj; std::vector<cv::Point2f> scene; for( int i = 0; i < good_matches.size(); i++ ) { //-- Get the keypoints from the good matches obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt ); scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt ); } cv::Mat H = cv::findHomography( obj,scene,CV_RANSAC ); //-- Get the corners from the image_1 ( the object to be "detected" ) std::vector<cv::Point2f> obj_corners(4); obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols,0 ); obj_corners[2] = cvPoint( img_object.cols,img_object.rows ); obj_corners[3] = cvPoint( 0,img_object.rows ); std::vector<cv::Point2f> scene_corners(4); cv::perspectiveTransform( obj_corners,scene_corners,H); //-- Draw lines between the corners (the mapped object in the scene - image_2 ) cv::line( img_matches,scene_corners[0] + cv::Point2f( img_object.cols,0),scene_corners[1] + cv::Point2f( img_object.cols,cv::Scalar(0,255,4 ); cv::line( img_matches,scene_corners[2] + cv::Point2f( img_object.cols,cv::Scalar( 0,scene_corners[3] + cv::Point2f( img_object.cols,4 ); //-- Show detected matches cv::imshow( "Good Matches & Object detection",img_matches ); cv::waitKey(0); return 0; } /** @function readme */ void readme() { std::cout << " Usage: ./SURF_descriptor <img1> <img2>" << std::endl; } 解决方法
今天我遇到与此示例代码相同的问题. @数学咖啡是没有提取的功能,因此obj和场景是空的.我取代了测试图片,它的工作.从纹理样式图像,您不能提取SURF功能.
另一个方法是降低参数minHessianve.g. `int minHessian = 20; 或者通过更改几行来使用FAST特征检测器: //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 15; FastFeatureDetector detector( minHessian ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |