web-dev-qa-db-ja.com

Python opencv2(cv2)ラッパーは画像サイズを取得しますか?

Python OpenCV(numpy)のcv2ラッパーで画像のサイズを取得する方法。 numpy.shape()よりも正しい方法がありますか。フォーマット寸法で取得する方法:(幅、高さ)リスト?

ありがとう

78
xercool

cv2は、画像の操作にnumpyを使用するため、画像のサイズを取得するための適切かつ最良の方法は、numpy.shapeを使用することです。 BGRイメージで作業していると仮定すると、次の例があります。

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

バイナリイメージを使用していた場合、imgには2つのディメンションがあるため、コードをheight, width = img.shapeに変更する必要があります。

162
jabaldonedo

このサイズを取得する「より良い」方法はないのではないかと心配していますが、それほど苦痛はありません。

もちろん、コードはバイナリ/モノラル画像とマルチチャンネル画像の両方に対して安全でなければなりませんが、画像の主要な次元は常にnumpy配列の形状で最初に来ます。読みやすさを選択する場合、またはこれを入力する必要がない場合は、関数でラップして、好きな名前を付けることができます。 cv_size

import numpy as np
import cv2

# ...

def cv_size(img):
    return Tuple(img.shape[1::-1])

端末/ ipythonを使用している場合は、ラムダで表現することもできます。

>>> cv_size = lambda img: Tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

defを使用して関数を記述することは、インタラクティブに作業している間は楽しくありません。

編集

もともと[:2]を使用しても問題ないと思っていましたが、numpyの形状は(height, width[, depth])であり、(width, height)が必要です。 cv2.resizeは期待するので、[1::-1]を使用する必要があります。 [:2]よりも記憶に残りません。とにかく逆スライスを覚えているのは誰ですか?

17
Tomasz Gandor