user3778289
user3778289

Reputation: 323

getting error in canny edge detection

i am trying to write a code using opencv python that automatically get canny threshold values instead of doing them manually every time.

img= cv2.imread('micro.png',0)
output = np.zeros(img.shape, img.dtype)
# Otsu's thresholding
ret2,highthresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
lowthresh=0.1*highthres
edges = cv2.Canny(img,output,lowthresh,highthresh)
cv2.imshow('canny',edges)

i am getting this error "File "test2.py", line 14, in edges = cv2.Canny(img,output,lowthresh,highthresh) TypeError: only length-1 arrays can be converted to Python scalars"

can anyone help me to sort out this error.thankx in advance

Upvotes: 0

Views: 4017

Answers (2)

Shane
Shane

Reputation: 11

You are running:

cv2.Canny(img,output,lowthresh,highthresh)

It is looking for

cv2.Canny(img,lowthresh,highthresh,output)

I think the ordering changed in some version, because I have seen references to both.

Upvotes: 1

Andrew Johnson
Andrew Johnson

Reputation: 3186

It seems like cv2.threshold returns the detected edges, and Canny applies them to the image. The code below worked for me and gave me some nice detected edges in my image.

import cv2

cv2.namedWindow('canny demo')

img= cv2.imread('micro.png',0)
ret2,detected_edges = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
edges = cv2.Canny(detected_edges,0.1,1.0)
dst = cv2.bitwise_and(img,img,mask = edges)
cv2.imshow('canny',dst)

if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

Upvotes: 2

Related Questions