关于Aruco标记的理解并对其进行姿态估计的可视化显示

2023-05-16

目录

  • 1.什么是ArUco标记
    • 1.1 Marker和字典
  • 2.通过使用OpenCV生成ArUco标记图
  • 3.检测Aruco标记
  • 4.一些API的介绍
    • getPredefinedDictionary()
    • drawMarker()
    • estimatePoseSingleMarkers()
    • solvePnP()
  • 5.ArUco模块之aruco标记的创建与检测
  • 6.对aruco标记进行姿态估计的可视化显示

ArUco二维码标定板自动生成网站:
https://chev.me/arucogen/
可以选择Aruco码、棋盘格标定板、圆形标定板、非对称圆形标定板进行打印
https://calib.io/pages/camera-calibration-pattern-generator

1.什么是ArUco标记

  ArUco标记最初由S.Garrido-Jurado等人在2014年发表的论文Automatic generation and detection of highly reliable fiducial markers under occlusion中提出。ArUco的全称是Augmented Reality University of Cordoba,下面给出ArUco标记的一些示例。
在这里插入图片描述
  ArUco标记是可用于摄像机姿态估计的二进制方形基准标记。它的主要优点是检测简单、快速,并且具有很强的鲁棒性。ArUco 标记是由宽黑色边框和确定其标识符(id)的内部二进制矩阵组成的正方形标记。ArUco标记的黑色边框有助于其在图像中的快速检测,内部二进制编码用于识别标记和提供错误检测和纠正。ArUco标记尺寸的大小决定内部矩阵的大小,例如尺寸为 4x4 的标记由 16 位二进制数组成。
  ArUco标记的尺寸可以任意的更改,为了成功检测可根据对象大小和场景选择合适的尺寸。在实际使用中,如果标记的尺寸太小,可能无法检测到它,这时可以选择更换较大尺寸的标记,或者将相机离标记更近一些。

  在机器人应用中,可以将这些标记沿着仓库机器人的路径放置。当安装在机器人上的摄像头检测到这些标记时,由于每个标记都有唯一的ID,并且且标记在仓库中的放置位置已知,因此就可以知道机器人在仓库中的精确位置。

  通俗地说,Aruco标记其实就是一种编码,就和我们日常生活中的二维码是相似的,只不过由于编码方式的不同,导致它们存储信息的方式、容量等等有所差异,所以在应用层次上也会有所不同。由于单个ArUco标记就可以提供足够的对应关系,例如有四个明显的角点内部的二进制编码,所以ArUco标记被广泛用来增加从二维世界映射到三维世界时的信息量,便于发现二维世界与三维世界之间的投影关系,从而实现姿态估计相机矫正等等应用。

1.1 Marker和字典

  一个ArUco marker是一个二进制平方标记,它由一个宽的黑边和一个内部的二进制矩阵组成,内部的矩阵决定了它们的id。黑色的边界有利于快速检测到图像,二进制编码可以验证id,并且允许错误检测和矫正技术的应用。marker的大小决定了内部矩阵的大小。例如,一个4x4的marker由16bits组成。

2.通过使用OpenCV生成ArUco标记图

  本小节通过使用OpenCV库生成上小节中的ArUco标记图,方便打印后为后面做姿态估计。

  使用OpenCV可轻松生成这些标记。OpenCV中的Aruco模块总共有25个预定义的标记词典。每个词典中所有的Aruco标记均包含相同数量的块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记的数量固定(例如50、100、250或1000)。接下来将展示如何在C++和Python中生成和检测各种aruco标记。

  调用getPredefinedDictionary()函数加载包含250个标记的字典,其中每个标记都是6×6位二进制模式。具体代码在下面给出。

C++代码

#include <opencv2/aruco.hpp>
 
Mat markerImage; 
// 加载用于生成标记的字典
Ptr<cv::aruco::Dictionary>dictionary=aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250); 
// 生成标记图
aruco::drawMarker(dictionary, 33, 200, markerImage, 1);

Python代码

import cv2 as cv
import numpy as np
 
# 加载用于生成标记的字典
dictionary = cv.aruco.Dictionary_get(cv.aruco.DICT_6X6_250)
 
# Generate the marker
markerImage = np.zeros((200, 200), dtype=np.uint8)
markerImage = cv.aruco.drawMarker(dictionary, 33, 200, markerImage, 1);
 
