#!/usr/bin/python
# -*- coding: gbk -*-
import cv2
import cv2.aruco as aruco
import math
import time
# 创建ArUco字典,可根据检测的字典家族修改参数
aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
# 设置ArUco标记的大小
marker_size = 5
# 创建ArUco参数
parameters = aruco.DetectorParameters()
# 核心检测函数
def ArUco_detect(frame):
# 将每一帧转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测ArUco标记
corners, ids, rejected = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
# 在检测到的标记上绘制边框和标记ID
if len(corners) > 0:
aruco.drawDetectedMarkers(frame, corners, ids)
# 计算目标距离图像中心点的偏差
center_x = frame.shape[1] // 2
center_y = frame.shape[0] // 2
marker_center_x = (corners[0][0][0][0] + corners[0][0][2][0]) // 2
marker_center_y = (corners[0][0][0][1] + corners[0][0][2][1]) // 2
err_x = marker_center_x - center_x
err_y = marker_center_y - center_y
# 打印相关信息
print("检测到ArUco标识物!")
print("目标距离图像中心点的偏差:err_x = {}, err_y = {}".format(err_x, err_y))
else:
# 打印相关信息
print("未检测到ArUco标识物!")
return frame
# 调用摄像头捕获视频
def get_video():
# 程序主循环计时统计
num_frames = 0
total_time = 0
min_time = float('inf')
max_time = 0
# 调用摄像头,0是默认摄像头,1是外置摄像头
cap = cv2.VideoCapture(0)
# 打开cap
cap.open(0)
#视频尺寸
frame_size = (cap.get(cv2.CAP_PROP_FRAME_WIDTH),
cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# --!!!关键部分,无限循环--
while cap.isOpened():
# 程序主循环计时开始
start_time = time.time()
# 获取画面
success, frame = cap.read()
# 未捕获到,报错并退出
if not success:
print('Error! VideoCapture is not success!')
break
# 调整图像大小
frame = cv2.resize(frame, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_LINEAR)
# 对每帧进行处理
frame = ArUco_detect(frame) # 主循环
# 在图像上绘制分辨率信息
resolution_text = "Resolution: {}x{}".format(frame.shape[1], frame.shape[0])
cv2.putText(frame, resolution_text, (10, 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 2)
# 实时显示图像
cv2.imshow('press q to quit', cv2.resize(frame, (960, 540)))
# 程序主循环计时结束并打印总用时
end_time = time.time()
frame_time = end_time - start_time
print("[INFO] dT: {:.6f} seconds.".format(frame_time))
# 更新计时统计
total_time += frame_time
min_time = min(min_time, frame_time)
max_time = max(max_time, frame_time)
num_frames += 1
# 按q或esc退出
if cv2.waitKey(1) in [ord('q'), 27]:
break
# 关闭图像窗口
cv2.destroyAllWindows()
# 关闭摄像头
cap.release()
# 打印计时统计结果
avg_time = total_time / num_frames
print("[INFO] Total frames: {:d}".format(num_frames))
print("[INFO] Average frame time: {:.5f} seconds".format(avg_time))
print("[INFO] Minimum frame time: {:.5f} seconds".format(min_time))
print("[INFO] Maximum frame time: {:.5f} seconds".format(max_time))
def main():
get_video()
if __name__ == '__main__':
print("ArUco_detection.py is running")
main()
print("ArUco_detection.py shutdown")
USB摄像头实时检测ArUco的python代码树莓派ubuntu可用

请先看我的文章内有效果图:
https://blog.csdn.net/qq_42683787/article/details/135533496?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135533496%22%2C%22source%22%3A%22qq_42683787%22%7D
一个用 Python 实现的实时检测 ArUco 标识的程序,分为基础版和升级版,在ubuntu下连接USB摄像头就能实现实时检测,VMware虚拟机和树莓派都实测可用。
升级版的程序主要添加了以下功能:
1)在检测到标记时,输出相关的打印信息,包括检测到标记,并输出标记中心点与图像中心点的偏差
2)在未检测到标记时,输出相关的打印信息,指示未检测到标记
3)对图像进行放大,增加了可视性
4)添加了程序主循环的计时统计,包括总帧数、平均帧时间、最小帧时间和最大帧时间,最后打印统计结果
5)可自由调节分辨率,且分辨率实时显示在窗口上
———-----

pigheadcookie
- 粉丝: 100
最新资源
- 微信小程序 支付demo python+flask.zip
- 公司激励管理制度.doc
- 192电磁振荡的周期和频率.ppt
- 垂直绿化施工组织方案.doc
- 造价员转正个人工作总结.doc
- 建设工程施工招标手续办理-secret.docx
- 土建、装饰、安装计算套项清单组价范例.doc
- 微信小程序 商城demo.zip
- 公路工程安全管理全套表格94页.doc
- 房地产可行性研究全攻略.doc
- 工程管理部监理资料管理办法.doc
- 【QC7大手法-精选讲议】=QC七大手法培训资料之讲议.ppt
- 白皮书:BIM给幕墙设计带来的技术变革.pdf
- 微信小程序开发过程中积累的一些代码.zip
- 万科施工招标合同-技术规范.doc
- MP-CU, colorui3.x 微信小程序原生版.zip