I hope I wrote the question title right because I don't know how to exactly explain it. Consider below's code:
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
Why it has to be wrote for rho,theta in lines[0]:? By this kind of code, I can only obtain one line. I have tried to remove the indexing in lines but I got ValueError: need more than 1 value to unpack. I have tried to print the returned value and it look something like this:
[[[ 287.            1.97222209]]
[[ 885.            1.20427716]]
[[ 881.            1.22173047]]]
I have kinda solved this problem my making the code look like this:
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for i in range(10):
    for rho,theta in lines[i]:
I wonder, what is really happening? Or did I do something wrong here?
lines=cv2.HoughLines(canny,1,numpy.pi/180,120)
for i in lines:
    # print(i)
    rho=i[0][0]
    theta=i[0][1]
    a=numpy.cos(theta)
    b=numpy.sin(theta)
    x0=a*rho
    y0=b*rho
    x1=int(x0+1000*(-b))
    y1=int(y0+1000*(a))
    x2=int(x0-1000*(-b))
    y2=int(y0-1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
cv2.imshow('ss',img)
                        I believe it should be this:
for line in lines:
    rho, theta = line[0]
    ...
this way you loop through all of the values in the lines array, each of which is a line consisting of rho and theta.
It would of course be much bettwe if they structure this as
[ [r0,t0], [r1,t1], ... ,[rn,tn] ] 
but instead they made it confusing by using the extra nested
[ [[r0,t0]], [[r1,t1]], ... ,[[rn,tn]] ] 
form.
The line in lines: loops through giving [[ri,ti]] terms, which you can then make into [ri,ti] via line[0], which you then pass into rho and theta.
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
This works for me on Python2.7 (Anaconda) and OpenCV3.1.0. There seems to be a mismatch between the example in the online documentation provided by OpenCV (1XnX2) and what it actually returns in the HoughLines function (nX1X2).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With