バラ錠は何個あるかな?

棚卸の時に、バラ錠を数えるのは手間がかかります。全体の重量を1錠当たりの平均の重さで割って推定したりとやってますが、せっかくなのでパソコンに数えてもらうことにしました。
今回使用するのはOpenCVの円検出で、アルゴリズムはHough変換、Pythonで記述してみました。

 

☆円検出のためのHough変換
直角座標上の点(x,y)を通るすべての円は、円の中心点(centerX,centerY)と半径(radius)で表されます。

      f:id:tp5366:20210912030611g:plain
直角座標上の点(x,y)を新しい3次元空間(centerX, centerY, radius)上に変換すると、直角座標上の点は3次元空間上の面に対応します。
直角座標上の点が多数ある場合、空間上の多数の曲面が得られます。それらの曲面が共有する点があれば、それらは元の直角座標上では1個の円状に並ぶことになります。

 

理屈は難しいので、画像の中から円っぽい部分を抽出して円の中心点と半径の情報(centerX,centerY,radius)の集合を取り出してくれるものと考えれば大丈夫ですね。

 

元の画像は、こちら

f:id:tp5366:20210912030913j:plain

こちらを白黒画像に変換、少しぼやかして錠剤の刻印を見えにくくした後、OpenCVのHoughCirclesを使って、円の情報を抽出する流れでいきます。

 

得られた円の情報を画像に上書きし、円の個数を書き込むと、

f:id:tp5366:20210912031158p:plain

錠剤が少し重なった部分も検出できてます。

これでバラ錠を数えてもらえそうです。

 

ただし、あくまで円の抽出なので、丸くない錠剤やカプセルは正しく数えることはできません。

f:id:tp5366:20210912031546j:plain

f:id:tp5366:20210912031559p:plain

 

丸い錠剤しか数えられませんが、少しは実務の役にたてそうなものができそうですね。