OpenCV findContours() beschwert sich, wenn verwendet mit schwarz-weiß-Bild
Ich möchte, um eine Kantenerkennung durchzuführen mit folgenden code. Jedoch bekomme ich eine Fehlermeldung, weil der die Bild-Farbtiefe. Dieser Fehler macht in meinen Augen keinen Sinn, da ich konvertieren Sie das Bild richtig zu Graustufen-Bild, und in einem nachfolgenden Schritt zu einem schwarz-weiß-Bild, das ist definitiv richtig funktioniert. Wenn ich Anrufe, findContours bekomme ich eine Fehlermeldung.
import cv2
def bw_scale(file_name, tresh_min, tresh_max):
image = cv2.imread(file_name)
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
#(thresh, im_bw) = cv2.threshold(image, tresh_min, tresh_max, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
(thresh, im_bw) = cv2.threshold(image, tresh_min, tresh_max, 0)
cv2.imwrite('bw_'+file_name, im_bw)
return (thresh, im_bw)
def edge_detect(file_name, tresh_min, tresh_max):
(thresh, im_bw) = bw_scale(file_name, tresh_min, tresh_max)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if __name__ == '__main__':
edge_detect('test.jpg', 128, 255)
Bekomme ich diesen Fehler:
dgrat@linux-v3pk:~> python aoi.py
OpenCV Error: Unsupported format or combination of formats ([Start]FindContours support only 8uC1 and 32sC1 images) in cvStartFindContours, file /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/imgproc/src/contours.cpp, line 196
Traceback (most recent call last):
File "aoi.py", line 25, in <module>
edge_detect('test.jpg', 128, 255)
File "aoi.py", line 19, in edge_detect
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.error: /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/imgproc/src/contours.cpp:196: error: (-210) [Start]FindContours support only 8uC1 and 32sC1 images in function cvStartFindContours
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem in deinem code ist, dass Sie missbrauchen die Rückgabewerte von
cv2.threshold()
.cv2.Schwelle gibt 2 Parameter:
retval
wird verwendet, wenn Binarisierung mit der OTSU-Methode (Rücksendung der optimale Schwellenwert) ansonsten gibt es das gleiche Schwellenwert Wert, den Sie an die Funktion übergeben, 128.0, in Ihrem Fall.
dst
ist die thresholded Ergebnis Bild
In Ihrem code
thresh
ist ein float nicht eine Matte.Ändern:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
zu
contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
BEARBEITEN
Unten finden Sie eine überarbeitete und vereinfachte version des ursprünglichen code mit dem folgenden test Bild.
Daraus ergibt sich folgende bw_test.jpg
Mit folgenden Konturen hervorgehoben cnt_test.jpg
UPDATE
Wenn man bedenkt, dass Sie schon konvertieren Sie Ihr Bild in Graustufen, sollte das problem mit dem channel-Bereich.
FindContours
Unterstützung nur32s
und8u
. Könnten Sie"Bild"."dtype"
, um sicherzustellen, dass Sie bekommen so etwas wieuint8
. Wenn nichtcv2.convertScaleAbs(image)
sollte Ihr problem lösen.URSPRÜNGLICHE ANTWORT
Als Fehler erwähnt
FindContours support only 8uC1 and 32sC1 images
. So möchten möglicherweise verwenden Sie so etwas wiecv.CvtColor
um das Bild zu konvertieren, um einen unterstützten Farbraum.8U
oder32S
.cvtColor
rufen, bevorconvertScaleAbs
da per definitionconvertScaleAbs
wird "Waage, nehmen eine abs-Wert und konvertiert vorzeichenlose 8-bit-Typ"? Daher ist das Endergebnis dercovnertScaleAbs
ist8uC#
.convertScaleAbs
tun, dass für jeden Kanal getrennt, was bedeutet, dass Sie sich nicht ändern, die Anzahl der Kanäle. Wenn du wirklich ein b&w-Bild sollten Sie nur 1-Kanal, wenn Sie haben, D. H. b&w-Bild mit Transparenz haben Sie zusätzliche "alpha" - Kanal. Wenn der Fehler weiterhin besteht, das heißt, dass Sie wahrscheinlich gar nicht konvertieren zu b&w, richtig?