gpt4 book ai didi

opencv - 使用 opencv matchtemplate 进行泡罩包装检测

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:14 27 4
gpt4 key购买 nike

我正在做一个项目,我必须在其中检查药物泡罩包装是否缺少药片。

我正在尝试使用 opencv 的 matchTemplate 函数。让我展示代码,然后展示一些结果。

int match(string filename, string templatename)
{
Mat ref = cv::imread(filename + ".jpg");
Mat tpl = cv::imread(templatename + ".jpg");
if (ref.empty() || tpl.empty())
{
cout << "Error reading file(s)!" << endl;
return -1;
}

imshow("file", ref);
imshow("template", tpl);

Mat res_32f(ref.rows - tpl.rows + 1, ref.cols - tpl.cols + 1, CV_32FC1);
matchTemplate(ref, tpl, res_32f, CV_TM_CCOEFF_NORMED);

Mat res;
res_32f.convertTo(res, CV_8U, 255.0);
imshow("result", res);

int size = ((tpl.cols + tpl.rows) / 4) * 2 + 1; //force size to be odd
adaptiveThreshold(res, res, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, size, -128);
imshow("result_thresh", res);

while (true)
{
double minval, maxval, threshold = 0.8;
Point minloc, maxloc;
minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

if (maxval >= threshold)
{
rectangle(ref, maxloc, Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows), CV_RGB(0,255,0), 2);
floodFill(res, maxloc, 0); //mark drawn blob
}
else
break;
}

imshow("final", ref);
waitKey(0);

return 0;
}

还有一些图片。

优质泡罩包装的“示例”图片:

good pack

从“示例”图像裁剪的模板:

template

带有“样本”图像的结果:

sample result

检测到此包装中缺少平板电脑:

missing detected

但是问题来了:

fail 1

fail 2

我目前不知道为什么会这样。任何建议和/或帮助表示赞赏。

我遵循并修改的原始代码在这里:http://opencv-code.com/quick-tips/how-to-handle-template-matching-with-multiple-occurences/

最佳答案

我找到了解决我自己问题的方法。我只需要在图像和模板上应用 Canny 边缘检测器,然后再将它们扔给 matchTemplate 函数。完整的工作代码:

int match(string filename, string templatename)
{
Mat ref = cv::imread(filename + ".jpg");
Mat tpl = cv::imread(templatename + ".jpg");
if(ref.empty() || tpl.empty())
{
cout << "Error reading file(s)!" << endl;
return -1;
}

Mat gref, gtpl;
cvtColor(ref, gref, CV_BGR2GRAY);
cvtColor(tpl, gtpl, CV_BGR2GRAY);

const int low_canny = 110;
Canny(gref, gref, low_canny, low_canny*3);
Canny(gtpl, gtpl, low_canny, low_canny*3);

imshow("file", gref);
imshow("template", gtpl);

Mat res_32f(ref.rows - tpl.rows + 1, ref.cols - tpl.cols + 1, CV_32FC1);
matchTemplate(gref, gtpl, res_32f, CV_TM_CCOEFF_NORMED);

Mat res;
res_32f.convertTo(res, CV_8U, 255.0);
imshow("result", res);

int size = ((tpl.cols + tpl.rows) / 4) * 2 + 1; //force size to be odd
adaptiveThreshold(res, res, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, size, -64);
imshow("result_thresh", res);

while(1)
{
double minval, maxval;
Point minloc, maxloc;
minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

if(maxval > 0)
{
rectangle(ref, maxloc, Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows), Scalar(0,255,0), 2);
floodFill(res, maxloc, 0); //mark drawn blob
}
else
break;
}

imshow("final", ref);
waitKey(0);

return 0;
}

欢迎提出任何改进建议。我非常关心我的代码的性能和稳健性,所以我正在寻找所有的想法。

现在有两件事让我感到不安:较低的 Canny 阈值和 adaptiveThreshold 函数的负常数。

编辑:这是你问的结果:)

模板:

template

测试图像,缺少 2 个平板电脑:

test, missing 2 tablets

模板和测试图像的精明结果:

Canny of template

Canny of test

matchTemplate 结果(转换为 CV_8U):

matchTemplate

自适应阈值之后:

thresholded

最终结果:

result

关于opencv - 使用 opencv matchtemplate 进行泡罩包装检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180630/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com