Frage

Ich versuche, Bilder von einem Capture (Webcam) und einige Verarbeitung auf sich mit OpenCV genommen zu konvertieren, aber ich bin eine schwierige Zeit ..

Beim Versuch, das Bild zu konvertieren in Graustufen, stürzt das Programm. (Python.exe funktioniert nicht mehr)

Hier ist das Haupt Schnipsel meines Codes:

newFrameImageGS = cv.CreateImage ((320, 240), cv.IPL_DEPTH_8U, 1)

for i in range(0,5):
    newFrameImage = cv.QueryFrame(ps3eye)
    cv.CvtColor(newFrameImage,newFrameImageGS,cv.CV_BGR2GRAY)
    golfSwing.append(newFrameImageGS)

Wenn ich cvConvertScale Versuchen Sie es mit erhalte ich die Behauptung Fehler:

src.size() == dst.size() && src.channels() == dst.channels()

Das macht Sinn, aber ich bin ziemlich verwirrt auf, wie etwa die Umwandlung der Eingangsbilder von meinem Web-Cam in Bilder zu gehen, die durch Funktionen wie cvUpdateMotionHistory () und cvCalcOpticalFlowLK ()

verwendet werden können,

Irgendwelche Ideen? Danke.

UPDATE:

konvertierte ich das Bild in Graustufen manuell mit diesem:

for row in range(0,newFrameImage.height):
            for col in range(0,newFrameImage.width):
                newFrameImageGS[row,col] = (newFrameImage8U[row,col][0] * 0.114 + # B
                                            newFrameImage8U[row,col][1] * 0.587 + # G
                                            newFrameImage8U[row,col][2] * 0.299)  # R

Aber das dauert eine ganze Weile .. und ich kann immer noch nicht herausfinden, warum cvCvtColor das Programm zum Absturz bringen.

War es hilfreich?

Lösung

Aus irgendeinem Grunde verursacht CvtColor das Programm zum Absturz zu bringen, wenn das Bild in die 8-Bit-Tiefen. Als ich sie auf 32 Bit umgewandelt, stürzte das Programm nicht mehr und alles schien gut zu funktionieren. Ich habe keine Ahnung, warum das so ist, aber zumindest funktioniert es jetzt.

newFrameImage = cv.QueryFrame(ps3eye)

newFrameImage32F = cv.CreateImage((320, 240), cv.IPL_DEPTH_32F, 3)
cv.ConvertScale(newFrameImage,newFrameImage32F)

newFrameImageGS_32F = cv.CreateImage ((320,240), cv.IPL_DEPTH_32F, 1)
cv.CvtColor(newFrameImage32F,newFrameImageGS_32F,cv.CV_RGB2GRAY)

newFrameImageGS = cv.CreateImage ((320,240), cv.IPL_DEPTH_8U, 1)
cv.ConvertScale(newFrameImageGS_32F,newFrameImageGS)

Andere Tipps

Es ist ein häufiger Fehler hier:

Sie erstellen ein einzelnes Bild in der newFrameImageGS Variable vor die Schleife, dann wird ihr Inhalt in der Schleife zu überschreiben, die dann auf eine Liste angehängt wird. Das Ergebnis wird nicht das sein, was man erwarten würde. Die Liste fünf Verweise auf die gleiche Bild Instanz am Ende enthalten, da nur die Objektreferenz auf die Liste angehängt wird, machte keine Kopie des Objekts auf diese Weise. Dieses Bild wird das letzte Bild enthält, so dass Sie fünf dieses Rahmens als ein Ergebnis bekommen, das nicht das, was Sie wollen, ist, denke ich. Bitte überprüfen Sie die Python-Tutorial, wenn es nicht klar, für Sie ist. Sie können dieses Problem lösen, indem Sie die erste Zeile des obigen Codes in den Körper der for-Schleife zu bewegen.

Einen anderen Möglichkeiten, wenn Festsetzung der oben würden Sie nicht helfen:

Die CvtColor Funktion scheint die richtigen für die Umwandlung in Graustufen zu sein, da es zu einer unterschiedlichen Anzahl von Kanälen umwandeln kann.

Nach dieses Handbuch der CvtColor Funktion ein erfordert Zielbild von dem gleichen Datentyp wie die Quelle. Bitte überprüfen Sie, dass newFrameImage ist ein IPL_DEPTH_8U Bild.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top