Mit opencv matchtemplate für blister-Inspektion

Ich arbeite gerade an einem Projekt, in dem ich zu prüfen pharmazeutische blister pack für die fehlenden Tabletten.

Ich versuche zu verwenden opencv ist matchTemplate Funktion. Ich zeige den code, und dann einige Ergebnisse.

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;
}

Und hier sind einige Bilder.

Den "Probe" - Bild eine gute Blisterpackung:

Mit opencv matchtemplate für blister-Inspektion

Der Vorlage beschnitten "Probe" Bild:

Mit opencv matchtemplate für blister-Inspektion

Ergebnis mit "Probe" Bild:

Mit opencv matchtemplate für blister-Inspektion

Fehlende tablet-von diesem Satz erkannt:

Mit opencv matchtemplate für blister-Inspektion

Aber hier sind die Probleme:

Mit opencv matchtemplate für blister-Inspektion

Mit opencv matchtemplate für blister-Inspektion

Ich momentan noch keine Idee, warum dies geschieht. Jede Anregung und/oder Hilfe ist willkommen.

Dem ursprünglichen code, der ich folgte, und verändert hier: http://opencv-code.com/quick-tips/how-to-handle-template-matching-with-multiple-occurences/

  • Ich habe bearbeitet die Bilder für Euch. +1 für eine ausgezeichnete Frage
  • Sterben Sie versuchen es mit verschiedenen Schwellenwerten? Ist 0,8 die höchste, die Sie gehen können? Auch die, die Sie versuchen, die anderen Kreuz-Korrelations-Methoden wie SQDIFF_NORMED statt der CCOEFF_NORMED?
  • Auf der Suche über den code genauer an, Sie konvertieren die Korrelation Ergebnis auf 8 bit und führen Sie dann eine adaptive Schwelle über ihn, so dass Sie das Bild pass zu MinMaxLoc ist schon binarized, so dass die änderung der 0.8 Schwelle wird keine Wirkung haben. Ich bin nicht sicher, was Sie gewinnen, indem Sie dass, nicht auf der Suche für die maxima in der ursprünglichen res_32f um bessere Ergebnisse zu erhalten?
  • Der original-code ausgeführt minMaxLoc auf CV_32FC1 Ergebnis Bild. Aber seit ich versuche zu tun Ungefähre übereinstimmungen, läuft minMaxLoc ohne adaptiveThreshold zuerst gibt zu viele Aussetzer.
Schreibe einen Kommentar