Python 定义线之间的距离

Python 定义线之间的距离,python,opencv,math,line,canny-operator,Python,Opencv,Math,Line,Canny Operator,我对Python非常陌生,我正试图在插图中定义手绘线条,正如我编写的代码所示,在我使用cv2对图像进行模糊、腐蚀和阈值设置之后。精明的是,在代码中,那些在我们眼中显示为线条的线条是平行的 (该行显示如下) 然后我只显示平行的,但我不知道如何定义最小和最大距离值(以像素为单位) 需要帮忙吗 这是我到目前为止写的: import numpy as np import cv2 import time import math start_time = time.time() base = cv2.im

我对Python非常陌生,我正试图在插图中定义手绘线条,正如我编写的代码所示,在我使用cv2对图像进行模糊、腐蚀和阈值设置之后。精明的是,在代码中,那些在我们眼中显示为线条的线条是平行的

(该行显示如下)

然后我只显示平行的,但我不知道如何定义最小和最大距离值(以像素为单位)

需要帮忙吗

这是我到目前为止写的:

import numpy as np
import cv2
import time
import math
start_time = time.time()

base = cv2.imread('prova/eq.jpg')
gray = cv2.cvtColor(base, cv2.COLOR_BGR2GRAY)
img = cv2.bilateralFilter(gray, 9, 90, 1)

kernel = np.ones((2,2), np.uint8)
img_dilation = cv2.dilate(img, kernel, iterations=2)
img_erosion = cv2.erode(img, kernel, iterations=4)

edges = cv2.Canny(img_erosion,cv2.THRESH_BINARY+cv2.THRESH_OTSU,550,apertureSize = 3)
#edges = cv2.Canny(gray,1,250,apertureSize = 3)


cv2.imwrite('edges.jpg',edges)


minLineLength=50
maxLineGap=10
threshold=20

image=edges

lines = cv2.HoughLinesP(image=image,rho=1,theta=np.pi/180, threshold=threshold,lines=np.array([]), minLineLength=minLineLength,maxLineGap=maxLineGap)

angles = []
for x1,y1,x2,y2 in lines[0]:
    theta = math.atan(float(y2 - y1) / (x2 - x1))
    angles.append({'theta': theta, 'p1': (x1, y1), 'p2': (x2, y2)})

for i in range(len(angles)):
    for j in range(i + 1, len(angles)):
        delta = abs(angles[i]['theta'] - angles[j]['theta'])
        if delta < 0.01:
            print(delta)#, angles[i], angles[j])
            cv2.line(base, angles[i]['p1'], angles[i]['p2'], (0, 0, 255), 2, cv2.CV_AA)
            cv2.line(base, angles[j]['p1'], angles[j]['p2'], (255, 0, 0), 2, cv2.CV_AA)






a,b,c = lines.shape
#for i in range(a):
#    cv2.line(base, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 13, cv2.CV_AA)

cv2.imwrite('prova/prova.jpg',base)


