首先确保安装的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()
网友回复


