C++ OpenCV错误消息(匹配模板)
我发现这个源代码用于将图像与视频进行比较,它有时有效,但大多数情况下无效,我收到了这个错误消息 “OpenCV错误:断言失败<==CV_8U::img.depth==CV_32F> &&img.type==templ.type>在cv::matchTemplate文件中……。\opencv\modules\imgproc\src\templmatch.cpp,第249行“ 我不知道如何解决这个问题 这是我的源代码,有人能给我指出正确的方向吗C++ OpenCV错误消息(匹配模板),c++,opencv,C++,Opencv,我发现这个源代码用于将图像与视频进行比较,它有时有效,但大多数情况下无效,我收到了这个错误消息 “OpenCV错误:断言失败 &&img.type==templ.type>在cv::matchTemplate文件中……。\opencv\modules\imgproc\src\templmatch.cpp,第249行“ 我不知道如何解决这个问题 这是我的源代码,有人能给我指出正确的方向吗 #include <iostream> #include "opencv2/opencv.hpp"
#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;
}
#包括
#包括“opencv2/opencv.hpp”
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
点1,点2;/*边界框的垂直点*/
int-drag=0;
Rect Rect;/*边界框*/
Mat img,Roimg;/*roiImg-图像在边界框中的部分*/
int选择_标志=0;
bool go_fast=false;
Mat-mytemplate;
无效轨迹(cv::Mat和img,常数cv::Mat和TEMP,常数cv::Rect和r)
{
静态int n=0;
如果(选择_标志)
{
temp.copyTo(mytemplate);
选择_flag=false;
快走=真;
}
cv::Mat结果;
///进行匹配和规范化
匹配模板(img、mytemplate、result、CV_TM_SQDIFF_NORMED);
规格化(结果,结果,0,1,NORM_MINMAX,-1,Mat());
///使用minMaxLoc本地化最佳匹配
双最小值;双最大值;点最小值;点最大值;
点匹配;
minMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,Mat());
matchLoc=minLoc;
矩形(img、matchLoc、点(matchLoc.x+mytemplate.cols、matchLoc.y+mytemplate.rows)、CV_RGB(255、255、255)、3);
std::cout-img;
imshow(“图像”,img);
freopen(“out.txt”,“w”,stdout);
而(1)
{
cap>>img;
if(img.empty())
打破
if(rect.width==0&&rect.height==0)
cvSetMouseCallback(“图像”,鼠标手柄,空);
其他的
轨道(img、roiImg、rect);
如果(选择_标志==1)
imshow(“模板”,roimg);
imshow(“图像”,img);
k=等待键(快走?30:10000);
如果(k==27)
打破
}
返回0;
}
我认为问题在于,如果您的鼠标手柄()函数无法
执行上一个设置变量的条件select_flag=1
variable,
然后您的track()
函数将不会执行此操作
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]
,正如您所说,它运行了一段时间,只是因为处理程序有时工作,有时不工作。由于基础数据类型不同,CV_8U和CV_32F不可比较。请参阅以供参考。据我所知,我使用相同的数据类型,如何在代码中检查和更改此数据类型?在代码的第一个函数中调用matchTemplate
之前,您是否可以在img
和templ
上执行imshow()
操作?我认为不需要在处理程序中使用第四个“if”条件,因为您正在设置select_flag=1,您可以将其置于第三个“如果”条件中,因为它们都是相同的事件,但第三个条件中的(&&drag)情况看起来没有多大帮助,所以您在第一个“如果”中将其设置为1。我希望我清楚了(谢谢你的回答,我想你是对的错误信息已经消失了,但是现在我又遇到了一个错误,它有时仍然有效,但大多数时候无效。很抱歉,我无法在此页面中加载屏幕截图。这里是链接,希望你能看一看:错误只是告诉你正在传递一些空的垫子来计算某些内容或重新调整大小有人说img和你传递的坐标是空的或是什么..希望能帮上忙