Sto facendo un progetto in cui devo ispezionare il blister farmaceutico per i tablet mancanti.Uso di opencv matchtemplate per l'ispezione del blister
Sto tentando di utilizzare la funzione matchTemplate di opencv. Lasciami mostrare il codice e quindi alcuni risultati.
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;
}
E qui ci sono alcune immagini.
Il "campione" immagine di un buon blister:
Il modello ritagliata dall'immagine "campione":
Risultato immagine "campione" con:
tablet mancante da questo pacchetto:
Ma qui sono i problemi:
Io attualmente non ho alcuna idea del perché questo accade . Qualsiasi suggerimento e/o aiuto è apprezzato.
Il codice originale che ho seguito e modificato è qui: http://opencv-code.com/quick-tips/how-to-handle-template-matching-with-multiple-occurences/
Ho modificato le immagini per voi. +1 per una domanda eccellente – Bojangles
Die lo provi con diverse soglie? 0,8 il massimo puoi andare? Inoltre, muori provi gli altri metodi di correlazione incrociata come SQDIFF_NORMED invece di CCOEFF_NORMED? – HugoRune
Esaminando il codice più da vicino, si converte il risultato della correlazione in 8 bit e quindi si esegue una soglia adattiva su di esso, quindi l'immagine che si passa a MinMaxLoc è già binarizzata, quindi la modifica della soglia 0.8 non avrà alcun effetto. Non sono sicuro di ciò che guadagni, non cercando i massimi nel res_32f originale ottieni risultati migliori? – HugoRune