web-dev-qa-db-ja.com

cv2 :: imshowへの引数

編集:元のタイトル「numpy配列をcvmatに変換する」は誤りでした-OpenCVは有用なエラーメッセージではなく、ドキュメントを読んでいません!

OpenCV 2の場合、 IPython はデフォルトでNumPy配列を使用します。

cvimage = cv2.imread("image.png") #using OpenCV 2
type(cvimage)
Out: numpy.ndarray  #dtype is uint8

pltimage = plt.imread("image.png")  #using Matplotlib
type(pltimage)
Out: numpy.ndarray   #dtype is float

plt.imshow(cvimage)  # works great

cv2.imshow(cvimage)
TypeError: Required argument 'mat' (pos 2) not found

cv2はデフォルトでNumPy配列を使用するため、cv :: Matコンストラクターはなくなり、NumPyにはcv::Mat配列に変換する関数がありません。

何か案は?

13
Martin Beckett

関数には次のdocstringがあります:imshow(winname, mat) -> None。インタプリタに_cv2.imshow.__doc___と入力すると、doc文字列を表示できます。

cv2.imshow('Image', cvimage)を試してください。

tl; dr:元の質問では、「ウィンドウ名」の最初の引数がありませんでした。 「imshow」は2つのパラメーターを取り、1つだけが指定されました。

19
zarthur

技術的には、NumPy配列(CV2配列に類似)をMatオブジェクト(CV)に変換する方法を質問します。興味のある方は、次の方法でこれを行うことができます。

mat_array = cv.fromarray(numpy_array)

ここで、mat_arrayはMatオブジェクトで、numpy_arrayはNumPy配列またはイメージです。可能であれば、古いCV構造から離れることをお勧めします。 Numpy配列はネイティブPythonでの実装よりもはるかに優れたパフォーマンスを提供します

15
Steve

Matオブジェクトが必要だったのは、C/C++に行列の標準/ネイティブ実装がなかったためです。

ただし、numpyarrayは、その機能の完全な代替品です。したがって、cv2モジュールは、ドキュメントでマトリックスが示されている場合は常にnumpy.arraysを受け入れます。

3
musically_ut