使用opencv matchtemplate进行泡罩包装检查

vua*_*004 10 opencv inspection matchtemplate

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

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

这里有一些照片.

一个好的泡罩包装的"样本"图像:

好包

模板从"样本"图像中裁剪:

模板

带有"样本"图像的结果:

样本结果

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

检测到丢失

但问题是:

失败1

失败2

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

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

小智 0

您是否尝试过 Surf 算法以获得更详细的描述符?您可以尝试收集完整样本图像和空样本图像的描述符。并对检测到的每个对象执行不同的操作。