用安卓设备识别ArUco码_weixin_44217968的博客-程序员秘密

技术标签: 其他  

先来看下效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

静态图片中的ArUcon码识别

在之前程序的基础上再添加一个Button和TextView,点击“识别”按钮检测照片中的ArUco码后,在屏幕最下方显示识别到的ArUco的id和四个角点坐标,四个角点从左上角点开始顺时针计数。
还有些地方没有完善,不知道为什么识别过后颜色会变。因为还没有做校准、相机标定,所以红色的Z轴指向不正确。

    private void detectArUco() {
    

        Mat src = Imgcodecs.imread(imagePath);  //相册选的图
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGRA2GRAY);  //灰度处理

        Dictionary dictionary = Aruco.getPredefinedDictionary(Aruco.DICT_4X4_50);

        List<Mat> corners = new LinkedList<>();
        corners.clear();

        MatOfInt ids = new MatOfInt();

        DetectorParameters parameters;
        parameters = DetectorParameters.create();

        Aruco.detectMarkers(gray, dictionary, corners, ids, parameters);

        if (corners.size() > 0) {
    

            double[] id = ids.get(0, 0);
            double id0 = id[0];
            String sid0 = Double.toString(id0);

            Mat corner1 = corners.get(0);

            double a[] = corner1.get(0,0);
            double a0 = a[0];
            double a1 = a[1];
            String sa0 = Double.toString(a0);
            String sa1 = Double.toString(a1);

            double b[] = corner1.get(0, 1);
            double b0 = b[0];
            double b1 = b[1];
            String sb0 = Double.toString(b0);
            String sb1 = Double.toString(b1);

            double c[] = corner1.get(0, 2);
            double c0 = c[0];
            double c1 = c[1];
            String sc0 = Double.toString(c0);
            String sc1 = Double.toString(c1);

            double d[] = corner1.get(0, 3);
            double d0 = d[0];
            double d1 = d[1];
            String sd0 = Double.toString(d0);
            String sd1 = Double.toString(d1);

            tv.setText(sid0 + "\n" + sa0 + ", " + sa1 + "\n" + sb0 + ", " + sb1 + "\n" + sc0 + ", " + sc1 + "\n" + sd0 + ", " + sd1 );

            Aruco.drawDetectedMarkers(src, corners, ids);

            Mat rvecs=new Mat();
            Mat tvecs=new Mat();
            Mat cameraMatrix = new Mat();
            Mat distCoeffs = new Mat();
            cameraMatrix = Mat.eye(3,3, CvType.CV_64FC1);
            distCoeffs = Mat.zeros(5,1,CvType.CV_64FC1);

            Aruco.estimatePoseSingleMarkers(corners, 0.04f, cameraMatrix, distCoeffs, rvecs, tvecs);

            for(int i=0;i<ids.toArray().length;i++){
    
                Aruco.drawAxis(src, cameraMatrix, distCoeffs, rvecs.row(i), tvecs.row(i), 0.02f);
            }
        }

        Bitmap bp1 = BitmapFactory.decodeFile(imagePath);
        Utils.matToBitmap(src, bp1);

        ImageView iv = this.findViewById(R.id.sample_img);
        iv.setImageBitmap(bp1);

        gray.release();
        src.release();
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44217968/article/details/106559969

智能推荐

【第三方OA对接】01华为云WeLink对接项目总结_冯浩月的博客-程序员秘密

前言&nbsp;&nbsp;&nbsp;2019年12月到 2020年04月,小编参与到公司项目与第三方OA的对接,即华为云WeLink市场的对接工作,华为云市场、WeLink市场两部分对接工作,我负责华为云市场项目对接接口、另一个同事负责WeLink对接。主要经历了四个阶段:熟悉第三方文档需求及相关业务、研发、测试、上线并解决问题。主要工作&nbsp;&nbsp;&nbsp; 第三方接口调用、开通第三方租户(租户包括本项目、第三方)第三方接口调用一、准备工作熟悉整体业务流程图项目分