cv.imwrite("marker33.png", markerImage);

  代码中drawMarker函数可以从由250个aruco标记组成的集合中选择给定id(第二个参数– 33)的标记,这250个标记的id由0~249表示。drawMarker函数的第三个参数决定生成的标记的大小,在上面的示例中,它将生成200×200像素的图像。第四个参数表示将要存储aruco标记的对象(上面的markerImage)。最后,第五个参数是边界宽度参数,它决定应将多少位(块)作为边界添加到生成的二进制图案中。

  在上面的代码中,将在6×6生成的图形周围添加1位的边界,以在200×200像素的图像中生成7×7位的图像。上述代码生成的aruco标记如下图所示。
在这里插入图片描述
  在实际应用时,我们可能需要生成多个标记。之后我们只需要将这些标记打印出来就可以直接使用了。

3.检测Aruco标记

  将aruco标记放置在环境中后,我们需要检测它们并将其用于进一步处理。接下来介绍如何通过代码检测标记。
C++代码

// 加载用于生成标记的字典
Ptr<Dictionary> dictionary = getPredefinedDictionary(DICT_6X6_250);
 
// 使用默认值初始化检测器参数  
Ptr<DetectorParameters> parameters = DetectorParameters::create();
 
// 声明包含检测到的标记角和被拒绝的标记候选的向量  
vector<vector<Point2f>> markerCorners, rejectedCandidates;
 
// 检测到的标记的id存储在一个向量中  
vector<int> markerIds;
 
// 检测图像中的标记
detectMarkers(frame, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);

Python代码

# 加载用于生成标记的字典
dictionary = cv.aruco.Dictionary_get(cv.aruco.DICT_6X6_250)
 
# 使用默认值初始化检测器参数 
parameters =  cv.aruco.DetectorParameters_create()
 
# 检测图像中的标记
markerCorners, markerIds, rejectedCandidates = cv.aruco.detectMarkers(frame, dictionary, parameters=parameters)

  对于每次成功检测到标记,将按从左上,右上,右下和左下的顺序检测标记的四个角点。在C ++中,将这4个检测到的角点存储为点矢量,并将图像中的多个标记一起存储在点矢量容器中。在Python中,它们存储为Numpy 数组。

4.一些API的介绍

  姿态估计问题就是要确定某个三维物体的方位指向问题,也就是确定以该物体为中心原点的一个坐标系。

getPredefinedDictionary()

auto dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME::DICT_6X6_250);
  • 关于DICT_4X4_50含义
      以我的运行环境opencv3.4.7和opencv_contrib为例,其中DICT是dictionary的缩写,6×6表示去掉一个宽的黑边后的网格大小,如下图所示是6×6的,蓝色的矩形框所示。
    50表示每个字典中的Marker数目,有效的id数字范围是0到49。不在有效区间的特定id将会产生异常。
    在这里插入图片描述
      上图为一个典型的ArUco marker,去除黑色边框后为6X6的格子(黑色表示0,白色表示1),6X6的格子的外边缘为黑色。
id的计算方法:
1 0 0 1 1 0
1 0 0 0 1 1
0 0 0 0 0 1
0 0 0 1 1 1
1 1 0 0 1 1
0 1 1 1 1 0

每行组成一个二进制数,将这6个二进制数进行相加转换为十进制,就是id。
enum PREDEFINED_DICTIONARY_NAME {
    DICT_4X4_50 = 0,
    DICT_4X4_100,
    DICT_4X4_250,
    DICT_4X4_1000,
    DICT_5X5_50,
    DICT_5X5_100,
    DICT_5X5_250,
    DICT_5X5_1000,
    DICT_6X6_50,
    DICT_6X6_100,
    DICT_6X6_250,
    DICT_6X6_1000,
    DICT_7X7_50,
    DICT_7X7_100,
    DICT_7X7_250,
    DICT_7X7_1000,
    DICT_ARUCO_ORIGINAL,
    DICT_APRILTAG_16h5,     ///< 4x4 bits, minimum hamming distance between any two codes = 5, 30 codes
    DICT_APRILTAG_25h9,     ///< 5x5 bits, minimum hamming distance between any two codes = 9, 35 codes
    DICT_APRILTAG_36h10,    ///< 6x6 bits, minimum hamming distance between any two codes = 10, 2320 codes
    DICT_APRILTAG_36h11     ///< 6x6 bits, minimum hamming distance between any two codes = 11, 587 codes
};

注: marker corner的顺序是起点为左上角, 顺时针
注: DICT_ARUCO_ORIGINAL: 为DICT_5X5_1024

