2017-02-09 1 views
0

Очень простой код. Все работало нормально. Я поместил hls_binary и gradx в метод comb_binary.Объект 'numpy.ndarray' не может быть вызван после второго запуска в ноутбуке jupyter

image = mpimg.imread('test_images/test4.jpg') 
comb_binary = comb_binary(image) 
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(28,16)) 
ax1.imshow(image2) 
ax1.set_title('A', fontsize=20) 
ax2.imshow(comb_binary, cmap = 'gray') 
ax2.set_title('B', fontsize=20) 

Но, если я повторно запустить эту ячейку в записной книжке, я буду работать в этой ошибке:

'numpy.ndarray' object is not callable 

первый раз. Он работает: enter image description here

Run что клетка снова: enter image description here

Вот определение всех метода только в случае, если:

def abs_sobel_thresh(img, orient, sobel_kernel, thresh): 
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 
    if orient == 'x': 
     sobel = cv2.Sobel(gray, cv2.CV_64F, 1, 0) 
    else: 
     sobel = cv2.Sobel(gray, cv2.CV_64F, 0, 1) 
    abs_sobel = np.absolute(sobel) 
    scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel)) 
    grad_binary = np.zeros_like(scaled_sobel) 
    grad_binary[(scaled_sobel >= thresh[0]) & (scaled_sobel <= thresh[1])] = 1 
    return grad_binary 

def hls_select(img, thresh): 
    hls = cv2.cvtColor(img, cv2.COLOR_RGB2HLS) 
    s_channel = hls[:,:,2] 
    hls_binary = np.zeros_like(s_channel) 
    hls_binary[(s_channel > thresh[0]) & (s_channel <= thresh[1])] = 1 
    return hls_binary 

def comb_binary(image): 
    gradx = abs_sobel_thresh(image, orient='x', sobel_kernel=9, thresh=(20, 100)) 
    hls_binary = hls_select(image, thresh=(170, 255)) 
    combined_binary_final = np.zeros_like(gradx) 
    combined_binary_final[(hls_binary == 1) | (gradx == 1)] = 1 
    return combined_binary_final 

ответ

3

Каждый раз, когда вы оцениваете ячейку в jupyter, он запускает те команды в среде, которая была построена из предыдущих команд. Итак, когда у вас есть такая линия, как:

comb_binary = comb_binary(image) 

В первый раз все хорошо. Вы просто замените comb_binary (функция) на результат. Теперь comb_binary представляет собой массив numpy ... Однако, если вы попытаетесь снова выполнить ячейку, comb_binary теперь представляет собой массив numpy, а не функцию. Это то же самое, как если бы вы написали:

comb_binary = comb_binary(image) 
comb_binary = comb_binary(image) 

И вы не ожидали бы, что работать в большинстве случаев ;-).

+0

О, как я глуп. Извините, новичок в программном обеспечении. Поэтому, я думаю, мне нужно использовать другое имя переменной, чтобы избежать этой проблемы. – Patrick

+0

@Patrick - Не беспокойтесь об этом. Это происходит со всеми нами. Я столкнулся с этой проблемой с документами LONG jupyter, где я повторно использую имя, которое было определено много лет назад. Это немного странно, потому что вы не видите здесь прежних строк кода. – mgilson

Смежные вопросы