OpenCVで「 (-5:Bad argument) in function ‘rectangle’」と怒られた
OpenCVでcv2.rectangleを実行したところ、「-1: error: (-5:Bad argument) in function ‘rectangle’ > Overload resolution failed: > – Layout of the output array img is incompatible with cv::Mat」というエラーが表示されてしまいました。その対処方法を見ていきます。
目次
問題
割りとハマったデバッグ。cv2.rectangle使って、
こんな感じで書いてたら、
と怒られた。
原因
理由を探していたら、BGR→RGBの変換に問題があり、
スライスでRGB→BGRを変換してしまうと、先程のようなエラーが出る。
対策
.copy()を作ることでエラーは消えます
この理由は、reshape自体がメモリのコピーをせず、viewを作るだけだからだと思われます。
It is not always possible to change the shape of an array without copying the data. If you want an error to be raised when the data is copied, you should assign the new shape to the shape attribute of the array:
https://numpy.org/doc/stable/reference/generated/numpy.reshape.html
また、スライスでRGB→BGRを変換せず、OpenCVの関数で変換した場合はエラーは出ません。
パフォーマンス比較
以下の2つのパターンで速度比較してみます。
- スライスでBGR→RGBを変換する+copy()する
- OpenCVの関数で変換する
ほぼ変わらないようなイメージもありますが、前者はコピーを挟んでいるので遅くなりそうなイメージもあります。やってみましょう。
3回実行してみたところ、
- case_aは7.61秒、7.50秒、7.64秒
- case_bは1.37秒、1.31秒、1.31秒
でした。結構変わりますね(多分メモリコピーが遅いのかと)。
結論
BGR→RGBの変換はOpenCVの関数でやったほうがよさそう
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー