opencv根据直线方程求交点坐标
生活随笔
收集整理的這篇文章主要介紹了
opencv根据直线方程求交点坐标
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
# 均值濾波
dst_jz = cv2.blur(dst2,(9,9))
cv2.imshow("dst_sb", dst_jz)# 高斯濾波
dst_gs = cv2.GaussianBlur(dst2,(5,5),0,0)
cv2.imshow("dst_sb", dst_gs)# 雙邊濾波
dst_sb = cv2.bilateralFilter(dst2, 15, 155, 100)
cv2.imshow("dst_sb", dst_sb)# 腐蝕
k = np.ones((9,9),np.uint8)
det_fs = cv2.erode(dst2,k)
cv2.imshow("det_fs", det_fs)
?已知兩條直線四個點(diǎn)(兩個點(diǎn)構(gòu)成一條直線),求這兩條直線的交點(diǎn)坐標(biāo)。
# 求直線方程的參數(shù)
def equation_parameters(x0, y0, x1, y1):a = y0 - y1b = x1 - x0c = x0*y1 - x1*y0return a, b, c# 構(gòu)造直線方程并求交點(diǎn)
def linear_equation_point(line1, line2):a0, b0, c0 = equation_parameters(*line1)a1, b1, c1 = equation_parameters(*line2)D = a0 * b1 - a1 * b0if D == 0:return Nonex = (b0 * c1 - b1 * c0) / Dy = (a1 * c0 - a0 * c1) / Dreturn x, yif __name__ == '__main__':line1 = [5, 5, 10, 10]line2 = [9, 9, 10, 0]cross_pt = linear_equation_point(line1, line2)print(cross_pt)
"""
功能:導(dǎo)入圖片,求兩直線交點(diǎn),再求直線距離
"""import cv2
import numpy as np
import mathclass MainWindow():def __init__(self):super().__init__()img = cv2.imread("D:/Users/xuyf2/Desktop/project_C/cap_2/2cp1638667470.jpg")img = img[357:517, 613:779]# cv2.imwrite("D:/Users/xuyf2/Desktop/project_C/cap_2/" + '2' + ".jpg", img)edges = self.image_processing(img) # 圖像處理line_zuobiao = self.line_detection(edges) # 尋找直線坐標(biāo)# 求交點(diǎn)crossover_point1 = self.linear_equation_point(line_zuobiao[0], line_zuobiao[1])crossover_point2 = self.linear_equation_point(line_zuobiao[1], line_zuobiao[2])crossover_point3 = self.linear_equation_point(line_zuobiao[2], line_zuobiao[3])crossover_point4 = self.linear_equation_point(line_zuobiao[3], line_zuobiao[4])# print(list(crossover_point1),list(crossover_point2),list(crossover_point3),list(crossover_point4))# 求長度long1 = self.width_calculation(list(crossover_point1),list(crossover_point2))long2 = self.width_calculation(list(crossover_point3), list(crossover_point4))act_long1 = self.actual_width_jier(long1)act_long2 = self.actual_width_jier(long2)print('極耳像素點(diǎn)長度:',long1,long2)print('極耳實(shí)際長度:', act_long1, act_long2)# 畫線self.LineAtext1(img, crossover_point1, crossover_point2, crossover_point3, crossover_point4)cv2.imshow("LineAtext1", img)# 圖像處理def image_processing(self, img):# 灰度處理gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Otsu方法t2, dst2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 中值濾波scr1 = cv2.medianBlur(dst2, 9)cv2.imshow("3", scr1)# 邊緣檢測edges = cv2.Canny(scr1, 150, 250, L2gradient=True)cv2.imshow("bianyuanjiance", edges)return edgesdef line_detection(self,img):lines = cv2.HoughLinesP(img, 1, np.pi / 180, 30, minLineLength=30, maxLineGap=30)zuobiaos = []for line in lines:x1, y1, x2, y2 = line[0]zuobiao = [x1, y1, x2, y2]zuobiaos.append(zuobiao)print('直線檢測出線段數(shù):',len(zuobiaos))# cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)# cv2.imshow("img1", img)zuobiaos_new = sorted({tuple(x): x for x in zuobiaos[:]}.values())# print(zuobiaos_new)return zuobiaos_new# 計算兩點(diǎn)之間長度def width_calculation(self,list_point1,list_point2):p1 = np.array(list_point1)p2 = np.array(list_point2)p3 = p2 - p1long = math.hypot(p3[0], p3[1])long = ('%.3f' % long)return long# 求直線方程的參數(shù)def equation_parameters(self, x0, y0, x1, y1):a = y0 - y1b = x1 - x0c = x0*y1 - x1*y0return a, b, c# 構(gòu)造直線方程并求交點(diǎn)def linear_equation_point(self, line1, line2):a0, b0, c0 = self.equation_parameters(*line1)a1, b1, c1 = self.equation_parameters(*line2)D = a0 * b1 - a1 * b0if D == 0:return Nonex = (b0 * c1 - b1 * c0) / Dy = (a1 * c0 - a0 * c1) / Dreturn x, y# 畫線def LineAtext1(self, image, a, b, c, d):line_color = (0, 0, 255)line_thin = 2cv2.line(image, (int(a[0]),int(a[1])), (int(b[0]),int(b[1])), line_color, line_thin)cv2.line(image, (int(c[0]),int(c[1])), (int(d[0]),int(d[1])), line_color, line_thin)return imagedef actual_width_jier(self, long):width = (16.0 * float(long)) / 89.0width = float('%.2f' % width)return widthif __name__ == '__main__':mainWindow = MainWindow()cv2.waitKey(0)cv2.destroyAllWindows()
總結(jié)
以上是生活随笔為你收集整理的opencv根据直线方程求交点坐标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永劫无间怎么升龙?
- 下一篇: 鼋头渚现场买票需要身份证吗