玩了下opencv的aruco(python版)

2023-05-16

简单的玩了下opencv里头的aruco,用的手机相机,手机装了个 ip摄像头,这样视频就可以传到电脑上了。

首先是标定,我没打印chessboard,直接在电脑屏幕上显示,拍了17张,大概如下:

又在手机上装了个 尺子 之类的app,比划着量了下,每个格子大概是18.1 mm,这个棋盘是10 x 7的棋盘。

要pip install opencv-contrib-python才有扩展模块,扩展模块中包含aruco

然后标定了一下:


 1 import cv2
 2 import numpy as np
 3 import glob
 4 import matplotlib.pyplot as plt
 5 import matplotlib.patches as patches
 6 
 7 
 8 # 找棋盘格角点
 9 
10 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 阈值
11 #棋盘格模板规格
12 w = 9   # 10 - 1
13 h = 6   # 7  - 1
14 # 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
15 objp = np.zeros((w*h,3), np.float32)
16 objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
17 objp = objp*18.1  # 18.1 mm
18 
19 # 储存棋盘格角点的世界坐标和图像坐标对
20 objpoints = [] # 在世界坐标系中的三维点
21 imgpoints = [] # 在图像平面的二维点
22 
23 images = glob.glob('./chessboard/*.jpg')  #   拍摄的十几张棋盘图片所在目录
24 
25 i = 1
26 for fname in images:
27 
28     img = cv2.imread(fname)
29     gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
30     # 找到棋盘格角点
31     ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
32     # 如果找到足够点对,将其存储起来
33     if ret == True:
34         print("i:", i)
35         i = i+1
36     
37         cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
38         objpoints.append(objp)
39         imgpoints.append(corners)
40         # 将角点在图像上显示
41         cv2.drawChessboardCorners(img, (w,h), corners, ret)
42         cv2.namedWindow('findCorners', cv2.WINDOW_NORMAL)
43         cv2.resizeWindow('findCorners', 810, 405)
44         cv2.imshow('findCorners',img)
45         cv2.waitKey(1)
46 cv2.destroyAllWindows()
47 #%% 标定
48 ret, mtx, dist, rvecs, tvecs = \
49     cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
50 
51 
52 print("ret:",ret  )
53 print("mtx:\n",mtx)      # 内参数矩阵  
54 print("dist:\n",dist   )   # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)  
55 print("rvecs:\n",rvecs)   # 旋转向量  # 外参数  
56 print("tvecs:\n",tvecs  )  # 平移向量  # 外参数  
View Code

标定结果里对aruco有用的是 mtx 和 dist。

然后打印包含aruco的marker的纸,运行下面的代码就可以玩了:


 1 import numpy as np
 2 import time
 3 import cv2  
 4 import cv2.aruco as aruco  
 5 
 6 #with np.load('webcam_calibration_output.npz') as X:  
 7 #    mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]
 8 
 9 #mtx = 
