aruco识别,python实现

2023-05-16

需要配置anaconda,用spyder进行python语言编辑,实现对aruco码的编写。代码比较垃圾,不喜勿喷。

配置过程如下:

视觉系统的运行需要搭建视觉环境,包括,软件的下载安装、Opencv环境的搭建、插件的下载、执行文件的打包等等。首先需要下载安装Anaconda软件,建立可运行python程序的Spyder的环境。

在下在安装好Anaconda后,通过install下载Spyder,建立python开发环境。然后通过命令版Ananconda Prompt下载安装视觉开发环境所需的插件,安装命令为 pip install xx。例如:pip install opencv-contrib-python。

 通过命令板的pip install 命令下载插件,根据功能需要进行下载。本系统中需要的视觉插件包括Opencv、Opencv-contrib-python、Pyserial、Pyrelsense2、PyQt5、Pyinstaller等插件。在进行完视觉的python程序开发之后,需要将程序打包为exe执行文件,以便于lattepanda对程序的执行,所需要的模块PyQt5、Pyinstaller。通过Pyinstaller -F xxx.Py命令进行打包,生成exe后即可在lattepanda上运行程序。

视觉系统python程序及基于Opencv的Aruco码识别环境的搭建和执行文件的生成流程如下:

python的代码 如下:

import pyrealsense2 as rs
import serial
import numpy as np
import cv2
import cv2.aruco as aruco
import math
# import socket
# import wmi
# import sys

# c = wmi.WMI()
# for physical_disk in c.Win32_DiskDrive():
#       if physical_disk.SerialNumber=='6b13130f' :#and board_id.SerialNumber=='Default string':#shibeiquanxian
#           print('go on')
#       else:
#           print('The computer is not authorized ')
#           sys.exit()

 #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200

#超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)

# 打开串口,并得到串口对象


ser = serial.Serial('COM8', 57600, timeout=0)  # COM8

def send(val):
    data = bytes(val, 'UTF8')
    ser.write(data)
    

# 配置摄像头与开启pipeline

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
profile = pipeline.start(config)
align_to = rs.stream.color
align = rs.align(align_to)

# 获取对齐的rgb和深度图

def get_aligned_images():
    frames = pipeline.wait_for_frames()
    depth_frame = frames.get_depth_frame()
    aligned_frames = align.process(frames)
    aligned_depth_frame = aligned_frames.get_depth_frame()
    color_frame = aligned_frames.get_color_frame()
    # 获取intelrealsense参数
    intr = color_frame.profile.as_video_stream_profile().intrinsics
    # 内参矩阵,转ndarray方便后续opencv直接使用
    intr_matrix = np.array([
        [intr.fx, 0, intr.ppx], [0, intr.fy, intr.ppy], [0, 0, 1]
    ])
    # 深度图-16位
    depth_image = np.asanyarray(aligned_depth_frame.get_data())
    # 深度图-8位
    depth_image_8bit = cv2.convertScaleAbs(depth_image, alpha=0.03)
    pos = np.where(depth_image_8bit == 0)
    depth_image_8bit[pos] = 255
    # rgb图
    color_image = np.asanyarray(color_frame.get_data())
    # return: rgb图,深度图,相机内参,相机畸变系数(intr.coeffs)
    return color_image, depth_image, intr_matrix, np.array(intr.coeffs), depth_frame


te=[0 for x in range(0, 21)]
t=np.array(te,dtype='uint8')  #uint8型矩阵
cs=[0 for x in range(0, 6)]
D=0x00ff
H=0xff00
R=50