print("--- %s seconds ---" % (time.time() - start_time))
将numpy导入为np
进口cv2
导入时间
输入数学
开始时间=time.time()
base=cv2.imread('prova/eq.jpg'))
灰色=cv2.CVT颜色(底色,cv2.COLOR\u BGR2GRAY)
img=cv2。双边滤波器(灰色,9,90,1)
内核=np.ones((2,2),np.uint8)
img_displate=cv2.displate(img,内核,迭代次数=2)
img_腐蚀=cv2.腐蚀(img,内核,迭代次数=4)
边缘=cv2.Canny(img_侵蚀,cv2.THRESH_二进制+cv2.THRESH_OTSU,550,孔径大小=3)
#边缘=cv2.坎尼(灰色,1250,孔径尺寸=3)
cv2.imwrite('edges.jpg',edges)
minLineLength=50
maxLineGap=10
阈值=20
图像=边缘
lines=cv2.HoughLinesP(image=image,rho=1,theta=np.pi/180,threshold=threshold,lines=np.array([]),minLineLength=minLineLength,maxLineGap=maxLineGap)
角度=[]
对于[0]行中的x1、y1、x2、y2:
θ=数学常数(浮点(y2-y1)/(x2-x1))
附加({'theta':theta,'p1':(x1,y1),'p2':(x2,y2)})
对于范围内的i(len(角度)):
对于范围内的j(i+1,len(角度)):
delta=abs(角度[i]['theta']-角度[j]['theta'])
如果δ<0.01:
打印(三角形)#,角度[i],角度[j])
cv2.直线(底面,角度[i]['p1'],角度[i]['p2'],(0,0255),2,cv2.CV_AA)
cv2.直线(底面,角度[j]['p1'],角度[j]['p2'],(255,0,0),2,cv2.CV_AA)
a、 b,c=线条
#对于范围(a)中的i:
#cv2.行(基线,(行[i][0][0],行[i][0][1]),(行[i][0][2],行[i][0][3]),(0,0,255),13,cv2.CV_AA)
cv2.imwrite('prova/prova.jpg',base)
打印(“--%s秒--”%(time.time()-start\u time))
对于平行线(相同角度),绝对
rho
差值等于线之间的距离

Dist = |line1.rho - line2.rho|
如果无法访问行的“rho”参数(如没有p返回的函数HoughLines),请使用

Len = Sqrt((x2-x1)^2 + (y2-y1)^2)
Rho = (x1 * y2 - x2 * y1) / Len

这是我写的,现在应该可以用了

import numpy as np
import cv2
import time
import math
from PIL import Image

start_time = time.time()
base = cv2.imread('img/2009/no.jpg')
#goldouzian5 //  karimzadech4 // kitatani5 watanabe4   baccala5
gray = cv2.cvtColor(base, cv2.COLOR_BGR2GRAY)
img = cv2.bilateralFilter(gray, 11, 80, 11)

kernel = np.ones((2,2), np.uint8)
img_dilation = cv2.dilate(img, kernel, iterations=2)
img_erosion = cv2.erode(img, kernel, iterations=5)



edges = cv2.Canny(img_erosion,cv2.THRESH_BINARY+cv2.THRESH_OTSU,550,apertureSize = 3)
cv2.imwrite('edges.jpg',edges)

base = base



minLineLength=50
maxLineGap=11
threshold=25
image=edges

lines = cv2.HoughLinesP(image=image,rho=1,theta=np.pi/180, threshold=threshold,lines=np.array([]), minLineLength=minLineLength,maxLineGap=maxLineGap)
print("--- %s seconds (hough) ---" % (time.time() - start_time))

def segmentProjectedLength(p1, p2, q1, q2, theta):
    rot = lambda p: (p[0] * math.cos(theta) + p[1] * math.sin(theta), p[0] * math.sin(theta) - p[1] * math.cos(theta))
    p1 = rot(p1)
    p2 = rot(p2)
    q1 = rot(q1)
    q2 = rot(q2)

    minP = min(p1[0], p2[0])
    maxP = max(p1[0], p2[0])
    minQ = min(q1[0], q2[0])
    maxQ = max(q1[0], q2[0])

    return (min(maxP, maxQ) - max(minP, minQ)) if maxP >= minQ and maxQ >= minP else 0

lines = lines[0] if lines is not None else []
angles = []
for x1,y1,x2,y2 in lines:
    theta = math.atan(float(y2 - y1) / (x2 - x1)) if (x2 != x1) else math.pi / 2
    Rho = (x1 * y2 - x2 * y1) / math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
    angles.append({'theta': theta, 'p1': (x1, y1), 'p2': (x2, y2), 'rho': Rho})
    #cv2.line(base, (x1, y1), (x2, y2), (0, 255, 0), 2, cv2.CV_AA)
