**** ~~>更新了< ~~ **
嗨,我的代码中出现以下错误:
(我的目标是在名为模板匹配的图像列表上查找特殊图像。 我在visual studio 2012中添加了opencv_world300来调试和发布,但我不知道是什么导致了这个错误)
OpenCV.exe中0x01DDABBA(opencv_world300.dll)的未处理异常: 0xC0000005:访问冲突读取位置0x0000FB97
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
void fastMatchTemplate(cv::Mat& srca, cv::Mat& srcb, cv::Mat& dst, int maxlevel)
{
std::vector<cv::Mat> refs, tpls, results;
cv::buildPyramid(srca, refs, maxlevel);
cv::buildPyramid(srcb, tpls, maxlevel);
cv::Mat ref, tpl, res;
for (int level = maxlevel; level >= 0; level--)
{
ref = refs[level];
tpl = tpls[level];
res = cv::Mat::zeros(ref.size() + cv::Size(1,1) - tpl.size(), CV_32FC1);
if (level == maxlevel)
{
cv::matchTemplate(ref, tpl, res, CV_TM_CCORR_NORMED);
}
else
{
cv::Mat mask;
cv::pyrUp(results.back(), mask);
cv::Mat mask8u;
mask.convertTo(mask8u, CV_8U);
std::vector<std::vector<cv::Point> > contours;
cv::findContours(mask8u, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
for (int i = 0; i < contours.size(); i++)
{
cv::Rect r = cv::boundingRect(contours[i]);
cv::matchTemplate(
ref(r + (tpl.size() - cv::Size(1,1))),
tpl,
res(r),
CV_TM_CCORR_NORMED
);
}
}
// Only keep good matches
cv::threshold(res, res, 0.94, 1., CV_THRESH_TOZERO);
results.push_back(res);
}
res.copyTo(dst);
}
int main()
{
cv::Mat ref = cv::imread("G:\\reference.png");
cv::Mat tpl = cv::imread("G:\\template.png");
if (ref.empty() || tpl.empty())
return -1;
cv::Mat ref_gray, tpl_gray;
cv::cvtColor(ref, ref_gray, CV_BGR2GRAY);
cv::cvtColor(tpl, tpl_gray, CV_BGR2GRAY);
cv::Mat dst;
fastMatchTemplate(ref_gray, tpl_gray, dst, 2);
while (true)
{
double minval, maxval;
cv::Point minloc, maxloc;
cv::minMaxLoc(dst, &minval, &maxval, &minloc, &maxloc);
if (maxval >= 0.9)
{
cv::rectangle(
ref, maxloc,
cv::Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows),
CV_RGB(0,255,0), 2
);
cv::floodFill(
dst, maxloc,
cv::Scalar(0), 0,
cv::Scalar(.1),
cv::Scalar(1.)
);
}
else
break;
}
cv::imshow("result", ref);
cv::waitKey();
return 0;
}
感谢您的帮助!