python求线段长度_如何用python求线段长度

本文介绍了如何使用Python计算线段长度,包括创建Point和LineString类,并实现移动和计算多个点之间距离的功能。示例代码中,通过zip和starmap计算了线段的总长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想用Python计算线段的长度(任意数量)。我使用了下面的代码,但是我遇到元组不能将减法作为操作数。我怎样才能克服呢?我想知道我是否错过了任何重要的Python概念。在from itertools import starmap

import math

class Point(object):

def __init__(self,x,y):

self.x=x

self.y=y

def move(self,dx,dy):

self.x+=dx

self.y+=dy

class LineString(object):

def __init__(self,*args): # A method with any number of arguments, args

self.args=[Point(*args) for p in args] # A list of Points

def length(self):

pairs=zip(self.args, self.args[1:])

return sum(starmap(distance,pairs))

def distance(p1, p2):

a = p1.x,p1.y

b = p2.x,p2.y

print (math.sqrt((a[0]-b[0])**2-(a[1]-b[1])**2))

# calculates distance between two given points p1 and p2

return math.sqrt((a** 2)+ (b** 2))

if __name__ == '__main__':

# Tests for LineString

# ===================================

lin1 = LineString((1, 1), (0, 2))

assert lin1.length() == sqrt(2.0)

lin1.move(-1, -1) # Move by -1 and -1 for x and y respectively

assert lin1[0].y == 0 # Inspect the y value of the start point.

# Implement this by overloading __getitem__(self, key) in your class.

lin2 = LineString((1, 1), (1, 2), (2, 2))

assert lin2.length() == 2.0

lin2.move(-1, -1) # Move by -1 and -1 for x and y respectively

assert lin2.length() == 2.0

assert lin2[-1].x == 1 # Inspect the x value of the end point.

print ('Success! Line tests passed!')

### 使用 OpenCV 和 Python 计算图像中线段长度 为了计算图像中的线段长度,可以采用霍夫变换来检测线条,并利用几何方法测量这些线段的实际像素距离。具体过程如下: 对于给定的一幅含有线段的图片,在应用边缘检测算法(如Canny Edge Detection)之后,可以通过Hough Line Transform找到所有的直线段[^1]。 一旦获得了代表每条线段两端坐标的数组后,就可以调用函数 `DIST` 来获取它们之间的欧几里得距离作为该线段长度。此功能已经在提供的代码片段中有定义[^3]。 下面是一个完整的例子展示如何读取一张包含多条线段的图片并打印出所发现每一根线的具体长度: ```python import cv2 import numpy as np import math def DIST(p1, p2): ''' func:两点间距离 @para p1,p2:点坐标(x1,y1),(x2,y2) @para return:距离 ''' return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) # 加载灰度图模式下的测试图像 img = cv2.imread('lines.jpg', cv2.IMREAD_GRAYSCALE) # 应用Canny边缘探测器寻找边界 edges = cv2.Canny(img, 50, 150, apertureSize=3) # 执行标准霍夫变换查找无限长的线 lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=100, minLineLength=100, maxLineGap=10) if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] # 绘制线到原始彩色图像上(如果需要的话) img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2.line(img_color, (x1, y1), (x2, y2), (0, 255, 0), 2) length = DIST([x1, y1], [x2, y2]) print(f'Line from ({x1},{y1}) to ({x2},{y2}), Length={length:.2f} pixels') else: print("No lines were found.") cv2.imshow("Detected Lines", img_color) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述脚本首先加载了一张名为 'lines.jpg' 的黑白照片,接着执行了一系列预处理步骤以准备数据供后续分析;最后运用了 Hough 变换技术识别出了可能存在的线段,并逐个报告其端点位置以及相应的长度值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值