プログラミング

cvHouthCircleでThe source image must be 8-bit, single-channel in functionエラーが出たときにまず確認するところ

今回も引き続き以下のOpenCVによる画像処理講座を受けていく。

www.udemy.com

セクション4、レクチャー30の「直線・円の検出」において、
自分がドハマリしてしまったポイントがタイトルの通りのエラーである。

エラーメッセージは以下の通り。

これについては、コードを見比べて解決した。
画像を読み込むときのcv2.imread関数においてフラグの設定が欠けていた。

このフラグという概念はあまり認識していなかったのだが、
画像処理においてはグレースケール画像での処理が一般的なため、
cv2.IMREAD_GRAYSCALE関数で処理する設定をcv2.imread関数の中のフラグにおいて設定できるようにしたものと思われる。

ちゃんとOpenCV-Pythonチュートリアルには以下の通り記載がある。

画像ファイルを読み込むには cv2.imread() という関数を使います.
画像ファイルが作業ディレクトリ内に保存されている場合はファイル名のみを指定し,
そうでない場合は絶対パスもしくは適切な相対パスで指定しなければいけません.

第2引数は画像の読み込み方法を指定するためのフラグです.

cv2.IMREAD_COLOR : カラー画像として読み込む.画像の透明度は無視される.デフォルト値
cv2.IMREAD_GRAYSCALE : グレースケール画像として読み込む
cv2.IMREAD_UNCHANGED : アルファチャンネルも含めた画像として読み込む
Note 上記のフラグを使う代わりに,単に1, 0, -1 の整数値を与えて指定することもできます.

画像を扱う — OpenCV-Python Tutorials 1 documentation

そのようなわけで、画像を読み込むときの正しいコードは以下の通り。

一応、名前をつけるときのお約束として例えばimg2_gの「g」はグレースケールを意味する。
そして画像の保存場所の後ろにちゃんと「0」というフラグを立てよう。