实时检测Aruco标签坐标及位姿opencv-python4.6和4.7版本

news2025/1/15 7:54:45

先说opencv-contrib-python==4.7.0.72时,aruco下面带曲线,但是程序也能跑,可以跑检测的,对比4.6版本需要改三个函数

4.6装opencv-contrib-python

4.7装opencv-contrib-python

1

cv2.aruco.Dictionary_get()

cv2.aruco.getPredefinedDictionary

2

cv2.aruco.DetectorParameters_create

cv2.aruco.DetectorParameters

3

cv2.aruco.drawAxis

cv2.drawFrameAxes

4

cv2.aruco.detectMarkers

cv2.aruco.ArucoDetector.detectMarkers

 备注:第4个程序是不装contrib时,只装opencv-python库时用到的,前面的文章提到过,aruco的库在4.7版本中,已经放到主库了,只用opencv-python的库即可,但是用cv2.aruco.ArucoDetector.detectMarkers这个函数的时候报错,所以,还是卸载掉了opencv-python,安装了opencv-contrib-python的库。

哪位高手在4.7版本中没有用contrib库,欢迎留言

python3.9的环境中安装opencv-contrib-python==4.7.0.72时代码

下面程序中引用的“标定文件.yaml”,在上一篇文章中有详细说明及代码,可以直接运行得到

import numpy as np
import time
import cv2
import cv2.aruco as aruco
#这个程序是好的,可以跑的

#相机内参
import yaml

file_path = ("./标定文件.yaml")
# file_path = ("/home/pi/PycharmProjects/pythonProject/opencv_test/变焦相机标定参数.yaml")
###加载文件路径###

with open(file_path, "r") as file:
    parameter = yaml.load(file.read(), Loader=yaml.Loader)
    mtx = parameter['camera_matrix']
    dist = parameter['dist_coeff']
    camera_u = parameter['camera_u']
    camera_v = parameter['camera_v']
    mtx = np.array(mtx)
    dist = np.array(dist)


#打开笔记本摄像头
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
font = cv2.FONT_HERSHEY_SIMPLEX #font for displaying text (below)

#num = 0
while True:
    start = time.time()
    ret, frame = cap.read()
    # operations on the frame come here

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_4X4_1000)
    parameters =  aruco.DetectorParameters()

    #lists of ids and the corners beloning to each id
    corners, ids, rejectedImgPoints = aruco.detectMarkers(gray,
                                                          aruco_dict,
                                                          parameters=parameters)

#    if ids != None:
    if ids is not None:

        rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 0.05, mtx, dist)
        # Estimate pose of each marker and return the values rvet and tvec---different
        # from camera coeficcients
        (rvec-tvec).any() # get rid of that nasty numpy value array error

#        aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis
#        aruco.drawDetectedMarkers(frame, corners) #Draw A square around the markers

        for i in range(rvec.shape[0]):
            cv2.drawFrameAxes(frame, mtx, dist, rvec[i, :, :], tvec[i, :, :], 0.03)
            aruco.drawDetectedMarkers(frame, corners)
        #显示ID,rvec,tvec, 旋转向量和平移向量
        cv2.putText(frame, "Id: " + str(ids), (10,40), font, 0.5, (0, 0, 255),1,cv2.LINE_AA)
        cv2.putText(frame, "rvec: " + str(rvec[i, :, :]), (10, 60), font, 0.5, (0, 255, 0), 2, cv2.LINE_AA)
        cv2.putText(frame, "tvec: " + str(tvec[i, :, :]), (10,80), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)


    else:

        cv2.putText(frame, "No Ids", (10,64), font, 1, (0,255,0),2,cv2.LINE_AA)

    end = time.time()
    # 计算帧率并显示
    cv2.putText(frame, "rate: " + str(1 / (end-start )), (10, 120), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
    cv2.imshow("frame",frame)

    key = cv2.waitKey(1)

    if key == 27:         # 按esc键退出
        print('esc break...')
        cap.release()
        cv2.destroyAllWindows()
        break

    if key == ord(' '):   # 按空格键保存
#        num = num + 1
#        filename = "frames_%s.jpg" % num  # 保存一张图像
        filename = str(time.time())[:10] + ".jpg"
        cv2.imwrite(filename, frame)

检测效果图

 在python3.9的环境中安装opencv-contrib-python==4.5.4.60时,代码


import numpy as np
import time
import cv2
import cv2.aruco as aruco

#相机内参
import yaml

file_path = ("./标定文件.yaml")
# file_path = ("/home/pi/PycharmProjects/pythonProject/opencv_test/变焦相机标定参数.yaml")
###加载文件路径###

with open(file_path, "r") as file:
    parameter = yaml.load(file.read(), Loader=yaml.Loader)
    mtx = parameter['camera_matrix']
    dist = parameter['dist_coeff']
    camera_u = parameter['camera_u']
    camera_v = parameter['camera_v']
    mtx = np.array(mtx)
    dist = np.array(dist)


#windows
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
font = cv2.FONT_HERSHEY_SIMPLEX #font for displaying text (below)

#num = 0
while True:
    start = time.time()
    ret, frame = cap.read()
    # operations on the frame come here

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_4X4_1000)
    parameters =  aruco.DetectorParameters_create()


    #lists of ids and the corners beloning to each id
    corners, ids, rejectedImgPoints = aruco.detectMarkers(gray,
                                                          aruco_dict,
                                                          parameters=parameters)


    if ids is not None:

        rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 0.05, mtx, dist)
        # Estimate pose of each marker and return the values rvet and tvec---different
        # from camera coeficcients
        (rvec-tvec).any() # get rid of that nasty numpy value array error

