+
96
-

回答

首先确保安装的opencv版本在3.0以上

import cv2
print(cv2.__version__)

然后生成ArUco标记:生成了一个大小为200×200像素的ArUco图并保存为aruco.jpg,打印出来放到摄像头面前作为参考

800_auto

标记检测:通过摄像头检测ArUco标记,并计算像素到实际厘米的比例。

测量其他物体:结合像素到厘米的比例,测量画面中其他物体的宽度和高度。

完整代码

import cv2
import numpy as np

# 生成ArUco字典
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_100)

# 生成ArUco图
aruco_id = 50
aruco_size = 200  # 每个边的像素数
aruco_img = np.zeros((aruco_size, aruco_size), dtype=np.uint8)
aruco_img = cv2.aruco.generateImageMarker(aruco_dict, aruco_id, aruco_size)

# 保存ArUco图像
cv2.imwrite('aruco.jpg', aruco_img)

# 显示生成的ArUco图
cv2.imshow('ArUco Marker', aruco_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 摄像头实时检测其他物体
def measure_object_with_aruco():
    # 定义ArUco标记的真实边长(单位:cm)
    aruco_real_size = 5.0  # 假设真实尺寸为5 cm

    # 打开摄像头
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        if not ret:
            print("无法读取摄像头画面")
            break

        # 转为灰度图
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测ArUco标记
        corners, ids, rejected = cv2.aruco.detectMarkers(gray, aruco_dict)

        # 如果检测到ArUco标记
        if ids is not None:
            cv2.aruco.drawDetectedMarkers(frame, corners, ids)

            # 假设只有一个标记,提取角点
            for corner in corners:
                # 计算ArUco的像素宽度
                aruco_pixel_size = np.linalg.norm(corner[0][0] - corner[0][1])

                # 计算像素到厘米的比例
                pixel_to_cm_ratio = aruco_real_size / aruco_pixel_size

                # 在画面中标注测量结果
                cv2.putText(frame, f"Ratio: {pixel_to_cm_ratio:.2f} cm/pixel",
                            (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

                # 检测其他物体
                # 在实际场景中,这部分需要结合轮廓检测或物体识别算法
                # 假设我们检测到一个矩形区域
                x, y, w, h = 100, 100, 200, 100  # 示例:检测到的物体区域
                object_width_cm = w * pixel_to_cm_ratio
                object_height_cm = h * pixel_to_cm_ratio

                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                cv2.putText(frame, f"Width: {object_width_cm:.2f} cm",
                            (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
                cv2.putText(frame, f"Height: {object_height_cm:.2f} cm",
                            (x, y - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)

        # 显示检测结果
        cv2.imshow('Frame', frame)

        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放摄像头资源
    cap.release()
    cv2.destroyAllWindows()

# 调用函数开始检测
measure_object_with_aruco()

网友回复

我知道答案,我要回答