web-dev-qa-db-ja.com

「エラー:(-215)ssize.area()> 0関数cv :: resize」でOpenCVサイズ変更が大きな画像で失敗する

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)チャンクで動作します)

何がこの問題を引き起こす可能性があり、どのようにこれを解決できるのでしょうか?

ありがとう

23
user3667217

したがって、問題はmodules\imgproc\src\imgwarp.cppの1行に由来することがわかります。

CV_Assert( ssize.area() > 0 );

サイズ変更する画像の行と列の積が2 ^ 31より大きい場合、ssize.area()は負の数になります。これはOpenCVのバグのようで、将来のリリースで修正されることを期待しています。一時的な修正は、この行をコメントアウトしてOpenCVをビルドすることです。理想的ではありませんが、それは私のために機能します。

そして私は最近、上記が幅が高さよりも大きい画像にのみ適用されることを発見しました。高さが幅よりも大きい画像の場合、エラーが発生するのは次の行です。

CV_Assert( dsize.area() > 0 );

したがって、これも同様にコメントアウトする必要があります。

22
user3667217

私にとっては、このエラーは実際に真実を語っていたことがわかりました-通常はビデオファイルの「最後の」フレームである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

今、私はエラーを見ません。

8
Kelton.Temby

また、numpy配列のオブジェクトタイプに注意を払い、.astype('uint8')を使用して変換すると、問題が解決しました。

2
Attila

私はこれが非常に古いスレッドであることを知っていますが、画像名にスペースがあるために同じ問題を抱えていました。

例えば.

画像名:「hello o.jpg」

奇妙なことに、スペースを削除することで、関数はうまく機能しました。

画像名: "hello_o.jpg"

2
Wanderer

このタイプのエラーは、サイズ変更で画像を簡単に取得できないためにも発生します。画像のディレクトリが間違っている可能性があります。私の場合、ファイルの場所を指定するときにスラッシュを残し、このエラーはスラッシュの問題が解決されました。

1
darkemperorVKO

私にとって、次の回避策が機能しました:

  • 配列を小さなサブ配列に分割します
  • サブ配列のサイズを変更します
  • サブ配列を再度マージします

ここにコード:

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
1
Oliver Wilken

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)    

今ではうまく機能しています。

1
Biranchi

すべての画像を読み込んでいたフォルダーの最後に.csvファイルがありました。私がそれを削除したら、それは大丈夫だった

すべての画像であり、他の種類のファイルがないことを確認してください

0
empoleonrocks

pythonスクリプト、画像、および訓練されたモデル。

これらの3つのファイルを独自のフォルダーに移動したが他のpythonスクリプトを含むディレクトリーではなく、.

0
Shane Rooney

私の場合、画像に誤った変更を加えました。

画像の形状をチェックする問題を見つけることができました。

print img.shape
0
Thomio