OpenCV 3.0.0とPython 3.4.3を使用して、非常に大きなRGB画像(107162,79553,3)を処理しています。次のコードを使用してサイズを変更しようとしています。
import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
私はこのエラーメッセージが出ました:
"cv2.error:C:\ opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp:3208:エラー:(-215)ssize.area()> 0関数cv: :リサイズ"
Jpg形式で小さなタイルに保存できるため、画像配列に画像コンテンツがあることは確かです。画像のほんの一部をサイズ変更しようとしても問題はなく、正しくサイズ変更された画像になります。 (かなり大きなチャンク(50000,50000,3)を取得しても動作しませんが、(10000,10000,3)チャンクで動作します)
何がこの問題を引き起こす可能性があり、どのようにこれを解決できるのでしょうか?
ありがとう
したがって、問題はmodules\imgproc\src\imgwarp.cpp
の1行に由来することがわかります。
CV_Assert( ssize.area() > 0 );
サイズ変更する画像の行と列の積が2 ^ 31より大きい場合、ssize.area()は負の数になります。これはOpenCVのバグのようで、将来のリリースで修正されることを期待しています。一時的な修正は、この行をコメントアウトしてOpenCVをビルドすることです。理想的ではありませんが、それは私のために機能します。
そして私は最近、上記が幅が高さよりも大きい画像にのみ適用されることを発見しました。高さが幅よりも大きい画像の場合、エラーが発生するのは次の行です。
CV_Assert( dsize.area() > 0 );
したがって、これも同様にコメントアウトする必要があります。
私にとっては、このエラーは実際に真実を語っていたことがわかりました-通常はビデオファイルの「最後の」フレームであるNullイメージのサイズを変更しようとしていたので、アサーションは有効でした。
サイズ変更操作を試行する前に、アサーションを自分で行うための追加のステップがあります。
def getSizedFrame(width, height):
"""Function to return an image with the size I want"""
s, img = self.cam.read()
# Only process valid image frames
if s:
img = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)
return s, img
今、私はエラーを見ません。
また、numpy配列のオブジェクトタイプに注意を払い、.astype('uint8')
を使用して変換すると、問題が解決しました。
私はこれが非常に古いスレッドであることを知っていますが、画像名にスペースがあるために同じ問題を抱えていました。
例えば.
画像名:「hello o.jpg」
奇妙なことに、スペースを削除することで、関数はうまく機能しました。
画像名: "hello_o.jpg"
このタイプのエラーは、サイズ変更で画像を簡単に取得できないためにも発生します。画像のディレクトリが間違っている可能性があります。私の場合、ファイルの場所を指定するときにスラッシュを残し、このエラーはスラッシュの問題が解決されました。
私にとって、次の回避策が機能しました:
ここにコード:
def split_up_resize(arr, res):
"""
function which resizes large array (direct resize yields error (addedtypo))
"""
# compute destination resolution for subarrays
res_1 = (res[0], res[1]/2)
res_2 = (res[0], res[1] - res[1]/2)
# get sub-arrays
arr_1 = arr[0 : len(arr)/2]
arr_2 = arr[len(arr)/2 :]
# resize sub arrays
arr_1 = cv2.resize(arr_1, res_1, interpolation = cv2.INTER_LINEAR)
arr_2 = cv2.resize(arr_2, res_2, interpolation = cv2.INTER_LINEAR)
# init resized array
arr = np.zeros((res[1], res[0]))
# merge resized sub arrays
arr[0 : len(arr)/2] = arr_1
arr[len(arr)/2 :] = arr_2
return arr
MacOSでOpenCVバージョン3.4.3を使用しています。上記と同じエラーが表示されました。
コードを変更しました
frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)
に
frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
今ではうまく機能しています。
すべての画像を読み込んでいたフォルダーの最後に.csvファイルがありました。私がそれを削除したら、それは大丈夫だった
すべての画像であり、他の種類のファイルがないことを確認してください
pythonスクリプト、画像、および訓練されたモデル。
これらの3つのファイルを独自のフォルダーに移動したが他のpythonスクリプトを含むディレクトリーではなく、.
私の場合、画像に誤った変更を加えました。
画像の形状をチェックする問題を見つけることができました。
print img.shape