drawMarker()

  • 函数作用:detectMarkers函数用于检测和确定标记角点的位置。
cv::Mat markerImage; 
cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);

cv::aruco::drawMarker(dictionary, 23, 200, markerImage, 1);

  首先,我们通过选择aruco模块中一个预定义的字典来创建一个字典对象,具体而言,这个字典是由250个marker组成的,每个marker的大小为6x6bits(DICT_6X6_250)

drawMarker的参数如下:

  • 第一个参数是之前创建的字典对象(带有标记的场景图像)。
  • 第二个参数是marker的id(用于生成标记的字典),成功检测到的标记将存储在markerCorners中,在这个例子中选择的是字典DICT_6X6_250第23个marker。注意到每个字典是由不同数目的Marker组成的,在这个例子中,有效的Id数字范围是0到249。不在有效区间的特定id将会产生异常。
  • 第三个参数,200,是输出Marker图像的大小。在这个例子中,输出的图像将是200x200像素大小。注意到这一参数需要满足能够存储特定字典 的所有位。所以,举例而言,你不能为6x6大小的marker生成一个5x5图像(这还没有考虑到Marker的边界)。除此之外,为了避免变形,这一参数最好和位数+边界的大小成正比,至少要比marker的大小大得多(如这个例子中的200),这样变形就不显著了。
  • 第四个参数是输出的图像。
  • 最后一个参数是一个可选的参数,它指定了Marker黑色边界的大小。这一大小与位数数目成正比。例如,值为2意味着边界的宽度将会是2的倍数。默认的值为1。
    生成的图像如下:
    在这里插入图片描述

estimatePoseSingleMarkers()

cv::aruco::estimatePoseSingleMarkers(v_marker_corner, marker_size, cameraMatrix, distCoeffs, rvecs, tvecs);
  • 函数作用:估计marker在相机坐标系中的3D位姿
    参数:
  • 第一个参数:
  • 第二个参数:marker的尺寸
  • 第三个参数:相机的内参矩阵
  • 第四个参数:相机的畸变系数
  • 第五个参数:输出marker坐标系到相机坐标系的旋转变换矩阵R
  • 第六个参数:输出marker坐标系到相机坐标系的旋转变换矩阵T
    注: marker坐标系用marker的位置有关, z轴向外。

solvePnP()

bool solvePnP( InputArray objectPoints, InputArray imagePoints,
                            InputArray cameraMatrix, InputArray distCoeffs,
                            OutputArray rvec, OutputArray tvec,
                            bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );
  • 函数作用:在solvePNP中通过世界坐标系下3D点坐标,图像坐标系下2D像素坐标,相机内参和畸变矩阵就可以求出rvec和tvec。

参数:

  • objectPoints - 世界坐标系下的控制点的坐标,vector的数据类型在这里可以使用
  • imagePoints - 在图像坐标系下对应的控制点的坐标。vector在这里可以使用
  • cameraMatrix - 相机的内参矩阵
  • distCoeffs - 相机的畸变系数
    以上两个参数通过相机标定可以得到。
  • rvec - 输出的旋转向量。使坐标点从世界坐标系旋转到相机坐标系
  • tvec - 输出的平移向量。使坐标点从世界坐标系平移到相机坐标系
  • flags - 默认使用CV_ITERATIV迭代法

5.ArUco模块之aruco标记的创建与检测

特别感谢这篇博文:
OpenCV4学习笔记(72)——ArUco模块之aruco标记的创建与检测

6.对aruco标记进行姿态估计的可视化显示

void detectPoseShow()
{
    // step 1: 加载当前搭载相机的内参矩阵和畸变系数
    cv::Mat cameraMatrix, distCoeffs;
    std::vector<double> camera = { 5421.4770, 0, 1268.5471, 0, 5443.9587,
                                   900.4128,  0, 0,         1 };
    cameraMatrix = cv::Mat(camera);
    cameraMatrix = cameraMatrix.reshape(1, 3);
    std::vector<double> dist = { -0.07785, -0.92021, -0.00303, 0.000363,
                                 31.54394 };
    distCoeffs = cv::Mat(dist);
    distCoeffs = distCoeffs.reshape(1, 1);

    cv::Mat src_image = cv::imread("aruco.bmp");

    // step 2: 对标记图像都进行aruco标记的检测以及姿态估计
    cv::Mat test_image;
    cv::resize(src_image, test_image, cv::Size(800, 600));
    cv::imshow("test_image", test_image);
    auto dictionary = cv::aruco::getPredefinedDictionary(
        cv::aruco::PREDEFINED_DICTIONARY_NAME::DICT_4X4_50);
    std::vector<std::vector<cv::Point2f>> corners, rejectedImgPoints;
    std::vector<int> ids;
    auto parameters = cv::aruco::DetectorParameters::create();
    cv::aruco::detectMarkers(test_image, dictionary, corners, ids, parameters,
                             rejectedImgPoints);
    cv::aruco::drawDetectedMarkers(test_image, corners, ids,
                                   cv::Scalar(0, 255, 0));

    std::vector<cv::Vec3d> rvecs;
    std::vector<cv::Vec3d> tvecs;
    cv::aruco::estimatePoseSingleMarkers(corners, 0.053, cameraMatrix,
                                         distCoeffs, rvecs, tvecs);

    // step 3: 绘制坐标轴并进行可视化显示
    for (int i = 0; i < rvecs.size(); i++) {
        cv::aruco::drawAxis(test_image, cameraMatrix, distCoeffs, rvecs[i],
                            tvecs[i], 0.02);
    }
    cv::imshow("pose", test_image);
}

效果:
在这里插入图片描述

个人觉得不错的博文:
增强现实应用:https://blog.csdn.net/sinat_17456165/article/details/105649131
OpenCV4学习笔记(74)——ArUco模块之对aruco标记进行实时姿态估计
OpenCV4学习笔记(76)——基于ArUco模块+QT实现增强现实(AR)
https://blog.csdn.net/weixin_45224869/article/month/2020/05
OpenCV官方文档:https://docs.opencv.org/4.x/d5/dae/tutorial_aruco_detection.html
使用opencv的aruco库进行位姿估计:https://blog.csdn.net/weixin_43053387/article/details/86301547
视觉标记定位aruco使用:https://blog.csdn.net/sinat_16643223/article/details/114252467
marker中的id计算:https://blog.csdn.net/sinat_16643223/article/details/114261925
ArUco使用:https://blog.csdn.net/sinat_16643223/article/details/115212935
对于ArUco标记的检测,并将坐标轴可视化:https://blog.csdn.net/qq_53457019/article/details/125811861

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

