Python量角器


前言

由于实验需要对图中的角度进行实时的测量角度 ,所以我整了一个在图中显示的量角器。


一、如何操作

运行程序会形成三个点,一个顶点,将顶点和边与要测量的目标拖动并对应就可以得到角度。
在这里插入图片描述

二、代码

代码如下(示例):

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")
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值