首先确保安装的opencv版本在3.0以上
import cv2 print(cv2.__version__)然后生成ArUco标记:生成了一个大小为200×200像素的ArUco图并保存为aruco.jpg,打印出来放到摄像头面前作为参考

标记检测:通过摄像头检测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()
					网友回复
- threejs如何做个三维搭积木的游戏?
- three如何实现标记多个起始路过地点位置后选择旅行工具(飞机汽车高铁等),最后三维模拟行驶动画导出mp4?
- ai实时驱动的3d数字人可视频聊天的开源技术有吗
- swoole+phpfpm如何实现不同域名指向不同目录的多租户模式?
- 如何用go替换nginx实现请求phpfpm解析运行php脚本?
- 有没有浏览器离线运行进行各种文档、图片、视频格式转换的开源工具?
- 如何使用go语言搭建一个web防火墙?
- linux如何检测特定网络协议比如http协议中报文是否包含特点关键词并阻止返回给客户?
- 如果在nginx外过滤包含某些关键词的网页并阻止打开?
- 程序员怎么做副业赚钱?



 
				 
			 
			 
				 
			