12 个酷炫的 IntelliJ IDEA 插件,你确定你还不收藏吗?_里奥ii的博客-程序员秘密

今天介绍一下IDEA的一些炫酷的插件,IDEA强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同。1.插件的安装打开setting文件选择Plugins选项Ctrl + Alt + S File -&gt; Setting分别是安装JetBrains插件,第三方插件,本地已下载的插件包。详情见往期关于settings的文章。2.各种插件#1. a...

python遇坑记(一)pyinstaller_sssdal19995的博客-程序员秘密

坑点:1. pyinstaller 不支持3.8以上打包exe2. pyinstaller 打包exe 后标

VR全景的优点_芬达同学丶的博客-程序员秘密

VR全景是基于全景图像的真实的场景的虚拟现实技术,是VR虚拟现实技术中非常重要的一部分。全景其实就是把摄像设备换360°拍摄的一组或者是多组照片拼接成一个完整的全景图像,然后在利用计算机技术实现全方位互动式观看的真实场景的展示方式。VR全景具有以下几个优点:真实性 完整性 高精度 高效性因此在我们需要最真实、全面、直观的再现一个场景时候,VR全景是你最好的选择。VR全景的视角超过了人的正常视角范围,我们这里说的全景指的是水平视角360°,垂直的视角是180°的全景图像。它具有以下几个特征

随便推点

f1c100s kernel调试记录_我歌月徘徊、的博客-程序员秘密

spi flash修改设备树arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts将原来的&amp;spi0{…}替换为: &amp;spi0 { pinctrl-names = "default"; pinctrl-0 = &lt;&amp;spi0_pins_a&gt;; status = "okay"; spi-max-frequency = &lt;50000000&gt;; flash: w2

Yolov3 darknet :voc_label.py 详解_xiaofZhang的博客-程序员秘密

在darknet版本的yolov3中,我们要将每张图片对应的XML文件转换为一个txt文件,包含边框的信息:import xml.etree.ElementTree as ETimport ossets = [('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]...

商家应用 + AR : 助力虚拟试妆引擎落地手淘_阿里巴巴淘系技术团队官网博客的博客-程序员秘密

作者|方曦(千之)出品|阿里巴巴新零售淘系技术部一句话概括全文:现在,商家应用支持 AR 效果了!AR 是什么?是一种现实增强技术(Augmented Reality),可以将虚拟效果...

NLP——LDA(Latent Dirichlet Allocation-潜在狄利克雷分布)_weixin_30593261的博客-程序员秘密

一、首先是贝叶斯 参考机器学习(一) —— 浅谈贝叶斯和MCMC其中π指的是参数的概率分布,π(θ)π(θ)指的是先验概率,π(θ|x)指的是后验概率,f(x|θ)指的是我们观测到的样本的分布,也就是似然函数(likelihood),记住竖线|左边的才是我们需要的。其中积分求的区间Θ指的是参数θθ所有可能取到的值的域,所以可以看出后验概率π(θ|x)是在...

for循环练习题_bash for循环题目_Ryu_hayabusa的博客-程序员秘密

for循环练习题一、计算从1到100所有整数的和二、过滤出从1到100所有整数的奇偶数三、提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和四、求从1到100所有整数的偶数和、奇数和五、检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中六、输出/dev目录中的所有可执行文件一、计算从1到100所有整数的和#!/bin/bashsum=0for ((i=1; i&lt;=100; i++))do sum=$[sum+$i]doneecho $sum 二

Spring中HttpInvoker远程方法调用使用实例_iteye_11495的博客-程序员秘密

代码结构图如下:客户端通过Spring的HttpInvoker,完成对远程函数的调用。涉及的类有:客户端调用User类的服务UserService,完成对实现类UserServiceImpl的addUser(User u)方法调用。其中User类为普通Pojo对象,UserService为接口,UserServiceImpl为UserService的具体实现。代码如下:publ...

推荐文章

热门文章

相关标签