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