しないとこうなります
cv2.imwrite関数の場合
#importとかは省略
cv2.imwrite("cannot_write.jpg",img,77.7) #圧縮率が小数だと…
cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'imwrite'
> Overload resolution failed:
> - Can't parse 'params'. Input argument doesn't provide sequence protocol
> - Can't parse 'params'. Input argument doesn't provide sequence protocol
cv2.imencode関数の場合
ret,encoded=cv2.imencode(".jpg",img,(cv2.IMWRITE_JPEG_QUALITY,77.7))
decoded=cv2.imdecode(encoded,flags=cv2.IMREAD_COLOR)
cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'imencode'
> Overload resolution failed:
> - Can't parse 'params'. Sequence item with index 1 has a wrong type
> - Can't parse 'params'. Sequence item with index 1 has a wrong type
はい、以上。
気を付けましょう!
もうちょっと補足
まあ言いたいことはこれだけなんでこのまますっぱり終ってもいいんですが…
さすがにちょっと雑すぎるのでもうちょっと補足しておきます
opencv-python-4.5.3.56までは確かに(浮動)小数も受け付けてくれたはずなのですが、opencv-python-4.5.4.58では唐突に整数じゃないとエラーを吐くようになりました(マイナーアップグレードでいきなりdeplicatedは普通ないはずなんでバグでしょうか?)。
今回は圧縮結果をファイルに書き出さずメモリに置くimencode関数で検証しましたが、cv2.imwriteでもだいたい同じ結果になります(ドキュメントを見る限り共通のパラメータ使ってるみたいなので)。
…まあ、この手のパラメータは大体の人が整数を入れるので問題ないとは思いますが、今まで動いてたものが突然動かなくなった!みたいなことが無きにしも非ずなので気を付けましょう。
あ、ちなみに最近のPython(具体的には3.10以降?)にはopencv4.5.3は入らないみたいなので、直すべきはバージョンではありません。横着せずに必ずコードの方を整数に直してくださいね!
以上、今度こそ終わり!
for foreigners
You must set OpenCV's JPEG-quality is Integer!!!