if __name__ == "__main__":
    n = 0
    while 1:
        textsend='{'
        
        rgb, depth, intr_matrix, intr_coeffs, depth_frame = get_aligned_images()
        rgb_copy = rgb.copy()
        # 获取dictionary, 4x4的码,指示位50个
        aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50)#aruco.DICT_6X6_250 aruco.DICT_4X4_50
        # 创建detector parameters
        parameters = aruco.DetectorParameters_create()
        # 输入rgb图, aruco的dictionary, 相机内参, 相机的畸变参数
        corners, ids, rejected_img_points = aruco.detectMarkers(rgb, aruco_dict, parameters=parameters,cameraMatrix=intr_matrix, distCoeff=intr_coeffs)
        # n = len(ids)

        idstr1=str(ids)
        idstr2=idstr1.replace('[','')
        idstr3=idstr2.replace(']','')
        idstr4=idstr3.replace(' ','')
        idstr5=idstr4.split('\n')
        # n1=len(idstr1)       
        n5=len(idstr5) 
        # print(idstr1)
        # print(idstr5)
        # print(ids)
        # print(n1)
        # print(n5)
        width = depth_frame.get_width();
        height = depth_frame.get_height();
        imgcenterx = int(width/2)
        imgcentery = int(height/2)
        
        depth_intrin = depth_frame.profile.as_video_stream_profile().intrinsics
        imgcenterdist = depth_frame.get_distance(imgcenterx,imgcentery)
        depth_pointimgcenter = rs.rs2_deproject_pixel_to_point(depth_intrin, [imgcenterx, imgcentery], imgcenterdist)
        cx=depth_pointimgcenter[0]
        cy=depth_pointimgcenter[1]
        cz=depth_pointimgcenter[2]
       
        # print(depth_pointimgcenter)
        # 估计出aruco码的位姿,0.045对应markerLength(二维码的真实大小)参数,单位是meter
        rvec, tvec, markerPoints = aruco.estimatePoseSingleMarkers(corners, 0.045, intr_matrix, intr_coeffs)
        # print(rvec)
        # print(tvec)

        if idstr3==str(None):
          t[0]=(0xeb)
          t[1]=(0x90)
          t[2]=(0x11)
          t[3]=(0x10)
          t[4]=(0x00)
          t[17]=(0xff)
          t[18]=(0xff)
          S=sum(t,0)
          t[19]=(S&D)           
          text=str(t)
          print(text)
          send(text)
        try:
            for i in range(rvec.shape[0]):
                aruco.drawAxis(rgb_copy, intr_matrix, intr_coeffs, rvec[i, :, :], tvec[i, :, :], 0.1)
                aruco.drawDetectedMarkers(rgb_copy, corners,ids)
                #print()
        	# 在图片上标出aruco码的位置
            # aruco.drawDetectedMarkers(rgb, corners,ids)
            # # 根据aruco码的位姿标注出对应的xyz轴, 0.05对应length参数,代表xyz轴画出来的长度 
            # aruco.drawAxis(rgb, intr_matrix, intr_coeffs, rvec, tvec, 0.05)
            for i in range(len(corners)):
                # print(corner[0][0])
                cornerdist = depth_frame.get_distance(corners[i][0][0][0],corners[i][0][0][1])
                xyz_corner = rs.rs2_deproject_pixel_to_point(depth_intrin, corners[i][0][0], cornerdist)
                pointx0=int(corners[i][0][0][0])
                pointy0=int(corners[i][0][0][1])
                pointy1=int(corners[i][0][1][1])
                pointx1=int(corners[i][0][1][0])
                pointy2=int(corners[i][0][2][1])
                Lx01=pointx1 - pointx0
                Ly01=pointy1 - pointy0
                tan=Ly01 / Lx01
                Ls=int((((Ly01)**2)+(Lx01)**2)**0.5)
                sin=Ly01 /Ls
                pianhang=int(math.degrees((math.asin(sin)) )) #偏航角角度值
                if  pointy2 < pointy1:                    
                    phcorner=180-(abs(pianhang))
                else:
                    phcorner=abs(pianhang)
                if pianhang<0:
                    phcorner=abs(360-phcorner)                     
                dx = 100*round(xyz_corner[0]-cx,3)#-depth_pointimgcenter[0]
                xi=int(dx)
                xz=abs(int(dx))
                x=hex(abs(xz))
                
                if xi>0:
                    a=0x01
                elif xi==00:
                    a=0x00
                else:
                    a=0x02
                dy = 100*round(xyz_corner[1]-cy,3)#-depth_pointimgcenter[1]
                yi=int(dy)
                yz=abs(int(dy))
                y=hex(abs(yz))
                if yi>0:
                    b=0x01
                elif yi==0:
                    b=0x00
                else:
                    b=0x02
                # dz = round(depth_pointcenter[2]-depth_pointimgcenter[2],3)
                h  = 100*round((xyz_corner[2]+cz)/2,3)#((xyz_corner[2]+depth_pointimgcenter[2])/2,3)
                # print(depth_pointimgcenter)
                hi=int(h)
                hz=abs(int(h))
                z=hex(abs(int(h)))
                if hi>0:
                    c=0x01
                elif hi==0:
                    c=0x00
                else:
                    c=0x02
                # print(dx,dy,h)
        
                if pianhang>0:
                    d=0x01
                elif pianhang==0:
                    d=0x00
                else:
                    d=0x02  
                if hi>=320 and hi<1100:
                    hz=hz-620
                elif hi>1100:
                    hz=hz-750
                elif hz<320 :
                    hz=hz
                point=np.array(idstr5,dtype='uint8')
                n6=len(point)
                t[0]=(0xeb)
                t[1]=(0x90)
                t[2]=(0x11)
                t[3]=(0x10)
                t[4]=(0x01)
                t[5]=(xz&H)>>8
                t[6]=(xz&D)
                t[7]=(yz&H)>>8
                t[8]=(yz&D)
                t[9]=(hz&H)>>8
                t[10]=(hz&D)
                t[11]=(phcorner&H)>>8
                t[12]=(phcorner&D)
                t[13]=(a)
                t[14]=(b)
                t[15]=(c)
                t[16]=(d)
                t[17]=(int(idstr5[i]))
                t[18]=(n5)
                S=sum(t,0)
                t[19]=(S&D) 
                t[20]=(0xff)
                idl=1
                idb=6
                cp=300
                hdpian=math.radians(phcorner)
                bujiao=math.radians(45)
               #text="id:"+idstr5[i]+" x:"+str(x)+" y:"+str(y)+" z:"+str(z)+" a:"+str(a)+" b:"+str(b)+" c:"+str(c)
                textsend=textsend+text
                textsend=textsend+';'
                # print(text)
                cv2.putText(rgb_copy, text, (int(corners[i][0][0][0]),int(corners[i][0][0][1])), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 20, 20), 2)
                
                # text3="dy:"+str(dy)
                # cv2.putText(image_copy, text3, (200, 20), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 20, 20), 2)
                # text2="h:"+str(h)        
                # cv2.putText(image_copy, text2, (10, 60), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 20, 20), 2)
                # text4="dz:"+str(dz)
                # cv2.putText(image_copy, text4, (200, 60), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 20, 20), 2)

            cv2.imshow('RGB image', rgb_copy)
            
           # send(text)
        except:
            cv2.imshow('RGB image', rgb_copy)
        key = cv2.waitKey(1)
        # 按键盘q退出程序
        if key & 0xFF == ord('q') or key == 27:
            pipeline.stop()
            ser.close()
            break
        # 按键盘s保存图片
        elif key == ord('s'):
            n = n + 1
            # 保存rgb图
           # cv2.imwrite('D:/Anaconda/spyderchengxu/gongxun/arucoresult/rgb' + str(n) + '.jpg', rgb_copy)

    cv2.destroyAllWindows()

