4

i wanna detect this rectangles lines using hough transform, enter image description here

here is the opencv code :

import cv2
import numpy as np

img = cv2.imread('C:/Users/hp/rectangles.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

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)

cv2.imwrite('houghlines3.jpg',img)

but it only detects one line, how can i detect all lines ?

after testing this code and choosing these parameters :

    import cv2
    import numpy as np


        img = cv2.imread('dave.jpg')
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        edges = cv2.Canny(gray,50,150,apertureSize = 3)
        minLineLength = 100
        maxLineGap = 10
        lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
        for x1,y1,x2,y2 in lines[0]:
            cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

        cv2.imwrite('houghlines5.jpg',img)

i got this result :

enter image description here

i changed parameters but that one line isnt detected, how should i change parameters to make that line detected?

Nasim
  • 161
  • 1
  • 3
  • 12
  • can plot the edges image using imshow ? I guess is the raw edge was not detected. so you have to change 50,150 paramter value to detect all raw edge – Dr Yuan Shenghai Jun 02 '19 at 11:02
  • 1
    u sure the line is detected well in the canny? if it is detected well, then high chance resulting pixel level location of the line is wrong. its not straight enough for the hough to pick up. Its just a few parameter to tweak – Dr Yuan Shenghai Jun 02 '19 at 14:22
  • 1
    PS you can also use other line detection class such as opencv LSD, Split and Merge. To use hough with high level of robustness, you have to write quite a few routing to detect multiple small line with small angle difference and merge them (either by iterating through houghline with multiple paramters, or merge them from outside). – Dr Yuan Shenghai Jun 02 '19 at 14:53
  • 1
    Surely you should be using `findContours()` for this? – Mark Setchell Jun 02 '19 at 16:20

1 Answers1

4

enter image description here

I believe a better approach to detecting the lines of the rectangles is to use cv2.findContours() and Canny edge detection.

import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 130, 255, 1)

cnts = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(image,[c], 0, (0,255,0), 3)

cv2.imshow("result", image)
cv2.waitKey(0)
nathancy
  • 42,661
  • 14
  • 115
  • 137
  • 1
    it is a homework , and has asked to find lines by using hough transform – Nasim Jun 04 '19 at 06:01
  • Hi, @nathancy, I think you an be of help to me. Could you have a look at [this SO](https://stackoverflow.com/questions/73076340/extract-rectangular-shape-id-card-area-from-an-image)? – bit_scientist Jul 26 '22 at 04:35