关于Aruco标记的理解并对其进行姿态估计的可视化显示 的相关文章

  • 【OpenCV3.2】Detection of ArUco Markers 翻译OpenCV文档:ArUco Marker的检测

    这个其实是翻译的opencv的官方文档的aruco部分 https docs opencv org 3 1 0 d5 dae tutorial aruco detection html 视觉降落的二维码检测用到这里面 摘自 xff1a ht
  • ArUco----一个微型现实增强库的介绍及视觉应用(二)

    很重要的一点就是这个 转载自 xff1a https www cnblogs com shawn0102 p 8039439 html ArUco 一个微型现实增强库的介绍及视觉应用 xff08 二 xff09 ArUco 一个微型现实增强
  • 基于opencv的ArUco的视觉定位之ArUco安装

    转载自 xff1a https blog csdn net weixin 43053387 article details 84952557 基于opencv的ArUco的视觉定位之ArUco安装 share space 2019 01 1
  • 这个博主对ARUCO的视觉定位有一系列文章可以看看

    这个博主对ARUCO的视觉定位有一系列文章可以看看 https blog csdn net lixujie666 t 61 1
  • ros使用usb摄像头追踪ArUco markers

    ros使用usb摄像头追踪ArUco markers 注意 xff1a 在通过ros使用usb摄像头追踪ArUco markers之前 xff0c 先进行相机的内参标定 xff0c 否则会出现以下问题 Error TF NAN INPUT
  • aruco识别,python实现

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

    1 创建 span class token keyword import span cv2 span class token keyword as span cv span class token keyword import span n
  • [OpenCV] aruco Markers识别

    reference http docs opencv org 3 1 0 d5 dae tutorial aruco detection html 姿态估计 xff08 Pose estimation xff09 在计算机视觉领域扮演着十分
  • 使用电脑摄像头计算aruco marker位姿(Python)

    一 效果图 刚做了一些尝试 xff0c 算两个aruco之间的距离 先算x方向 xff0c 用ID 61 12减去ID 61 13 xff0c tvec的三个坐标依次是Z Y X 所以 xff0c ID 61 12和ID 61 13的x距离
  • 使用Aruco二维码实现定位

    首先使用cv aruco estimatePoseSingleMarkers 函数后得到两个很重要的数据revc和tevc xff0c 分别是旋转向量和平移向量 通过这两个数据就可以得到相机在世界坐标系下的坐标 此处需要了解solvePnP
  • Windows配置ArUco

    windows10 vs2019 opencv3 4 6 注意 xff0c 一定要选择与opencv版本一样的opencv contrib 进行编译 xff0c 否则将会出现错误 xff0c 有很多的工程不能编译通过 xff0c 不能产生相
  • Aruco检测

    来自 xff1a https blog dgut top 2020 07 15 python aruco 检测ID span class token keyword import span numpy span class token ke
  • 源码实现 Aruco检测

    以下为实现aruco检测并读取id的代码 xff0c 直接复制粘贴即可 相信看到这篇博客的伙伴应该知道aruco xff0c 我就不解释了 opencv3 0以上有实现aruco的库 一 cmake编译信息 Cmakelist txt cm
  • ArUco----一个微型现实增强库的介绍及视觉应用(一)

    ArUco 一个微型现实增强库的介绍及视觉应用 xff08 一 xff09 ArUco 一个微型现实增强库的介绍及视觉应用 xff08 一 xff09 一 ArUco简介 ArUco是一个开源的微型的现实增强库 xff0c 目前好像已经集成
  • 自制aruco识别码

    要自制Aruco识别码 xff0c 你可以使用Aruco库中提供的工具生成自定义识别码 这些工具可以在多种编程语言 如C 43 43 xff0c Python 中使用 xff0c 生成满足你的特定要求的识别码 一旦生成了识别码 xff0c
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位

    前些时间写了篇文章把我在做这个项目中遇到的问题以及思路说了一下 传送门 http jcs130 iteye com blog 2185533 在上篇文章的思路下作了实现 已经达到了教授的要求 nbsp 首先第一步检测四个角的坐标 经试验 在
  • 【AR】使用OpenCV中的aruco模块实现增强现实

    1 ArUco marker ArUco marker是由S Garrido Jurado等人在2014年提出的 xff0c 全称是Augmented Reality University of Cordoba xff0c 详见他们的论文
  • .NetCore——OpenCvSharp识别Aruco图

    NetCore OpenCvSharp识别Aruco图 一 开始 在之前一章中在C 中引用了OpenCvSharp生成Aruco图 xff08 NetCore OpenCvSharp创建Aruco图 xff09 xff0c 那么这次就来看看
  • 如何使用 OpenCV Viz 和 ARUCO 转换增强现实应用的 3D 模型

    我正在开发一个简单的基于标记的增强现实应用程序OpenCV 可视化 and ARUCO 我只想在标记上可视化 3D 对象 PLY 格式 我可以使用 ARUCO 毫无问题地运行标记检测和姿态估计 返回旋转和平移向量 我可以在 Viz 窗口中可
  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将

