Erreur d'exécution OpenCV cv :: findHomography
J'utilise pour compiler et exécuter du code à partir de Features2D + Homographie pour trouver un objet connu tutoriel, et j'ai obtenu ce
OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) == npoint
s && points1.type() == points2.type()) in unknown function, file c:\Users\vp\wor
k\ocv\opencv\modules\calib3d\src\fundam.cpp, line 1062
erreur d'exécution. après le débogage je trouve que le programme est de s'écraser au findHomography fonction.
Unhandled exception at 0x760ab727 in OpenCVTemplateMatch.exe: Microsoft C++ exception: cv::Exception at memory location 0x0029eb3c..
dans le Introduction de OpenCV, le "cv de l'espace de Noms" chapitre dit que
Certains des actuels ou futurs OpenCV les noms externes peuvent entrer en conflit avec la STL ou d'autres bibliothèques. Dans ce cas, l'utilisation explicite de l'espace de noms des prescripteurs pour résoudre les conflits de nom:
J'ai changé mon code et l'utiliser partout explicite de l'espace de noms des prescripteurs, mais le problème n'est pas résolu. Si vous le pouvez, merci de m'aider dans ce problème, ou de dire qui est la fonction même chose que findHomography, et de ne pas planter le programme.
Et c'est mon code
#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, keypoints_object, img_scene, keypoints_scene,
good_matches, img_matches, cv::Scalar::all(-1), 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, 0), cv::Scalar(0, 255, 0), 4 );
cv::line( img_matches, scene_corners[1] + cv::Point2f( img_object.cols, 0), scene_corners[2] + cv::Point2f( img_object.cols, 0), cv::Scalar( 0, 255, 0), 4 );
cv::line( img_matches, scene_corners[2] + cv::Point2f( img_object.cols, 0), scene_corners[3] + cv::Point2f( img_object.cols, 0), cv::Scalar( 0, 255, 0), 4 );
cv::line( img_matches, scene_corners[3] + cv::Point2f( img_object.cols, 0), scene_corners[0] + cv::Point2f( img_object.cols, 0), cv::Scalar( 0, 255, 0), 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; }
source d'informationauteur haykart
Vous devez vous connecter pour publier un commentaire.
Aujourd'hui, je rencontre le même problème avec cet exemple de code. @mathématiques-café a droite il n'y avait pas de caractéristiques extraites, ainsi obj et de la scène étaient vides. J'ai remplacé les images de test et ça a fonctionné. De texture d'images de style, vous ne pouvez pas extraire de SURF fonctionnalités.
Une autre façon est de diminuer le paramètre minHessianve.g. `int minHessian = 20;
ou utilisez la fonction de détecteur en changeant quelques lignes:
La véritable réponse est dans le message d'erreur:
Lisible de la traduction, vous devez vous acquitter de ces affirmations:
Votre entrée doit avoir un positive nombre de points (dans la pratique, une findHomography besoins de 4 points ou plus).
Votre "objet" et "scène" de la liste de points doivent avoir le même nombre de points.
Votre "objet" et "scène" de la liste de points doivent avoir le même type de points de.
J'ai eu le même problème et j'ai suivi la solution par MMH. Le simple fait d'écrire
cv::Mat H = cv::findHomography( cv::Mat(obj), cv::Mat(scene), CV_RANSAC );
cv::perspectiveTransform( cv::Mat(obj_corners), cv::Mat(scene_corners), H);
résolu le problème.
Plus probablement, le problème est ici:
L'inégalité stricte est pas ce que vous voulez. Si
min_dist == 0
un très bon match, ne tiendra pas compte de tous les zéro points de distance. Remplacer par:et vous devriez voir de bons résultats pour des images qui correspondent bien.
De fermer correctement, je voudrais aussi ajouter, par exemple:
vous avez besoin pour ajouter une condition avant findHomography