棚卸の時に、バラ錠を数えるのは手間がかかります。全体の重量を1錠当たりの平均の重さで割って推定したりとやってますが、せっかくなのでパソコンに数えてもらうことにしました。
今回使用するのはOpenCVの円検出で、アルゴリズムはHough変換、Pythonで記述してみました。
☆円検出のためのHough変換
直角座標上の点(x,y)を通るすべての円は、円の中心点(centerX,centerY)と半径(radius)で表されます。
直角座標上の点(x,y)を新しい3次元空間(centerX, centerY, radius)上に変換すると、直角座標上の点は3次元空間上の面に対応します。
直角座標上の点が多数ある場合、空間上の多数の曲面が得られます。それらの曲面が共有する点があれば、それらは元の直角座標上では1個の円状に並ぶことになります。
理屈は難しいので、画像の中から円っぽい部分を抽出して円の中心点と半径の情報(centerX,centerY,radius)の集合を取り出してくれるものと考えれば大丈夫ですね。
元の画像は、こちら
こちらを白黒画像に変換、少しぼやかして錠剤の刻印を見えにくくした後、OpenCVのHoughCirclesを使って、円の情報を抽出する流れでいきます。
得られた円の情報を画像に上書きし、円の個数を書き込むと、
錠剤が少し重なった部分も検出できてます。
これでバラ錠を数えてもらえそうです。
ただし、あくまで円の抽出なので、丸くない錠剤やカプセルは正しく数えることはできません。
丸い錠剤しか数えられませんが、少しは実務の役にたてそうなものができそうですね。