print('--- %d lines found ---' % len(angles))
for i in range(len(angles)):
    for j in range(i + 1, len(angles)):

        delta = abs(angles[i]['theta'] - angles[j]['theta'])
        dist = abs(angles[i]['rho'] - angles[j]['rho'])
        projLength = segmentProjectedLength(angles[i]['p1'], angles[i]['p2'], angles[j]['p1'], angles[j]['p2'], angles[j]['theta'])

        if delta < 0.05 and dist > 5 and dist < 20 and projLength > 5:

                #print  (dist)
                cv2.line(base, angles[i]['p1'], angles[i]['p2'], (0, 0, 255), 2, cv2.CV_AA)
                cv2.line(base, angles[j]['p1'], angles[j]['p2'], (255, 0, 0), 2, cv2.CV_AA)
cv2.imwrite('prova/prova.jpg',base)
print("--- %s seconds (complete) ---" % (time.time() - start_time))
将numpy导入为np
进口cv2
导入时间
输入数学
从PIL导入图像
开始时间=time.time()
base=cv2.imread('img/2009/no.jpg')
#goldouzian5//karimzadech4//kitatani5 watanabe4学士学位
灰色=cv2.CVT颜色(底色,cv2.COLOR\u BGR2GRAY)
img=cv2。双边滤波器(灰色,11,80,11)
内核=np.ones((2,2),np.uint8)
img_displate=cv2.displate(img,内核,迭代次数=2)
img_腐蚀=cv2.腐蚀(img,内核,迭代次数=5)
边缘=cv2.Canny(img_侵蚀,cv2.THRESH_二进制+cv2.THRESH_OTSU,550,孔径大小=3)
cv2.imwrite('edges.jpg',edges)
基数=基数
minLineLength=50
maxLineGap=11
阈值=25
图像=边缘
lines=cv2.HoughLinesP(image=image,rho=1,theta=np.pi/180,threshold=threshold,lines=np.array([]),minLineLength=minLineLength,maxLineGap=maxLineGap)
打印(“--%s秒(hough)---”%(time.time()-start\u time))
def分段投影长度(p1、p2、q1、q2、θ):
rot=lambda p:(p[0]*数学cos(θ)+p[1]*数学sin(θ),p[0]*数学sin(θ)-p[1]*数学cos(θ))
p1=旋转(p1)
p2=rot(p2)
q1=rot(q1)
q2=腐烂(q2)
minP=min(p1[0],p2[0])
maxP=max(p1[0],p2[0])
minQ=最小值(q1[0],q2[0])
maxQ=max(q1[0],q2[0])
如果maxP>=minQ且maxQ>=minP,则返回(min(maxP,maxQ)-max(minP,minQ)),否则返回0
行=行[0],如果行不是None-else[]
角度=[]
对于直线中的x1、y1、x2、y2:
θ=math.atan(float(y2-y1)/(x2-x1))如果(x2!=x1)else math.pi/2
Rho=(x1*y2-x2*y1)/math.sqrt((x2-x1)**2+(y2-y1)**2)
附加({'theta':theta'p1':(x1,y1),'p2':(x2,y2),'rho':rho})
#cv2.线(基,(x1,y1),(x2,y2),(0255,0),2,cv2.CV_AA)
打印('-%d行找到----'%len(角度))
对于范围内的i(len(角度)):
对于范围内的j(i+1,len(角度)):
delta=abs(角度[i]['theta']-角度[j]['theta'])
dist=abs(角度[i]['rho']-角度[j]['rho'])
projLength=分段投影长度(角度[i]['p1'],角度[i]['p2'],角度[j]['p1'],角度[j]['p2'],角度[j]['theta']))
如果增量<0.05且距离>5且距离<20且项目长度>5:
#打印(区)
cv2.直线(底面,角度[i]['p1'],角度[i]['p2'],(0,0255),2,cv2.CV_AA)
cv2.直线(底面,角度[j]['p1'],角度[j]['p2'],(255,0,0),2,cv2.CV_AA)
cv2.imwrite('prova/prova.jpg',base)
打印(“--%s秒(完成)---”%(time.time()-start\u time))

你能帮我用python写吗?我对python了解不够<代码>^2正在我的记录中平方