LoginSignup
0
0

More than 1 year has passed since last update.

OpenCV(Python)のJPEG圧縮品質(quality)は必ず整数にすること!

Last updated at Posted at 2023-03-24

しないとこうなります

cv2.imwrite関数の場合

imwrite.py
#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関数の場合

imencode.py
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!!!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0