OpenCV Modèle D'Appariement D'Erreur
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
///Global Variables
Mat img; Mat templ; Mat result;
char* image_window = "Source Image";
char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;
///Function Headers
void MatchingMethod( int, void* );
/** @function main */
int main( int argc, char** argv )
{
///Load image and template
img = imread( "test.png", 1 );
templ = imread( "template.png", 1 );
///Create windows
namedWindow( image_window, CV_WINDOW_AUTOSIZE );
namedWindow( result_window, CV_WINDOW_AUTOSIZE );
///Create Trackbar
char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );
MatchingMethod( 0, 0 );
waitKey(0);
return 0;
}
/**
* @function MatchingMethod
* @brief Trackbar callback
*/
void MatchingMethod( int, void* )
{
///Source image to display
Mat img_display;
img.copyTo( img_display );
///Create the result matrix
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create( result_cols, result_rows, CV_32FC1 );
///Do the Matching and Normalize
matchTemplate( img, templ, result, match_method );
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
///Localizing the best match with minMaxLoc
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
///For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
{ matchLoc = minLoc; }
else
{ matchLoc = maxLoc; }
///Show me what you got
rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
imshow( image_window, img_display );
imshow( result_window, result );
return;
}
Tout en utilisant le code d'exemple de opencv, je tombe sur l'erreur suivante. Je suis assez nouveau à QT C++ et je ne sais pas comment déboguer. Normalement en Java, je voudrais utiliser stacktrace et dites-moi où dans le code, je suis vissage mais ce qui semble au point directement à la bibliothèque.
OpenCV Erreur: échec de l'Assertion (corrsize.hauteur <= img.lignes +
templ.lignes - 1 && corrsize.largeur <= img.cols + templ.colonnes - 1) dans
crossCorr, fichier c:/OpenCV/opencv /modules/imgproc/src/templmatch.cpp,
ligne 70 résilier appelé après avoir jeté une instance de " cv::Exception
quel (le): c:/OpenCV/opencv/modules/imgproc/src/templmatch.cpp:70:
erreur: (-215) corrsize.hauteur <= img.lignes + templ.lignes - 1 &&
corrsize.largeur <= img.cols + te mpl.cols - 1 en fonction de crossCorr
Mise à JOUR: Le construit .exe fichier fonctionne, mais pas quand il est lancé à partir de QtCreator. J'ai été en mesure de lancer le construit .exe fichier. J'ai copié les fichiers de la QtSDK/Simulateur/mingw/bin et à ma grande surprise, l'application a été exécuté avec succès. Lorsque je clique sur le bouton Exécuter à l'intérieur de l'intervalle Qt Creator il va jeter le même message d'erreur ci-dessus.
OriginalL'auteur KJW | 2012-07-01
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même message d'erreur quand j'avais donné des noms de fichier incorrect en tant qu'image/templ. Si vous donnez des noms de fichier incorrect, il ne donnerait pas une erreur, mais la création de Tapis serait de taille (0,0). D'où l'erreur d'assertion.
Quand j'ai donné la bonne image, le programme fonctionnait bien.
Ma sortie (avec une image correcte des noms de fichier)
P. S. je suis en utilisant OpenCV 2.4.0
OriginalL'auteur Froyo
Le problème se pose de résultat Mat taille, lorsque vous utilisez la méthode de création de Tapis de premier paramètre est nombre de lignes et le second est nombre de col, de sorte que vous devriez changer
result.create( result_cols, result_rows, CV_32FC1 );
àresult.create( result_rows, result_cols, CV_32FC1 );
exactement la même exception?
oui...j'ai lu les docs et pendant que vous êtes correct, je reçois toujours le même message d'erreur.
ok le fichier exe construit fonctionne, mais pas de QtCreator...étrange.
vérifiez que
imread
pouvez trouver les fichiers d'image, lorsque vous l'exécutez à partir de qtcreator. je pense que c'est lié au répertoire de travail du programme lors de l'exécution dans qtcreator.OriginalL'auteur hamed
J'ai eu le même problème - j'ai seulement pu le faire fonctionner après forceably évolution des deux types, comme suit:
OriginalL'auteur john ktejik