前言
由于实验需要对图中的角度进行实时的测量角度 ,所以我整了一个在图中显示的量角器。
一、如何操作
运行程序会形成三个点,一个顶点,将顶点和边与要测量的目标拖动并对应就可以得到角度。
二、代码
代码如下(示例):
import cv2
import numpy as np
import math
# 初始化变量
angle = 0
moving_point = None
angle_points = [(100, 100), (150, 150), (150, 100)] # 初始的三个点
dragging = False
# 计算夹角
def calculate_angle(p1, p2, p3):
vector1 = (p1[0] - p2[0], p1[1] - p2[1])
vector2 = (p3[0] - p2[0], p3[1] - p2[1])
magnitude1 = math.sqrt(vector1[0]**2 + vector1[1]**2)
magnitude2 = math.sqrt(vector2[0]**2 + vector2[1]**2)
dot_product = vector1[0]*vector2[0] + vector1[1]*vector2[1]
cos_angle = dot_product / (magnitude1 * magnitude2)
angle = math.degrees(math.acos(cos_angle))
return angle
# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):
global moving_point, dragging, angle_points
if event == cv2.EVENT_LBUTTONDOWN:
for i, point in enumerate(angle_points):
if abs(x - point[0]) < 10 and abs(y - point[1]) < 10:
moving_point = i
dragging = True
break
elif event == cv2.EVENT_MOUSEMOVE:
if dragging and moving_point is not None:
angle_points[moving_point] = (x, y)
redraw_image()
print(f"当前夹角:{calculate_angle(angle_points[0], angle_points[1], angle_points[2]):.2f} 度")
elif event == cv2.EVENT_LBUTTONUP:
dragging = False
moving_point = None
# 重绘图像
def redraw_image():
img_copy = img.copy()
cv2.line(img_copy, angle_points[0], angle_points[1], (0, 255, 0), 2)
cv2.line(img_copy, angle_points[1], angle_points[2], (0, 255, 0), 2)
for point in angle_points:
cv2.circle(img_copy, point, 5, (0, 0, 255), -1)
cv2.imshow("Image", img_copy)
# 读取图像
img = cv2.imread("liangjiaoqi.png")
if img is None:
raise Exception("无法读取图像,请检查路径。")
# 显示图像并设置回调
cv2.imshow("Image", img)
cv2.setMouseCallback("Image", mouse_callback)
redraw_image()
cv2.waitKey(0)
cv2.destroyAllWindows()
将文件名换成你的文件名就行。
img = cv2.imread("liangjiaoqi.png")