opencv java match_OpenCV模板匹配函数matchTemplate详解
參考文檔:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#id2
最近一直在做一個logo檢測的項(xiàng)目,檢測logo的有無,接觸到模板匹配。模板匹配雖然精度不高,但選擇恰當(dāng)?shù)姆椒?#xff0c;設(shè)置合適的閾值也能起到一定作用。有的時候我們還能用模板匹配來定位。下面對模板匹配進(jìn)行一個總結(jié)。
模板匹配:模板匹配是一項(xiàng)在一幅圖像中尋找與另一幅模板圖像最匹配(相似)部分的技術(shù).
matchTemplate()參數(shù)詳解
CV_EXPORTS_W voidmatchTemplate( InputArray image, InputArray templ,
OutputArray result,int method );
image:待匹配的源圖像
templ:模板圖像
result:保存結(jié)果的矩陣,我們可以通過minMaxLoc() 確定結(jié)果矩陣的最大值和最小值的位置.
minMaxLoc()函數(shù):查找全局最小和最大稀疏數(shù)組元素并返回其值及其位置
void minMaxLoc(const SparseMat& a, double* minVal,double* maxVal, int* minIdx=0, int* maxIdx=0);
a: 匹配結(jié)果矩陣
&minVal 和 &maxVal: 在矩陣 result 中存儲的最小值和最大值
&minLoc 和 &maxLoc: 在結(jié)果矩陣中最小值和最大值的坐標(biāo).
method :模板匹配的算法
有以下六種:
enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
TM_SQDIFF,TM_SQDIFF_NORMED匹配數(shù)值越低表示匹配效果越好,其它四種反之。
TM_SQDIFF_NORMED,TM_CCORR_NORMED,TM_CCOEFF_NORMED是標(biāo)準(zhǔn)化的匹配,得到的最大值,最小值范圍在0~1之間,其它則需要自己對結(jié)果矩陣歸一化。
不同的方法會得到差異很大的結(jié)果,可以通過測試選擇最合適的方法。
歸一化函數(shù)normalize()
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
模板匹配的大致用法如下:
void templateMatching(const Mat& srcImage,const Mat&templateImage)
{
Mat result;int result_cols = srcImage.cols - templateImage.cols + 1;int result_rows = srcImage.rows - templateImage.rows + 1;if(result_cols < 0 || result_rows < 0)
{
qDebug()<< "Please input correct image!";return;
}
result.create(result_cols, result_rows, CV_32FC1);//enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
matchTemplate(srcImage,templateImage,result,TM_CCOEFF_NORMED); //最好匹配為1,值越小匹配越差
double minVal = -1;doublemaxVal;
Point minLoc;
Point maxLoc;
Point matchLoc;
minMaxLoc(result,&minVal, &maxVal, &minLoc, &maxLoc, Mat());//取大值(視匹配方法而定)//matchLoc = minLoc;
matchLoc =maxLoc;//取大值,值越小表示越匹配
QString str = "Similarity:" + QString::number((maxVal) * 100, 'f', 2) + "%";
qDebug(str.toAscii().data());
Mat mask=srcImage.clone();
//繪制最匹配的區(qū)域
rectangle(mask, matchLoc, Point(matchLoc.x+ templateImage.cols, matchLoc.y + templateImage.rows), Scalar(0, 255, 0), 2, 8, 0);
imshow("mask",mask);
}
分別采用兩個不同顏色的模板圖進(jìn)行測試,得到如下兩組結(jié)果圖,以供參考。
測試結(jié)果1:
????????????
??????????
測試結(jié)果2:
?????????
?????????
總結(jié)
以上是生活随笔為你收集整理的opencv java match_OpenCV模板匹配函数matchTemplate详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 判断精度_随笔⑦ Java中的
- 下一篇: java udp 缓冲区_为什么特定的U