10 #2946.48    0    1980.53
11 #0    2945.41    1129.25
12 #0    0    1
13 
14 mtx = np.array([
15         [2946.48,       0, 1980.53],
16         [      0, 2945.41, 1129.25],
17         [      0,       0,       1],
18         ])
19 #我的手机拍棋盘的时候图片大小是 4000 x 2250
20 #ip摄像头拍视频的时候设置的是 1920 x 1080,长宽比是一样的,
21 #ip摄像头设置分辨率的时候注意一下
22 
23 
24 dist = np.array( [0.226317, -1.21478, 0.00170689, -0.000334551, 1.9892] )
25 
26 video = "http://admin:admin@192.168.1.2:8081/"   # 手机ip摄像头
27 # 根据ip摄像头在你手机上生成的ip地址更改,右上角可修改图像分辨率
28 
29 cap = cv2.VideoCapture(video)
30 
31 
32 font = cv2.FONT_HERSHEY_SIMPLEX #font for displaying text (below)  
33 
34 #num = 0
35 while True:  
36     ret, frame = cap.read()  
37     # operations on the frame come here  
38     
39     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  
40     aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)  
41     parameters =  aruco.DetectorParameters_create()  
42   
43     '''
44     detectMarkers(...) 
45         detectMarkers(image, dictionary[, corners[, ids[, parameters[, rejectedI 
46         mgPoints]]]]) -> corners, ids, rejectedImgPoints 
47     '''  
48       
49     #lists of ids and the corners beloning to each id  
50     corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, 
51                                                           aruco_dict, 
52                                                           parameters=parameters)  
53   
54 #    if ids != None: 
55     if ids is not None:
56           
57         rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 0.05, mtx, dist) 
58         # Estimate pose of each marker and return the values rvet and tvec---different 
59         # from camera coeficcients  
60         (rvec-tvec).any() # get rid of that nasty numpy value array error  
61         
62 #        aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis  
63 #        aruco.drawDetectedMarkers(frame, corners) #Draw A square around the markers
64         
65         for i in range(rvec.shape[0]):
66             aruco.drawAxis(frame, mtx, dist, rvec[i, :, :], tvec[i, :, :], 0.03)
67             aruco.drawDetectedMarkers(frame, corners)
68         ###### DRAW ID #####  
69 #        cv2.putText(frame, "Id: " + str(ids), (0,64), font, 1, (0,255,0),2,cv2.LINE_AA)  
70   
71   
72     else:  
73         ##### DRAW "NO IDS" #####  
74         cv2.putText(frame, "No Ids", (0,64), font, 1, (0,255,0),2,cv2.LINE_AA)  
75   
76     # Display the resulting frame  
77     cv2.imshow("frame",frame)  
78     
79     key = cv2.waitKey(1)
80     
81     if key == 27:         # 按esc键退出
82         print('esc break...')  
83         cap.release()
84         cv2.destroyAllWindows()
85         break
86     
87     if key == ord(' '):   # 按空格键保存
88 #        num = num + 1
89 #        filename = "frames_%s.jpg" % num  # 保存一张图像
90         filename = str(time.time())[:10] + ".jpg"  
91         cv2.imwrite(filename, frame)  
View Code

最后效果如下:

 

转载于:https://www.cnblogs.com/shepherd2015/p/9612568.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

