2015-05-04 64 views
1

當我嘗試運行我的代碼,我收到此錯誤:OpenCV的錯誤:斷言失敗的互相關

OpenCV Error: Assertion failed (corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1) in crossCorr, file /Users/ts/documents/opencv-3.0.0-beta/modules/imgproc/src/templmatch.cpp, line 658 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/ts/documents/opencv-3.0.0-beta/modules/imgproc/src/templmatch.cpp:658: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function crossCorr

這裏是源代碼:

#include "opencv2/imgcodecs.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <opencv2/core/core.hpp> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 
using namespace cv; 

/// Global Variables 

Mat img; Mat templ; 
Mat result; 
const char* image_window = "Source Image"; 
const char* result_window = "Result window"; 

int match_method; 
int max_Trackbar = 5; 

/// Function Headers 
void MatchingMethod(int, void*); 

/** 
* @function main 
*/ 

int main(int, char** argv) 
{ 

/// Load image and template 

img = imread(argv[1], 1); 
templ = imread(argv[2], 1); 

/// Create windows 
namedWindow(image_window, WINDOW_AUTOSIZE); 
namedWindow(result_window, WINDOW_AUTOSIZE); 

/// Create Trackbar 
const 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_rows, result_cols, 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 == TM_SQDIFF || match_method == 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; 
} 
+0

你並不需要爲'result'分配空間。嘗試刪除'result.create(result_rows,result_cols,CV_32FC1)' –

+0

我試過你說的,但仍然收到相同的錯誤 –

+0

你的代碼中的哪一行給你Exception? – mirosval

回答

2

確定的圖像通過cv::imread()正確加載?如果您給出完整路徑而不是argv的值,它是否正常工作?

即:

img = imread("C:/original_image.jpg"); 
templ = imread("C:/template_image.jpg"); 
+0

我確實給出了完整路徑,現在我得到了這個內聯錯誤:內聯 void Mat :: create(int _rows,int _cols,int _type) {type&= TYPE_MASK; if(dims <= 2 && rows == _rows && cols == _cols && type()== _type && data) return; int sz [] = {_rows,_cols}; 在setSize,file /Users/ts/documents/opencv-3.0.0-beta/modules/core中創建(2,sz,_type); //其中指示 } OpenCV錯誤:斷言失敗(s> = 0) /src/matrix.cpp,第290行 兩個圖像 –

相關問題