web-dev-qa-db-ja.com

cv2.error:OpenCV(4.0.0)error:(-215:Assertion failed)dst.data ==(uchar *)dst_ptr in function 'cvShowImage'

import numpy as np
import cv2

# first_method
# img = cv2.imread('sample.jpg')
# second_method
# img = np.zeros((1000, 1000, 3), np.int8) 

while True:
    cv2.imshow('sample', img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

上記のコードでは、opencvのimshow()関数を使用して画像を表示しようとしています。最初の方法を使用しようとすると、つまりサンプル画像から配列を作成すると、コードは完全に機能しますが、独自の配列を作成すると、次のエラーが発生します-

PS C:\Users\tanma\Dropbox\Coding\python\AI> python .\test_1.py
Traceback (most recent call last):
  File ".\test_1.py", line 16, in <module>
    cv2.imshow('sample', img)
cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\highgui\src\window_w32.cpp:1230: error: (-215:Assertion failed) dst.data == (uchar*)dst_ptr in function 'cvShowImage'
3
Tanmay Gupta

OpenCV 4.0.0を使用して同様の問題が発生しました。 this によると、バグは4.0.1で修正されているため、opencv-pythonパッケージを更新するだけで済みます。

私の画像は浮動小数点型でしたが、 OpenCV Documentation によると、そのような画像を表示しても問題ありません。

  • 画像が8ビットの符号なしの場合、そのまま表示されます。
  • 画像が16ビット符号なしまたは32ビット整数の場合、ピクセルは256で除算されます。つまり、値の範囲[0,255 * 256]は[0,255]にマッピングされます。
  • 画像が32ビット浮動小数点の場合、ピクセル値は255で乗算されます。つまり、値の範囲[0,1]は[0,255]にマップされます。
3
Butterfly

データ型「int8」が正しくなく、「uint8」、つまり8ビットの符号なし整数に変更する必要があるため、独自の配列はエラーを生成します。これは、色が0〜255の整数で表され、符号付き整数を使用すると、127までの正の整数のみが許可されるためです。

1
user10696835