玩了下opencv的aruco(python版) 的相关文章

  • js表单验证 方法

    1 长度限制 lt p gt 1 长度限制 lt p gt lt form name 61 a nsubmit 61 34 return test 34 gt lt textarea name 61 34 b 34 cols 61 34 4
  • 海量数据处理之倒排索引

    前言 xff1a 本文是对博文http blog csdn net v july v article details 7085669的总结和引用 一 xff0c 什么是倒排索引 问题描述 xff1a 文档检索系统 xff0c 查询那些文件包
  • linux 服务器杀毒,一次Linux服务器***查杀经历

    1客户自己的服务器由于种了 xff0c 往外发送大量数据包 xff0c 被服务商切断网络 虽然没有网络不能直接登录服务器 xff0c 但是可以通过服务商提供的WEB控制面板进入操作系统 首先使用命令查看相关连接 xff1a netstat
  • 问题请教:关于同一个POD中多容器的广播信息问题

    广大博友好 xff0c 最近在K8S集群中遇到一个问题 xff0c 贴出来同大家分享一下 同一个POD中多个容器 如何处理广播信息 xff1f 经测试 同一个POD中当先启动的容器占用广播端口后 xff0c 其他的容器启动就会报bind e
  • JAVA在线观看视频教程完整版

    今天给大家介绍一下JAVA在线观看视频教程完整版 xff0c 我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言 xff0c 是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台
  • Dockerfile镜像的制作

    Dockerfile镜像的制作 如果学习Docker xff0c 那么制作镜像这一步肯定不能少的 xff0c 别人给你的是环境 xff0c 而你自己做的才是你最终需要的东西 xff0c 接下来就记录一下如何制作一个满足自己的镜像 xff0c
  • OpenWRT 编译教程

    1 安装Ubuntu 到 http www ubuntu org cn desktop get ubuntu download 下载 xff0c 版本随便 xff0c 我选的是10 10 32位版 安装过程就不说了 xff0c 图形化安装
  • 树莓派VNC搭建相关教程+Ubuntu16.04连接vncserver灰屏问题!

    树莓派VNC搭建相关教程 xff1a 为了节省money xff0c 于是我决定用VNC界面来代替显示器 xff0c 为后面做C 43 43 Qt以及Python Qt开发打下基础 xff0c 我别无选择 xff01 下面开始进入正题 xf
  • linux中wait系统调用

    系统中的僵尸进程都要由wait系统调用来回收 xff0c 下面就通过实战看一看wait的具体用法 xff1a wait的函数原型是 xff1a include lt sys types h gt 提供类型pid t的定义 include l
  • go 使用channel交叉打印奇偶数

    方法1 使用两个协程一个管道 xff0c 一个协程输入 xff0c 另一个协程接收 xff0c 保证i在两个协程中的值一样 package main import 34 fmt 34 34 sync 34 var wg sync WaitG
  • 事件冒泡机制和事件委派 以及回调的匿名函数参数

    1 事件冒泡机制 xff1a 事件冒泡机制也就是当一个事件绑定到一个元素上时 xff0c 如果这个元素不存在或者回调函数返回ture 那么这个事件就会向上冒泡 xff0c 继续绑定这个元素的父级元素直至document xff08 如果事件
  • Linux 内核硬件抽象

    我们结束 PCI 的讨论 通过快速看一下系统如何处理在市场上的多种 PCI 控制器 这只 是一个信息性的小节 打算来展示给好奇的读者 内核的面向对象分布如何向下扩展到最 低层 用来实现硬件抽象的机制是通常的包含方法的结构 它是一个很强功能的
  • 客户端服务器信息交互,select实现客户端和服务器端的信息交互(TCP socket)

    实现功能 xff1a 客户端 xff1a lt 1 gt 从标准输入 键盘 读入信息 xff0c 然后通过socket发送到服务器端 lt 2 gt 接收来自服务器端的信息 xff0c 并显示到终端里 服务器端 xff1a lt 1 gt
  • 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事 xff0c 工作时需要用到 xff0c 面试时会被问到 xff0c 简历中需要写到 对于软件测试人员来说 xff0c 不需要你多么熟练使用Linux所有命令 xff0c 也不
  • Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:...

    http askubuntu com questions 711889 err apt get update on ubuntu 14 04 br br br 即使给Ubuntu配置了代理 xff0c terminal能ping通网络 xf
  • JT∕T 905 -2014 出租汽车服务管理信息系统的相关协议研究

    出租汽车服务管理信息系统 xff08 JT T 905 2014 xff09 国家的相关技术要求2014年7月正式出台 xff0c 总体有四部分 xff0c 第 1 部分 xff1a 总体技术要求 xff1b 第 2 部分 xff1a 运营
  • 常用的DC插头公头的尺寸

    2 0 0 6mm xff1a 这种应该是用在诺基亚黑白屏那种手机上的充电插头 2 5 0 7mm xff1a 这种不知用在哪里 3 5 1 35mm xff1a 应该是以前那种小型的磁带机放音机上用的 4 0 1 7mm xff1a 已知
  • 链式队列总结

    基本数据结构之 链式队列 链式队列就是一个操作受到限制的单链表 xff0c 学会了单链表再来写这个就是轻松加愉快 xff0c 但是貌似我去用了两个小时搞定 xff0c 主要是基础差 xff01 队列的基本操作就是入栈和出栈 xff0c 还可
  • float c语言存储格式,float a=1.0f 这里的1.0f中的“f”代表什么 ?float的储存格式?...

    float a 61 1 0f 这里的1 0f中的 f 代表什么 xff0c 有什么意思 xff0c 在C语言里面 xff0c 解答详细点啊 xff01 xff01 xff01 f 代表这个数据是float类型的常量 xff0c 如果你直接
  • 简单实现一个go协程池

    协程池简单来说就是一个管道进 xff0c 一个管道出 xff0c 多个协程工作 实现一 xff1a 无顺序协程工作 package main import 34 fmt 34 var workerNum 61 3 func worker i