奥对了,摄像头用的是D435i深度摄像头,采用的红外测距,你也可以用普通的双目。

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

aruco识别,python实现 的相关文章

随机推荐

  • 嵌入式开发一定用的着的网站分享

    大家好呀 xff01 我是何同学 xff0c 这期给大家分享一些常用的工具网站 xff0c 这些网站在你今后的开发中多多少少都可以给你带来一定的帮助 xff01 不要进收藏夹吃灰了 一 方案类网站 这个网站提供了产品库和方案库 xff1a
  • Jmeter性能测试(20)--阶梯式加压测试

    性能测试中 xff0c 有时需要模拟一种实际生产中经常出现的情况 xff0c 即 xff1a 从某个值开始不断增加压力 xff0c 直至达到某个值 xff0c 然后持续运行一段时间 在jmeter中 xff0c 有这样一个插件 xff0c
  • javascript在pdf中的作用

    1 xff0c 创建电子印章 2 xff0c 访问外部文件 xff0c 将外部数据导入到acrobat 在pdf上显示 福晰阅读器不支持 3 xff0c 增加水印 4 xff0c 在对文件操作的时候执行一些动作 xff0c 例如文件打开时
  • 为什么在Eclipse中,运行一个程序时却出现另一个程序的结果?

    项目场景 xff1a 在一些朋友的学习过程中 xff0c 我们可能在使用Eclipse时 xff0c 运行一个刚刚敲好的代码 xff0c 出现的结果却是上一个或者另一个程序的结果 xff0c 出现牛头不对马嘴的情况 那这是为什么呢 xff1
  • JAVA-关于计算器的简单图形界面设计例子(不实现功能)

    对于刚刚学习JAVA的小伙伴们来说 xff0c 对图形界面设计肯定不陌生 xff0c 我们可以利用javax swing类库来进行图形界面的简单设计 下面我们用JAVA图形界面设计的相关基础知识来实现一个简易计算器的界面 xff08 不实现
  • JAVA-通过身高体重计算BMI判断人的体型(普通版)

    代码 xff1a xff08 给出BMI的相关注释 xff09 abstract class People int weight int height public People int w int h this weight 61 w t
  • JAVA-通过身高体重计算BMI判断人的体型(体型计算器版)

    这次我们结合我上两篇关于简易计算器界面设计和通过BMI判断人的体型的文章来写一个 体型计算器 xff08 我们初学者要学会综合的 系统的 规范的利用所学知识 xff0c 完成需求 xff09 同样 xff0c 相关步骤给出注释以方便大家交流
  • JAVA-实用计算器的设计与实现(实现算数优先级)

    xff08 1 xff09 本程序实现了一个实用的计算器程序 xff0c 具体功能实现如下 xff1a A 实现实用计算器的简易界面 B 实现按钮的监听 C xff0e 至少有加 减 乘 除 清除5种运算 D xff0e 可以连续运算 xf
  • 基于STM32F103ZET6的(单/三)路HC-SR04超声波测距+TFTLCD实时显示+距离报警

    一 成果图 说明 xff1a 本程序的源码地址 xff1a https github com Lfy YF Campus Project 源码包含四个版本 xff0c 涉及单路测距 三路测距 增加外部中断 xff08 用来版本记录的 xff
  • 虚拟机远程工具MobaXterm(Network error: Connection timed out问题)以及虚拟机无IP地址和NetWork失效问题

    一 问题说明 我们在使用虚拟机远程工具MobaXterm时可能会碰到Network error Connection timed out问题 xff0c 并且在虚拟机查看IP地址时 xff0c 发现没有分配给虚拟机IP地址 xff0c 网卡
  • ORB_SLAM2、ORB_SLAM3跑EuRoc&KITTI数据集及evo评估

    EuRoc数据集 ORB SLAM2 单目 Examples Monocular mono euroc Vocabulary ORBvoc txt Examples Monocular EuRoC yaml slam data RuRoc
  • 热风枪的温度设置(与焊锡有无含铅有关)和使用注意

    注意 xff1a 1 风不宜太大 xff0c 会吹跑器件 xff0c 不易控制 2 温度不宜太高或太低 3 热风枪的使用姿势 风速设置 xff1a 贴片阻容类2 3档 贴片IC类3 4档
  • 【FPGA】UART串口通信——奇偶校验实现

    文章目录 一 奇偶校验位二 设计思路三 仿真测试 一 奇偶校验位 奇偶校验位是基于uart的数据上进行一个判断 奇校验 xff1a 数据1个数为奇时 xff0c 校验为0 xff0c 反之为1 偶校验 xff1a 数据0个数为偶时 xff0
  • Jmeter性能测试(21)--jmeter常用插件介绍

    jmeter作为一个开源的接口性能测试工具 xff0c 其本身的小巧和灵活性给了测试人员很大的帮助 xff0c 但其本身作为一个开源工具 xff0c 相比于一些商业工具 xff08 比如LoadRunner xff09 xff0c 在功能的
  • reStructuredText 初学者语法汇总

    文档格式编辑 xff0c 目前主流最强大的是LaTeX xff0c 但是语法太复杂 xff0c 环境要求也多 xff0c 有的时候也是写文档往往选择 Markdown 常常怀疑文档编辑的Markdown不是亲生的 xff0c 很多功能不全
  • C++如何写自定义的头文件

    C 43 43 是一种非常热门的面向对象语言 xff0c 受到很多人的欢迎 在C语言的基础上 xff0c C 43 43 进行了很多的改进 xff0c 并引入了许多新的头文件 xff0c 方便我们使用 比如要进行字符串操作就引入string
  • 虚拟机Vmware安装Ubuntu系统

    vm虚拟机下载安装 安装位置可以任意选择 xff0c 但是路径中不要出现中文字符 两个选项都取消掉 点击许可证 激活码就是许可证选择一个复制即可 Ubuntu系统下载安装 Ubuntu系统可直接前往其官网进行下载 buntu 22 04 L
  • 深入理解JVM虚拟机

    文章目录 深入理解JVM虚拟机JDK1 8新特性 xff1a JVM架构图 xff1a 类装载器知识点 xff1a 类装载器 xff1a 双亲委派机制 xff1a 沙箱安全机制 xff1a Execution Engine执行引擎负责解释命
  • Linux基础指令详解

    目录 前言 Linux基本指令 1 ls指令 1 1 ls 1 2 ls l 1 3 ls a 1 4 ls d 1 5 绝对路径和相对路径 2 pwd指令 3 cd指令 4 touch指令 5 mkdir指令 6 rmdir指令和rm指令
  • aruco识别,python实现

    需要配置anaconda xff0c 用spyder进行python语言编辑 xff0c 实现对aruco码的编写 代码比较垃圾 xff0c 不喜勿喷 配置过程如下 xff1a 视觉系统的运行需要搭建视觉环境 xff0c 包括 xff0c