2013-09-30 11 views
10

Próbuję obliczyć Canny Edge na obrazie (ndarray) używając OpenCV z Pythonem.Błąd głębokości w obrazie 2D z OpenCV Python

slice1 = slices[15,:,:] 
slice1 = slice1[40:80,60:100] 
print slice1.shape 
print slice1.dtype 
slicecanny = cv2.Canny(slice1, 1, 100) 

wyjściowa:

(40, 40) 
float64 
... 
error: /Users/jmerkow/code/opencv-2.4.6.1/modules/imgproc/src/canny.cpp:49: 
error: (-215) src.depth() == CV_8U in function Canny 

Z jakiegoś powodu otrzymuję powyższy błąd. Jakieś pomysły, dlaczego?

+0

może trzeba konwertować typ danych do pływaka (CV_32F) od Canny zrobić Gaussa filtrowanie, które (jeśli OpenCV używać Filter2D) wymaga wprowadzania danych pływak. – jgmao

+0

Próbowałem konwertowanie na float32 i integers, a nie szczęście. Próbowałem również: slice2 = cv2.GaussianBlur (slice1, (5,5), 1) slicecanny = cv2.Canny (slice2,1,100) – jmerkow

+0

W wyniku błędu: błąd: (-215) src.depth() == CV_8U w funkcji Canny. Być może byłem kompletny w złym kierunku. Czy próbujesz przekonwertować na CV_8U jako dane wejściowe (nie całkowite, ponieważ liczba całkowita nie jest równa UInt8). – jgmao

Odpowiedz

0

Można obejść ten błąd, zapisując slice1 do pliku, a następnie czyta je

from scipy import ndimage, misc 
misc.imsave('fileName.jpg', slice1) 
image = ndimage.imread('fileName.jpg',0) 
slicecanny = cv2.Canny(image,1,100) 

Nie jest to najbardziej eleganckie rozwiązanie, ale to rozwiązało problem dla mnie

17

Slice1 będą musiały być rzucane lub tworzone jako uint8. CV_8U to tylko alias dla typu danych uint8.

import numpy as np 
slice1Copy = np.uint8(slice1) 
slicecanny = cv2.Canny(slice1Copy,1,100) 
Powiązane problemy