随机推荐

  • 什么是死锁,产生死锁的原因及必要条件

    什么是死锁 xff1f 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而造成的一种僵局 xff0c 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 因此我们举个例子来描述 xff0c 如果此
  • ESP32红外控制舵机

    目录 一 ESP32红外解码 二 ESP32舵机控制 三 ESP32红外控制舵机 结语 ESP32作为一款功能强大的单片机 xff0c 常被应用于物联网 智能家居 智能硬件等领域 与其他单片机相比 xff0c ESP32具有更高的运行速度和
  • ESP32 OTA升级

    目录 一 ESP32 OTA升级原理 1 ESP32固件编译 2 固件的远程传输 二 基于ESP32HTTPUpdate库的OTA升级 1 硬件准备 2 软件实现 三 注意事项 1 升级文件大小限制 2 WiFi稳定性 3 固件版本号 结语
  • 基于ESP32的温湿度环境监测

    目录 一 传感器介绍 二 设计思路 三 电路连接 四 项目代码 五 注意事项 一 传感器介绍 SCH30 是一款温湿度一体化数字传感器 xff0c 采用CMOSens 技术 xff0c 提供出色的性能 可靠性和稳定性 它还具有超低能耗 xf
  • 小觅相机SDK安装与报错解决

    目录 安装小觅相机SDK1 下载SDK2 准备依赖3 编译代码出现问题 xff1a 报错 xff1a 原因 xff1a 解决方案 xff1a 4 编译安装ROS版本ROS的安装 5 配置 bashrc文件6 运行相机 最后顺利完成SDK安装
  • 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

    前言 该智能家居系统以 STC89C52单片机为控制核心 xff0c 结合 LCD1602 液晶显示屏 L298N电机驱动模块 光敏电阻 xff0c ESP8266WiFi模块 xff0c DS18B20温度计设计并实现了自动感光窗帘与居室
  • aarch64-linux-gnu-gcc交叉编译链工具

    aarch64 linux gnu gcc交叉编译工具链 安装编译可执行文件交叉编译 自己记录学习所用 安装 按下 CTRL 43 ALT 43 T打开控制台 xff0c 输入如下指令安装 span class token comment
  • CMakeLists.txt的创建和基本使用

    文章目录 1 简单介绍2 一个简单的例子3 将主函数及库函数一起编译4 带上外部库 学习记录所用 1 简单介绍 CMakeLists txt文件的编写比MakeFile文件的编写更加简单和容易理解 CMakeLists txt通过cmake
  • linux线程切换怎么实现

    Linux线程切换的实现涉及到操作系统的调度 和线程上下文 的切换 线程上下文包括程序计数器 xff08 PC xff09 和寄存器值 xff0c 以及线程的堆栈和堆栈指针等 操作系统通过调度器决定哪个线程将获得CPU时间片来执行 当一个线
  • PID实时无线调参

    今天实现了PID参数的实时无线整定 xff0c 记录一下历程 1 将CRC h CRC c usart2 c usart2 h等文件添加到STM32工程中 如下图 xff1a 2 其中 xff0c CRC h CRC c用于数据包的校验 x
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目 xff0c 涉及到工业相机 xff0c 需要对其进行二次开发 相机方面选择了海康威视 xff0c 网上关于海康威视工业相机SDK的开发资料很少 xff0c 官方文档里面虽然写的是支持C 43 43 开发的 xff0c 但其
  • FFmpeg源码分析:写音视频帧av_write_frame()

    FFmpeg在libavformat模块提供音视频的muxer封装与demuxer解封装 其中muxer封装文件包括avformat write header av write frame 和av write trailer 本文主要探讨a
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(二)

    本文接上次的博客海康威视工业相机SDK二次开发 xff08 VS 43 Opencv 43 QT 43 海康SDK 43 C 43 43 xff09 xff08 一 xff09 xff0c 上个博客中并未用到QT xff0c 本文介绍项目内
  • 单目相机标定(使用Matlab)

    内容 一 单目视觉成像原理1 理想情况下相机成像模型1 1 世界坐标系 gt 相机坐标系1 2 相机坐标系 gt 图像坐标系1 3 图像坐标系 gt 像素坐标系1 4 总结 xff1a 世界坐标系 gt 像素坐标系 二 考虑畸变情况下相机成
  • 三菱PLC与上位机进行通讯

    三菱PLC与上位机串口通信 一 三菱Fx系列PLC编程口通讯协议地址算法1 DEVICE READ xff08 读出软设备状态值 xff09 2 DEVICE WRITE xff08 向PLC 软设备写入值 xff09 3 位设备强制置位
  • 关于相机的一些参数计算(靶面、视野等)

    1 靶面尺寸和芯片尺寸 比如我使用的是上面这个相机 xff0c 一直不懂1 1 8 39 是什么意思 span class token number 1 1 span 英寸 靶面尺寸为宽 span class token number 12
  • 面试问题总结——关于OpenCV

    整理了一下网上和我面试中遇到的关于OpenCV相关的问题 其中因为我的简历中有个项目用到了特征点检测相关的知识 xff0c 所以整理了SIFT SURF和FLANN 有些知识点也不深入 xff0c 对于写的不对的地方 xff0c 欢迎指正
  • 全排列(C++)

    递归法实现全排列 全排列就是指n个元素随机组合 xff0c 且不重复的所有排列方式 比如 1 xff0c 2 xff0c 3 xff0c 就有123 xff0c 132 xff0c 213 xff0c 231 xff0c 312 xff0c
  • 海康威视工业相机IP设置说明

    整理电脑文件时翻到的 xff0c 记录下来方便以后查阅 第一步 先修改本机IP步骤如下 xff1a 1 打开本地连接 2 点击属性 3 选择协议 gt gt 点击属性 4 选择使用下面IP地址 5 自己设置IP地址 xff0c 然后点击确认
  • 关于Aruco标记的理解并对其进行姿态估计的可视化显示

    目录 1 什么是ArUco标记1 1 Marker和字典 2 通过使用OpenCV生成ArUco标记图3 检测Aruco标记4 一些API的介绍getPredefinedDictionary drawMarker estimatePoseS