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
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.
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.
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"
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.
Für mich hat die folgende Problemumgehung funktioniert:
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
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
Achten Sie auch auf den Objekttyp Ihres numpy-Arrays und konvertieren Sie ihn mithilfe von .astype('uint8')
. Das Problem wurde für mich behoben.
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.
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.
In meinem Fall habe ich eine falsche Änderung im Bild vorgenommen.
Ich konnte das Problem beim Überprüfen der Bildform feststellen.
print img.shape