随机推荐

  • package.xml

    package xml 也是一个 catkin 的 package 必备文件 xff0c 它是这个软件包的描述文件 xff0c 在较早的 ROS 版本 rosbuild 编译系统 中 xff0c 这个文件叫做 manifest xml xf
  • docker-更新镜像

    更新镜像 更新镜像之前 xff0c 我们需要使用镜像来创建一个容器 w3cschool 64 w3cschool docker run t i ubuntu 15 10 bin bash root 64 e218edb10161 在运行的容
  • 实时监控、直播流、流媒体、视频网站开发方案设计简要

    欢迎大家积极开心的加入讨论群 群号 371249677 xff08 点击这里进群 xff09 一 本地推送端 1 本地 xff1a 采用javaCV xff08 安卓和java平台推荐javaCV xff09 ffmpeg openCV或者
  • 学完嵌入式可以做什么呢?我们为什么要学习嵌入式?

    就目前中国市场行情来看 xff0c IT技术已经进入了高速发展的阶段 xff0c 互联网开始逐渐步入物联网的科技时代 xff0c 可以说嵌入式开发技术在物联网领域应用最为广泛 xff0c 正是嵌入式开发行业十分火热 xff0c 很多大学毕业
  • 微软服务器软件维护,软件更新维护 - Configuration Manager | Microsoft Docs

    软件更新维护 04 27 2021 本文内容 适用范围 xff1a Configuration Manager Current Branch 可从 Configuration Manager 控制台和软件更新点组件属性中计划和运行 WSUS
  • 用C#来开发CAD插件,含源代码

    CAD插件看起来很神秘 xff0c 其实一个合格码农经过几天就能快速掌握 没什么秘密 xff0c 开发CAD插件和winform一样简单学几个类库用法就是 xff08 只是太多人不喜欢知识分享 xff09 xff0c 在CAD里展现界面和w
  • linux C/C++服务器后台开发面试题总结

    一 编程语言 1 根据熟悉的语言 xff0c 谈谈两种语言的区别 xff1f 主要浅谈下C C 43 43 和PHP语言的区别 1 PHP弱类型语言 xff0c 一种脚本语言 xff0c 对数据的类型不要求过多 xff0c 较多的应用于We
  • 如何设置树莓派 -Zero 自启动连接WIFI

    1 首先我们需要一台可以读取树莓派跟文件系统的Linux虚拟机 比如Ubuntu 将树莓派SD卡系统插入电脑 xff0c 识别并打开rootfs文件夹 xff0c 切换到 96 rootfs etc wpa supplicant 96 目录
  • Linux Shell 小数比较

    bin bash expr 方法是错误的 xff0c 在比较相同位数时可以 xff0c 当位数不同就会出错 xff0c 如100 00 gt 70 00就会得出错误的结果 a 61 123 b 61 123 c 61 99 99 rat 6
  • rpc通信的实现方式(以grpc为例)

    基础知识 RPC xff08 Remote Procedure Call xff09 xff1a 远程过程调用 它是一种调用方式 xff0c 可以像调用本地方法那样调用远端方法 protobuf Protocol Buffers 一种开源跨
  • 第五周总结 & 实验报告(三)

    第五周总结 一 继承 1 类的继承格式 class 父类 class 子类 extends 父类 2 扩展类的功能 class 父类 父类属性 xff1b class 子类 extends 父类 新定义属性 xff1b 注意 xff1a 只
  • 第六周总结 & 实验报告(四)

    第六周小结 一 instanceof关键字 在Java中使用instanceof关键字判断一个对象到底是哪个类的实例 xff0c 返回boolean类型 1 instanceof关键字的作用 例 class A public void fu
  • git 下载指定tag版本的源码

    git clone branch x x x https xxx xxx com xxx xxx git 转载于 https www cnblogs com wangjq19920210 p 10695231 html
  • Android yuv转Bitmap

    YuvImage image 61 new YuvImage data ImageFormat NV21 size width size height null if image 61 null ByteArrayOutputStream
  • PCB线宽与电流计算器--在线计算

    http eda365 com article 12 1 html 计算线宽与载流量的关系 xff0c 方便设计 xff1b 单个人建议在有限的空间尽量将大电流线路加宽 转载于 https www cnblogs com brianblog
  • 中国的第一封电子邮件

    Across the Great Wall we can reach every corner in the world 或许你已经忘记 xff0c 那就让我们一同来记起 中国的第一封电子邮件标志着我国进入了互联网时代 xff0c 我似乎也
  • 报Error creating bean with name 'dataSource' defined in class path resource 报错解决办法

    在学习spring boot 的数据库操作的时候 xff0c 报了一串错误 对于初学spring boot的我来说 xff0c 英语水平低 xff0c 看不懂报错的信息 xff0c 给我造成了很大的麻烦 xff0c 花了我一天的时间 xff
  • IntelliJ IDEA 文档无法编辑,变成了只读模式

    因为你 之前 修改了 系统时间 哈哈哈 转载于 https www cnblogs com zongheng14 p 10948236 html
  • Python pip版本升级

    pip版本升级命令 python m pip install upgrade pip 如果报错代码如下 venv C Users ssdy PycharmProjects untitled gt python m pip install u
  • 玩了下opencv的aruco(python版)

    简单的玩了下opencv里头的aruco xff0c 用的手机相机 xff0c 手机装了个 ip摄像头 xff0c 这样视频就可以传到电脑上了 首先是标定 xff0c 我没打印chessboard xff0c 直接在电脑屏幕上显示 xff0