我是opencv-python
的新手。我已经通过houghtransformP
找到了图像中的线条。从霍夫变换绘制的线是不连续的,并给出多条线。我只需要为边缘画一条线,然后找到所找到的线之间的“距离”即可。
输出图像如下所示
"""
Created on Fri Nov 8 11:41:16 2019
@author: romanth.chowan
"""
import cv2
import numpy as np
import math
def getSlopeOfLine(line):
xDis = line[0][2] - line[0][0]
if (xDis == 0):
return None
return (line[0][3] - line[0][1]) / xDis
if __name__ == '__main__':
inputFileName_ =r"C:\Users\romanth.chowan\Desktop\opencv\stent spec\2prox.jpeg"
img = cv2.imread(inputFileName_)
img1=cv2.GaussianBlur(img,(5,5),0)
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
edges = cv2.Laplacian(gray,cv2.CV_8UC1) # Laplacian Edge Detection
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 300, 10, 10)
print(len(lines))
parallelLines = []
for a in lines:
for b in lines:
if a is not b:
slopeA = getSlopeOfLine(b)
slopeB = getSlopeOfLine(b)
if slopeA is not None and slopeB is not None:
if 0 <= abs(slopeA - slopeB) <= 10:
parallelLines.append({'lineA': a, 'lineB': b})
for pairs in parallelLines:
lineA = pairs['lineA']
lineB = pairs['lineB']
leftx, boty, rightx, topy = lineA[0]
cv2.line(img, (leftx, boty), (rightx, topy), (0, 0, 255), 2)
left_x, bot_y, right_x, top_y = lineB[0]
cv2.line(img, (left_x, bot_y), (right_x, top_y), (0, 0, 255), 2)
cv2.imwrite('linesImg.jpg', img)
画线后输出图像:
主要是geometric task,不是特定于OpenCV。
对于每一行,都有两个点(x1,y1)和(x2,y2),它们已在getSlopeOfLine(line)
方法中使用。您可以用以下格式表示每一行:
ax + by + c = 0
为此使用两个已知线的点:
(y1 - y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0
注意,平行线具有相同的[[a
和b
,而不同的c
。
d = abs(c2 - c1) / sqrt(a*a + b*b)
当前,您评估线的斜率,从上面的公式我们可以得到:
y = (-b / a)x - c / b
y = kx + b
y = (x1 - x2) / (y1 - y2) * x + (x1y2 - x2y1)
k
tan(alpha)
),而b
是平移。现在,您只需匹配平行线(一个以<< [k
闭合)。您可以考虑将行的移动合并成几条平行的线。