it-swarm.com.de

OpenCV-Größenänderung schlägt bei großem Bild mit "Fehler: (-215) ssize.area ()> in Funktion cv :: resize" fehl

Ich verwende OpenCV 3.0.0 und Python 3.4.3, um ein sehr großes RGB-Bild (107162,79553,3) zu verarbeiten. Während ich versuche, die Größe unter Verwendung des folgenden Codes zu ändern: 

import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

Ich hatte folgende Fehlermeldung:
"cv2.error: C:\opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp: 3208: Fehler: (-215) ssize.area ()> 0 in Funktion cv :: resize "

Ich bin mir sicher, dass das Bild-Array Bildinhalte enthält, da ich sie im JPG-Format in kleine Kacheln speichern kann. Wenn ich versuche, nur einen kleinen Teil des Bildes zu verkleinern, gibt es kein Problem, und am Ende bekomme ich ein korrekt angepasstes Bild. (Ein ziemlich großes Stück (50000,50000,3) zu nehmen funktioniert zwar immer noch nicht, aber es funktioniert auf einem Stück (10000,10000,3). 

Ich frage mich, was dieses Problem verursachen könnte und wie ich dieses Problem lösen kann. 

Vielen Dank

20
user3667217

Es stellt sich also heraus, dass das Problem aus einer Zeile in modules\imgproc\src\imgwarp.cpp stammt:

CV_Assert( ssize.area() > 0 );

Wenn das Produkt aus Zeilen und Spalten des zu ändernden Bildes größer als 2 ^ 31 ist, führt ssize.area () zu einer negativen Zahl. Dies scheint ein Fehler in OpenCV zu sein und wird hoffentlich in der zukünftigen Version behoben. Eine vorübergehende Lösung besteht darin, OpenCV mit dieser auskommentierten Zeile zu erstellen. Obwohl es nicht ideal ist, funktioniert es für mich. 

Und ich habe erst kürzlich herausgefunden, dass das Obige nur für Bilder gilt, deren Breite größer als die Höhe ist. Bei Bildern mit einer Höhe, die größer als die Breite ist, führt die folgende Zeile zu Fehlern: 

CV_Assert( dsize.area() > 0 );

Das muss also auch auskommentiert werden. 

19
user3667217

Es stellte sich für mich heraus, dass dieser Fehler tatsächlich die Wahrheit gesagt hat - ich habe versucht, ein Null-Bild zu ändern, das normalerweise der "letzte" Frame einer Videodatei war. 

Jetzt habe ich noch einen zusätzlichen Schritt, bevor ich die Größenänderung durchführe, nämlich die Assertion selbst durchzuführen:

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

Jetzt sehe ich den Fehler nicht.

6
Kelton.Temby

Ich weiß, dass dies ein sehr alter Thread ist, aber ich hatte das gleiche Problem, was durch Leerzeichen in den Bildnamen verursacht wurde.

z.B.

Bildname: "Hallo o.jpg"

seltsamerweise funktionierte die Funktion durch das Entfernen der Leerzeichen einwandfrei.

Bildname: "hello_o.jpg"

2
Wanderer

Diese Art von Fehler tritt auch auf, weil die Größenänderung nicht in der Lage ist, das Bild auf einfache Weise abzurufen. Das Verzeichnis des Bildes ist möglicherweise falsch Schrägstrich Problem wurde gelöst.

1
darkemperorVKO

Für mich hat die folgende Problemumgehung funktioniert:

  • das Array in kleinere Subarrays aufteilen
  • Ändern Sie die Größe der Sub-Arrays
  • verbinden Sie die Sub-Arrays erneut

Hier der Code:

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
Oli Blum

Es stellte sich heraus, dass ich am Ende des Ordners eine CSV-Datei hatte, aus der ich alle Bilder gelesen hatte

Stellen Sie sicher, dass es sich um alle Bilder handelt und dass Sie keinen anderen Dateityp haben

0
empoleonrocks

Achten Sie auch auf den Objekttyp Ihres numpy-Arrays und konvertieren Sie ihn mithilfe von .astype('uint8'). Das Problem wurde für mich behoben.

0
Attila

Ich habe mit 3 Dateien gearbeitet: Das Python-Skript, das Image und das trainierte Modell.

Alles hat funktioniert, als ich habe diese 3 Dateien in einen eigenen Ordner verschoben statt in das Verzeichnis mit den anderen Python-Skripts.

0
Shane Rooney

Ich habe OpenCV Version 3.4.3 unter MacOS.

Ich habe meinen Code von geändert

frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)   

zu

frame = cv2.resize(frame, None, fx=0.5, fy=0.5)    

Jetzt funktioniert es gut für mich.

0
Biranchi

In meinem Fall habe ich eine falsche Änderung im Bild vorgenommen.

Ich konnte das Problem beim Überprüfen der Bildform feststellen.

print img.shape
0
Thomio