OpenCV中如何计算连续点击的坐标点之间的相邻两点直线距离
实现方案
核心修改逻辑
- 新增全局列表存储所有左键点击的坐标点
- 每次点击左键新增点位后,若列表中存在至少2个点,自动取最后两个相邻点计算欧式距离
- 支持将距离同时打印到控制台、绘制到图片两点中间位置
import cv2 import math # 存储所有左键点击的坐标 points = [] # 打印所有CV2事件名称,不需要可以注释删掉 [print(i) for i in dir(cv2) if 'EVENT' in i] def click_event(event, x, y, flags, params): global points # 左键点击:存坐标、打印、计算相邻距离 if event == cv2.EVENT_LBUTTONDOWN: # 新增当前点位到列表 points.append((x, y)) # 控制台打印坐标 print(f"当前点位坐标:({x}, {y})") # 绘制坐标到图片 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, f"{x},{y}", (x, y), font, 1, (255, 0, 0), 2) # 存在至少两个点时计算相邻距离 if len(points) >= 2: p1 = points[-2] p2 = points[-1] # 计算欧式距离 distance = math.hypot(p2[0] - p1[0], p2[1] - p1[1]) # 控制台打印距离,保留2位小数 print(f"第{len(points)-1}段相邻距离:{distance:.2f}") # 绘制距离到两点中间位置 mid_x = (p1[0] + p2[0]) // 2 mid_y = (p1[1] + p2[1]) // 2 cv2.putText(img, f"{distance:.2f}", (mid_x, mid_y), font, 0.8, (0, 0, 255), 2) # 可选:两点之间画连线,更直观 cv2.line(img, p1, p2, (0, 255, 0), 2) cv2.imshow('image', img) # 右键点击:显示BGR像素值,保留原有功能 if event == cv2.EVENT_RBUTTONDOWN: print(f"当前点位BGR值:({img[y,x,0]}, {img[y,x,1]}, {img[y,x,2]})") font = cv2.FONT_HERSHEY_SIMPLEX b = img[y, x, 0] g = img[y, x, 1] r = img[y, x, 2] cv2.putText(img, f"{b},{g},{r}", (x, y), font, 1, (255, 255, 0), 2) cv2.imshow('image', img) if __name__ == "__main__": # 读取图片,注意修改为自己的图片路径 img = cv2.imread('shirt.jpg', 1) img = cv2.resize(img, (0, 0), None, 0.2, 0.2) cv2.imshow('image', img) cv2.setMouseCallback('image', click_event) cv2.waitKey(0) cv2.destroyAllWindows()
可选调整项
- 不需要两点之间的绿色连线可以删除
cv2.line那行代码 - 距离的显示位置、字体大小、颜色可以自行修改
cv2.putText的对应参数 - 若需要重置所有点位,可新增键盘监听,比如按下c键清空points列表和重置图片即可
内容的提问来源于stack exchange,提问作者Yudhisteer Chintaram
相关产品推荐
相关产品推荐