#        aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis
#        aruco.drawDetectedMarkers(frame, corners) #Draw A square around the markers

        for i in range(rvec.shape[0]):
            cv2.drawFrameAxes(frame, mtx, dist, rvec[i, :, :], tvec[i, :, :], 0.03)
            aruco.drawDetectedMarkers(frame, corners)
        #显示ID,rvec,tvec, 旋转向量和平移向量
        cv2.putText(frame, "Id: " + str(ids), (10,40), font, 0.5, (0, 0, 255),1,cv2.LINE_AA)
        cv2.putText(frame, "rvec: " + str(rvec[i, :, :]), (10, 60), font, 0.5, (0, 255, 0), 2, cv2.LINE_AA)
        cv2.putText(frame, "tvec: " + str(tvec[i, :, :]), (10,80), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)


    else:

        cv2.putText(frame, "No Ids", (10,64), font, 1, (0,255,0),2,cv2.LINE_AA)

    end = time.time()
    # 计算并显示帧率
    cv2.putText(frame, "rate: " + str(1 / (end-start )), (10, 120), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
    cv2.imshow("frame",frame)

    key = cv2.waitKey(1)

    if key == 27:         # 按esc键退出
        print('esc break...')
        cap.release()
        cv2.destroyAllWindows()
        break

    if key == ord(' '):   # 按空格键保存
#        num = num + 1
#        filename = "frames_%s.jpg" % num  # 保存一张图像
        filename = str(time.time())[:10] + ".jpg"
        cv2.imwrite(filename, frame)

备注,安装指定版本的python命令

pip install opencv-contrib-python==4.5.4.60 -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose

pip install opencv-contrib-python==4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Smali的使用技巧:快速定位Android应用程序中的关键代码

简述 Smali是一种Android应用程序的Dalvik虚拟机指令集汇编语言,用于编写和修改应用程序的DEX文件。通过编写和修改Smali代码,可以实现对Android应用程序的定制化和逆向分析。Smali语言类似于汇编语言,直接操作Dalvik虚拟机指令集。 Smali代…

2023最火的软件测试面试宝典,你刷过没?

这是一份最近疯传的软件测试面试宝典,你有刷过吗? 面试宝典一共400页,包括了测试基础102页,Linux基础38页,MySQL63页,web测试21页,app测试38页,selenium相关50页,性能测试…

02.引擎架构分类

简介 1.工具层 2.功能层:绘制、渲染、让世界里面的东西能看见、动起来 3.资源层:负责加载大量的数据和文件 4.核心层:游戏引擎的瑞士军刀,各种功能处理的内核 5.平台层:用于适配游戏不同的发行平台 第三方中间插…

3d渲染时预览和出图不一样怎么办?

在使用3dmax渲染时有时会遇到看到的图和渲染出来的图不一样的情况,这是为什么呢?有以下几方面的原因。 一、伽马 3dmax的伽马有很多,主要有显示伽马、输入伽马和输出伽马,其中预览图亮度由显示伽马决定,而图片亮度由输…

VUE.js中文官方文档

目录 创建一个 Vue 应用# 应用实例# 根组件# 挂载应用# DOM 中的根组件模板# 应用配置# 多个应用实例# 模板语法# 文本插值# 原始 HTML# Attribute 绑定# 简写# 布尔型 Attribute# 动态绑定多个值# 使用 JavaScript 表达式# 仅支持表达式# 调用函数# 受限的全…

隐私计算简介

随着数据规模的不断扩大和网络技术的快速发展,数据安全和隐私保护成为了热门的话题。隐私计算作为一种新兴的数据安全和隐私保护技术,为数据安全和隐私泄露问题提供了新的思路和方法。 2020年10月19日,Gartner发布2021年前沿战略科技趋势&am…

Blender3.2使用python脚本命令的三种方式, 以及后台渲染调用源码示例及说明

本文环境系统OS(Win10) 方式一,在Script(脚本)功能里面的Console(控制台输入python代码)。 如下图: 对应的三句代码是: print("Hi, blender.")import bpybpy.ops.mesh.primitive_cube_add(enter_editmodeFalse, alignWORLD, location(0,0, …

Vue3.0性能提升主要是通过哪几方面体现的(了解)

文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化二、源码体积响应式系统 一、编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变&#…

【ICML 2023】Hiera详解:一个简单且高效的分层视觉转换器

【ICML 2023】Hiera详解:一个简单且高效的分层视觉转换器 0. 引言1. 模型介绍2. Hiera介绍2.1 为什么提出Hiera?2.2 Hiera 中的 Mask2.3 空间结构的分离和填充到底如何操作2.4 为什么使用Mask Unit Attn 3. 简化版理解4. 总结 0. 引言 虽然现在各种各样…

Docker 安装Tomcat、实现Tomcat集群

文章目录 1、寻找Tomcat镜像2、下载tomcat镜像(下载最近版本)(1) docker pull tomcat 下载(2) 查看镜像是否安装成功 3、启动容器(跟安装Nginx一样)4、 测试tomcat(报错解决)5、 搭建Tomcat集群 1、寻找Tom…

访问修饰符private,default,protected,public访问等级区别

private:private是最严格的访问修饰符,它将成员声明为私有的。私有成员只能在声明它们的类内部访问,其他类无法直接访问私有成员。这样可以确保数据的封装性和安全性。 default(默认):如果没有明确指定访问…

Pytest 分组测试

有时候需要针对不同的测试环境跑不同的测试用例,如:冒烟测试、sit、uat、prd,所以给自动化测试用例做标记分组是很有必要的,pytest.mark 可以轻松实现这个功能。首先需要注册自定义标记。 注册marks 有3中方法注册marks&#xf…

【Apache Pinot】浅析 Pinot 的 Table,Index 和 Tenant 原理

本文属于基础篇幅,不会涉及过深入的原理,主要还是如何用好 Pinot 背景 单独讲 Table 概念可能有些许单薄,本文会扩展场景,讲解表的部分原理,表与表之间的相互影响,租户是怎么作用到表的,增加字…

一位年薪35W的测试被开除,回怼的一番话,令人沉思

一位年薪35W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…

基于深度学习的高精度袋鼠检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度袋鼠检测识别系统可用于日常生活中或野外来检测与定位袋鼠目标,利用深度学习算法可实现图片、视频、摄像头等方式的袋鼠目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

活跃主机发现技术指南

活跃主机发现技术指南 1.活跃主机发现技术简介2.基于ARP协议的活跃主机发现技术3.基于ICMP协议的活跃主机发现技术4.基于TCP协议的活跃主机发现技术5.基于UDP协议的活跃主机发现技术6.基于SCTP协议的活跃主机发现技术7.主机发现技术的分析 1.活跃主机发现技术简介 在生活中有这…

继电保护名词解释三

第三章:电网的相间电流、电压保护和方向性相间电流、电压保护 1. 瞬时电流速断保护:对于仅反应于电流增大而瞬时动作的电流保护。 2. 保护装置的起动电流:能够使保护装置起动的最小电流值。 3. 系统最大运行方式:通过保护装置的…

了解服务级别协议(SLA)在 ITSM 中的重要性

什么是服务级别协议 根据ITIL 4,SLA是服务提供商和客户之间的书面协议,用于确定所需的服务和预期的服务水平。这些协议可以是正式的,也可以是非正式的。 在 ITSM 的上下文中,SLA 有助于设置和管理最终用户在提出请求时的期望 或…

如何导出Axure原型设计中的图片?零基础入门教程

Axure 是一款广为人知的原型设计工具,特别适用于新手产品经理或产品设计初学者。然而,如果用户想要在浏览器中预览 Axure 原型图,需要安装插件才能实现。而安装完 Axure RP Chrome 插件后,还需要在扩展程序中选择 "允许访问文…

类和对象【5】日期类的实现

全文目录 引言实现日期类概述默认成员函数构造函数析构函数拷贝构造赋值重载 功能运算符重载日期间的比较日期与天数日期-与-天数日期前置与后置日期前置- -与后置- -日期 - 日期 输入输出重载(友元) 代码总览头文件源文件main函数 总结 引言 类和对象1…