また、同じエラーの人のために(3.4.2、3.4.3で出ると思います)。
- Issue(https://github.com/opencv/opencv/issues/12349)
- Pull Request(https://github.com/opencv/opencv/pull/12351)
OpenCVのPythonのサンプルが動作しなかったので、初めてIssueとPull requestを出して無事マージされた😀https://t.co/khfq10obJC— nb.o (@Nextremer_nb_o) 2018年8月31日
発端
OpenCV 3.4.2でYOLOv3がサポートされたので、動作確認しようと思ったのが発端。しかし、サンプルを動かしたのだが、エラーとなってしまった。。。
あれ?— nb.o (@Nextremer_nb_o) 2018年8月23日
OpenCV 3.4.2でYolo v3のサンプルがエラーでちっとも動かない・・・😭
なにがいけないーー?
サンプルはPython(samples/dnn/object_detection.py)。
自分の環境は以下。
- OpenCV => 3.4.2
- OS => Fedora 28
- Compiler => GCC 8.1
- Python3 => 3.6.6
実行したときのコマンド
$ python3 object_detection.py --input=./test.jpg --model=./yolov3.weights --config=./yolov3.cfg --classes=./object_detection_classes_coco.txt --scale=0.00392 --width=416 --height=416
発生したエラー
Traceback (most recent call last): File "object_detection.py", line 196, in postprocess(frame, outs) File "object_detection.py", line 162, in postprocess drawPred(classIds[i], confidences[i], left, top, left + width, top + height) File "object_detection.py", line 73, in drawPred cv.rectangle(frame, (left, top), (right, bottom), (0, 255, 0)) TypeError: integer argument expected, got float
調べてみた
ググってみても、同じようにコケている人もおらず、C++では動いていそう。
怒られている理由は「cv.rectangleの引数には整数を指定しろ!」。
確かに座標(left, top, right, bottom)は整数である必要がある。
おそらく座標のパラメータが整数でない型なんだなーと思っていた。
実際はleftとtopが浮動小数点だった。
はい。。。Pythonさん、すいません。。。
最初は環境??とか思っていたが、原因はサンプルの以下の2行が原因だとわかった。
https://github.com/opencv/opencv/blob/3.4.2/samples/dnn/object_detection.py#L145-L146
Python3の場合、整数除算の結果は浮動小数点である。
(Python2は整数除算の結果は整数なので、Python2で実行すると問題ない)
なので、整数型に変換してあげると動いた!
怒られている理由は「cv.rectangleの引数には整数を指定しろ!」。
確かに座標(left, top, right, bottom)は整数である必要がある。
おそらく座標のパラメータが整数でない型なんだなーと思っていた。
実際はleftとtopが浮動小数点だった。
はい。。。Pythonさん、すいません。。。
なんとなくわかってきた🤔— nb.o (@Nextremer_nb_o) 2018年8月24日
OpenCVのサンプル(samples/dnn/object_detection.py)で、int型を要求しているところにfloat型が突っ込まれているからだ。
float⇒intに変換すると動く。自分の環境か?
最初は環境??とか思っていたが、原因はサンプルの以下の2行が原因だとわかった。
https://github.com/opencv/opencv/blob/3.4.2/samples/dnn/object_detection.py#L145-L146
left = center_x - width / 2 top = center_y - height / 2
Python3の場合、整数除算の結果は浮動小数点である。
(Python2は整数除算の結果は整数なので、Python2で実行すると問題ない)
なので、整数型に変換してあげると動いた!
left = int(center_x - width / 2) top = int(center_y - height / 2)
あー— nb.o (@Nextremer_nb_o) 2018年8月24日
Python3で実行しているので、除算の結果はfloatだ
Python2との違いでコケているんだ
IssueとPull Requestを出してみる
今までお世話になったOpenCVなので、勇気をだして初めてのIssueとPull Requestを送ってみることにした。
Pull Requestを出すにあたって公式も含めて以下を参考にした(ありがとうございます)。
- https://github.com/opencv/opencv/wiki/How_to_contribute
- http://tessy.org/wiki/index.php?OpenCV%A4%CE%A5%D0%A5%B0%28Pull%20Request%29
- https://qiita.com/tomoaki_teshima/items/d98822529327ccdc5ae8
Issue、Pull Requestとも反応が早いことにびっくり!
簡単だったこともあと思うが、1日もせず、マージされクローズしてしまった。
初めて出してみた感想は
- 英語、やっぱりだめ、、、もっと勉強しないと
(Google翻訳すごい) - 焦ってはだめ
(Enterキーを間違って押してIssueのタイトルが変になってしまった) - 反応早い!ソッコーで反応くる
- しかも、解決方法を複数提案
あ、、、そういう方法もあるねと勉強になる! - good first issueなんてラベルがつくとテンション上がる!
- マージされたらテンションMax!!
- あれ?Issue誰クローズするの?僕??と思っていたら、クローズされた
(これなにがただしいんだろう?) - はじめの一歩はとても戸惑うが、機会があれば次もチャレンジ!
次のリリース(3.4.4)が楽しみ!