最近遇到一個(gè)問題,如何讀取儀表中的指針指向的刻度
解決方法有多種,比如,方案一:模板匹配+邊緣檢測(cè)+霍夫直線檢測(cè),方案二:神將網(wǎng)絡(luò)(CNN)目標(biāo)定位等,
其中CNN就有點(diǎn)麻煩了,需要一定數(shù)量的訓(xùn)練樣本,太麻煩,而方案一太普通,最后我采用了方案三,
方案三:模板匹配+k-means+直線擬合
具體做法如下:
首先說一下模板匹配,它是OpenCV自帶的一個(gè)算法,可以根據(jù)一個(gè)模板圖到目標(biāo)圖上去尋找對(duì)應(yīng)位置,如果模板找的比較好那么效果顯著,這里說一下尋找模板的技巧,模板一定要標(biāo)準(zhǔn)、精準(zhǔn)且特征明顯。
第一次的模板選取如下:
匹配的效果如下:
根據(jù)模板選取的原則我們,必須進(jìn)行兩次匹配才能的到精確和更高準(zhǔn)確率的結(jié)果
第二次的模板如下:
然后在第一次結(jié)果的的基礎(chǔ)上也就是藍(lán)色矩形框區(qū)域進(jìn)行第二次匹配,結(jié)果如下:
下面對(duì)上圖進(jìn)行k-means二值化,由于途中的陰影,所以只截取原圖的0.6(從中心)作為k-means聚類的樣本點(diǎn),然后將聚類結(jié)果應(yīng)用至上圖并重新二值化(聚類結(jié)果為2,求中值,根據(jù)中值二值化),同時(shí)只保留內(nèi)切圓部分,效果如下:
接下來就是擬合直線,擬合直線我采用旋轉(zhuǎn)虛擬直線法,假設(shè)一條直線從右邊0度位置順時(shí)針繞中心旋轉(zhuǎn)當(dāng)它轉(zhuǎn)到指針指向的位置時(shí)重合的最多,此時(shí)記錄下角度,最后根據(jù)角度計(jì)算刻度值。效果圖如下:
最后就讀取到了數(shù)值:
聚類結(jié)果:
[[31.99054054 23.04324324 14.89054054]
[62.69068323 53.56024845 40.05652174]]
重合數(shù)量和對(duì)應(yīng)角度:(1566, 158)
對(duì)應(yīng)刻度:36.005082940886126
源碼如下: