我正在尝试在同一张图片中查找2个正方形的中心,如下所示:
我能够检测到构成正方形的线。我的输出如下:
如此处记录的找到多边形的中心,我使用moments
来找到中心。这就是我所做的。
import cv2
import numpy as np
img = cv2.imread('images/sq.png', 0)
gray = img
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)
ret,thresh = cv2.threshold(blur_gray,100,255,0)
low_threshold = 50
high_threshold = 150
edges = cv2.Canny(thresh, low_threshold, high_threshold)
rho = 1 # distance resolution in pixels of the Hough grid
theta = np.pi / 180 # angular resolution in radians of the Hough grid
threshold = 3 # minimum number of votes (intersections in Hough grid cell)
min_line_length = 50 # minimum number of pixels making up a line
max_line_gap = 20 # maximum gap in pixels between connectable line segments
line_image = np.copy(img) * 0 # creating a blank to draw lines on
# Run Hough on edge detected image
# Output "lines" is an array containing endpoints of detected line segments
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
min_line_length, max_line_gap)
for line in lines:
for x1,y1,x2,y2 in line:
cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),2)
print("x1 {} y1 {} x2 {} y2 {}".format(x1,y1,x2,y2))
lines_edges = cv2.addWeighted(img, 0.5, line_image, 1, 0)
line_image_gray = cv2.cvtColor(line_image, cv2.COLOR_RGB2GRAY)
M = cv2.moments(line_image_gray)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(lines_edges, (cx, cy), 5, (0, 0, 255), 1)
cv2.imshow("res", lines_edges)
cv2.imshow("line_image", line_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
但这会找到2个检测到的正方形之间的中心。仅使用霍夫方法,如何找到每个正方形的中心?
答案 0 :(得分:0)
您可以将此方法与以下代码结合使用,以查找哪些线属于同一正方形:
How can I check if two segments intersect?
其中“行”是已识别行的列表,而相交(第1行,第2行)是使用上述链接中的过程的函数
printenv Log__Type // -> value from docker-compose
export Log__Type=new value
printenv Log__Type // -> new value
这为您提供了包含其一部分线的“正方形”。然后,您可以分别在每个位置上使用矩函数。
答案 1 :(得分:0)
鉴于您有使用Hough变换的要求,建议您为它准备更好的图像。 Canny边缘检测器将在此处检测黑线的内边缘和外边缘,从而导致Hough检测到两对线。
请遵循以下步骤:
查找所有黑色(或接近黑色)像素。例如,所有三个RGB分量均低于50的像素。这将自行返回平方。
应用形态学细化(或骨架)将其变成正方形的1像素厚的轮廓。
对结果应用霍夫变换,并检测线段。
正确的预处理使Hough变换更容易设置,因为会有更多范围的参数产生正确的结果。
接下来,找到在相同像素处开始或结束并具有少许公差的段(即,起点或终点位于彼此之间的几个像素之内),以确定哪些线以相同的形状属于一起。