问题描述
我找到了这个源代码,用于将图像与视频进行比较,它有时可以工作,但大多数时候却没有,我收到此错误消息.
I found this source code for comparing images to a video it works sometimes but most of the times it doesn't and I get this error message.
"OpenCV 错误:断言失败 < == CV_8U :: img.depth<> == CV_32F>&&img.type<> == templ.type<>> in cv::matchTemplate, file ........\opencv\modules\imgproc\src\templmatch.cpp, line 249"
"OpenCV Error: Assertion failed < == CV_8U :: img.depth<> == CV_32F>&& img.type<> == templ.type<>> in cv::matchTemplate, file ........\opencv\modules\imgproc\src\templmatch.cpp, line 249"
我不知道如何解决这个问题..
I have no clue how to fix this..
这是我的源代码,谁能指出我正确的方向?:
Here is my source code can anyone point me in right direction?:
#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <sstream>
using namespace cv;
using namespace std;
Point point1, point2; /* vertical points of the bounding box */
int drag = 0;
Rect rect; /* bounding box */
Mat img, roiImg; /* roiImg - the part of the image in the bounding box */
int select_flag = 0;
bool go_fast = false;
Mat mytemplate;
void track(cv::Mat &img, const cv::Mat &templ, const cv::Rect &r )
{
static int n = 0;
if (select_flag)
{
templ.copyTo(mytemplate);
select_flag = false;
go_fast = true;
}
cv::Mat result;
/// Do the Matching and Normalize
matchTemplate( img, mytemplate, result, CV_TM_SQDIFF_NORMED );
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() );
matchLoc = minLoc;
rectangle( img, matchLoc, Point( matchLoc.x + mytemplate.cols , matchLoc.y + mytemplate.rows ), CV_RGB(255, 255, 255), 3 );
std::cout << matchLoc << "\n";
}
///MouseCallback function
void mouseHandler(int event, int x, int y, int flags, void *param)
{
if (event == CV_EVENT_LBUTTONDOWN && !drag)
{
/* left button clicked. ROI selection begins */
point1 = Point(x, y);
drag = 1;
}
if (event == CV_EVENT_MOUSEMOVE && drag)
{
/* mouse dragged. ROI being selected */
Mat img1 = img.clone();
point2 = Point(x, y);
rectangle(img1, point1, point2, CV_RGB(255, 0, 0), 3, 8, 0);
imshow("image", img1);
}
if (event == CV_EVENT_LBUTTONUP && drag)
{
point2 = Point(x, y);
rect = Rect(point1.x, point1.y, x - point1.x, y - point1.y);
drag = 0;
roiImg = img(rect);
}
if (event == CV_EVENT_LBUTTONUP)
{
/* ROI selected */
select_flag = 1;
drag = 0;
}
}
///Main function
int main()
{
int k;
/*
VideoCapture cap(0);
if (!cap.isOpened())
return 1;
*/
VideoCapture cap;
//cap.open("~/Downloads/opencv-2.4.4/samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video/Megamind.avi");
cap.open("./Megamind.avi");
if (!cap.isOpened())
{
printf("Unable to open video file\n");
return -1;
}
/*
// Set video to 320x240
cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
*/
cap >> img;
imshow("image", img);
freopen("out.txt","w",stdout);
while (1)
{
cap >> img;
if (img.empty())
break;
if (rect.width == 0 && rect.height == 0)
cvSetMouseCallback("image", mouseHandler, NULL);
else
track(img, roiImg, rect);
if (select_flag == 1)
imshow("Template", roiImg);
imshow("image", img);
k = waitKey(go_fast ? 30 : 10000);
if (k == 27)
break;
}
return 0;
}
推荐答案
我认为问题是,如果假设您的 mouseHandler()
函数无法执行您设置 select_flag = 1
变量的最后一个条件,那么你的 track()
函数就不会执行这个
I think the problem is, if suppose your mouseHandler()
function is unable toexecute last condition where you are setting select_flag = 1
variable,then your track()
function would not execute this
if (select_flag)
{
templ.copyTo(mytemplate);
select_flag = false;
go_fast = true;
}
如果它发生了,那么
matchTemplate( img, mytemplate, result, CV_TM_SQDIFF_NORMED );
函数将匹配 img
是 CV_32F
和 mytemplate
是 CV_8U
因为上面是 if(select_flag)
条件未执行,因此 mytemplate
中没有复制任何内容.这就是为什么您会收到此错误 [CV_8U != CV_32F]
,正如您所说,它正在运行一段时间,只是因为您的处理程序有时有效,有时无效.
function is going to match img
which is CV_32F
with mytemplate
which is CV_8U
because above if(select_flag)
condition was not executed so nothing was copied in mytemplate
. thats why you are getting this error [CV_8U != CV_32F]
, and as you said that it is running some time just because your handler some times work and some times not.
这篇关于OpenCV 错误消息(匹配模板)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!