国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Opencv之Aruco碼的檢測和姿態(tài)估計(jì)

這篇具有很好參考價值的文章主要介紹了Opencv之Aruco碼的檢測和姿態(tài)估計(jì)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

1.介紹

Aruco碼是由寬黑色邊框和確定其標(biāo)識符(id)的內(nèi)部二進(jìn)制矩陣組成的正方形標(biāo)記。它的黑色邊框有助于其在圖像中的快速檢測,內(nèi)部二進(jìn)制編碼用于識別標(biāo)記和提供錯誤檢測和糾正。單個aruco 標(biāo)記就可以提供足夠的對應(yīng)關(guān)系,例如有四個明顯的角點(diǎn)及內(nèi)部的二進(jìn)制編碼,所以aruco 標(biāo)記被廣泛用來增加從二維世界映射到三維世界時的信息量,便于發(fā)現(xiàn)二維世界與三維世界之間的投影關(guān)系,從而實(shí)現(xiàn)姿態(tài)估計(jì)、增強(qiáng)現(xiàn)實(shí)等應(yīng)用。

2.碼的創(chuàng)建

首先我們要指定一個字典,這個字典表示的是創(chuàng)建出來的aruco 標(biāo)記具有怎樣的尺寸、怎樣的編碼等我們使用:APlgetPredefined Dictionary ()來聲明我們使用的字典。 些預(yù)定義字典。而且字典名稱表示了該字典的aruco 標(biāo)記數(shù)量和尺寸,例如DICT_7X7_50表示一個包含了50種7x7位標(biāo)記的字典。
在OpenCv中提供了多種預(yù)定義字典,我們可以通過PREDEFINED_DICTIONARY_NAME來查看:

auto dictionary = aruco::getPredefinedDictionary(aruco::DICT_6X6_250);
可使用的字典:
        DICT_4X4_50=0,             
        DICT_4X4_100=1, 
        DICT_4X4_250=2,
        DICT_4X4_1000=3, 
        DICT_5X5_50=4, 
        DICT_5X5_100=5, 
        DICT_5X5_250=6, 
        DICT_5X5_1000=7, 
        DICT_6X6_50=8, 
        DICT_6X6_100=9,
        DICT_6X6_250=10, 
        DICT_6X6_1000=11, 
        DICT_7X7_50=12,
        DICT_7X7_100=13, 
        DICT_7X7_250=14, 
        DICT_7X7_1000=15, 
        DICT_ARUCO_ORIGINAL = 16

Aruco碼和Aruco碼板的創(chuàng)建:

#include <opencv2/highgui.hpp>
#include <opencv2/aruco.hpp>

using namespace cv;

namespace {
const char* about = "Create an ArUco grid board image main -w=2 -h=2 -l=10 -s=5 -d=16 -si=true ";
const char* keys  =
"{@outfile |<none> | Output image }"
"{w        |       | Number of markers in X direction }"
"{h        |       | Number of markers in Y direction }"
"{l        |       | Marker side length (in pixels) }"
"{s        |       | Separation between two consecutive markers in the grid (in pixels)}"
"{d        |       | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,"
"DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, "
"DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"
"DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"
"{mid        | 0      | markerboard start id}"
"{m        |       | Margins size (in pixels). Default is marker separation (-s) }"
"{bb       | 1     | Number of bits in marker borders }"
"{si       | false | show generated image }";
}

int main(int argc, char *argv[]) {
    CommandLineParser parser(argc, argv, keys);
    parser.about(about);

    if(argc < 7) {
        parser.printMessage();
        return 0;
    }

    int markersX = parser.get<int>("w");
    int markersY = parser.get<int>("h");
    int markerLength = parser.get<int>("l");
    int markerSeparation = parser.get<int>("s");
    int dictionaryId = parser.get<int>("d");
    int margins = markerSeparation;
    if(parser.has("m")) {
        margins = parser.get<int>("m");
    }

    int borderBits = parser.get<int>("bb");
    bool showImage = parser.get<bool>("si");
    int marker_st_id = parser.get<int>("mid");
    String out = parser.get<String>(0);

    if(!parser.check()) {
        parser.printErrors();
        return 0;
    }

    Size imageSize;
    imageSize.width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins;
    imageSize.height =
        markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins;

    Ptr<aruco::Dictionary> dictionary =
    aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));

    Ptr<aruco::GridBoard> board = aruco::GridBoard::create(markersX, markersY, float(markerLength),
    float(markerSeparation), dictionary, marker_st_id);

    // show created board
    Mat boardImage;
    board->draw(imageSize, boardImage, margins, borderBits);

    if(showImage) {
        imshow("board", boardImage);
        waitKey(0);
    }

    imwrite(out, boardImage);

    return 0;
}

3.檢測和姿態(tài)估計(jì)

3.1 Aruco標(biāo)記的檢測

cv::aruco::detectMarkers()

cv::aruco::detectMarkers(image_, dictionary_, corners, ids, detectorParams_, rejected);
參數(shù):
(1)image :輸入的需要檢測標(biāo)記的圖像。 
(2)dictionary :進(jìn)行檢測的字典對象指針,這里的字典就是我們創(chuàng)建aruco 標(biāo)記時所使用的字典,檢測什么類型的aruco 標(biāo)記就使用什么類型的字典。 
(3)corners :檢測到的aruco 標(biāo)記的角點(diǎn)列表,其四個角點(diǎn)均按其原始順序返回 (從左上角開始順時針旋轉(zhuǎn))。 
(4)ids:檢測到的每個標(biāo)記的id,需要注意的是第三個參數(shù)和第四個參數(shù)具有相同的大小。 
(5)parameters:Detection parameters 類的對象,該對象包括在檢測過程中可以自定義的所有參數(shù)。
(6)參數(shù)rejectedImgPoints 

3.2 單個Aruco碼的姿態(tài)估計(jì)

Opencv之Aruco碼的檢測和姿態(tài)估計(jì)
cv::aruco::estimatePosesingleMarkers()

cv::aruco::estimatePoseSingleMarkers(corners, markerLength, intrinsic_matrix_, distortion_matrix_, rvecs, tvecs, _objPoints);
參數(shù):
(1)corners :detectMarkers ()返回的檢測到標(biāo)記的角點(diǎn)列表; 
(2)markerLength :aruco 標(biāo)記的實(shí)際物理尺寸,也就是打印出來的aruco標(biāo)記的實(shí)際尺寸,以m為單位; 
(3)intrinsic_matrix_ :相機(jī)的內(nèi)參矩陣;
(4)distortion_matrix_ :相機(jī)的畸變參數(shù);
(5)rvecs : 標(biāo)記相對于相機(jī)的旋轉(zhuǎn)向量。 
(6)tvecs : 標(biāo)記相對于相機(jī)的平移向量。 
(7)_objPoints :每個標(biāo)記角點(diǎn)的對應(yīng)點(diǎn)數(shù)組。 

通過檢測到的corners,并分別對每個標(biāo)記進(jìn)行姿態(tài)估計(jì)。 因此,每個aruco 標(biāo)記都將返回一個相對于相機(jī)的旋轉(zhuǎn)向量和平移矢量,返回的點(diǎn)數(shù)組是將標(biāo)記角點(diǎn)從每個標(biāo)記坐標(biāo)系轉(zhuǎn)換到相機(jī)坐標(biāo)系下的表示。 標(biāo)記坐標(biāo)系原點(diǎn)位于標(biāo)記的中心,Z軸垂直于標(biāo)記平面,每個標(biāo)記的四個角點(diǎn)在其坐標(biāo)系中的坐標(biāo)為:(-markerLength/ 2, markerLength/2,0) (markerLength/ 2, markerLength/ 2, 0) (markerLength/2,-markerLength/2,0) (-markerLength /2,-markerLength /2,0),其中,markerLength 是aruco 標(biāo)記的實(shí)際邊長。

3.3 單個Aruco碼板的姿態(tài)估計(jì)

Opencv之Aruco碼的檢測和姿態(tài)估計(jì)
1.創(chuàng)建aruco碼板
cv::aruco::GridBoard::create()

// create board object
cv::Ptr<cv::aruco::GridBoard> gridboard =
cv::aruco::GridBoard::create(markersX, markersY, markerlength, markerseparation, dictionary_, ids[0]);
board.markerboard_ptr = gridboard.staticCast<cv::aruco::Board>();
參數(shù):
(1)markersX: 碼板的橫向碼的個數(shù);
(2)markersY: 碼板的縱向碼的個數(shù);
(3)markerlength: 每一個碼的邊長,單位m;
(4)markerseparation: 兩個碼之間的間隔寬度,單位m;
(5)dictionary_:字典;
(6)ids[0]:碼板的第一個碼的id值;

2.姿態(tài)估計(jì)
cv::aruco::estimatePoseBoard()

cv::aruco::estimatePoseBoard(corners, ids, markerboard_ptr, intrinsic_matrix_, distortion_matrix_, rvec, tvec);

碼板識別的坐標(biāo)系是以碼板的左下角為坐標(biāo)原點(diǎn)建立的坐標(biāo)系,如圖所示。

3.4 Aruco碼可視化

1.坐標(biāo)軸的可視化
cv::aruco::drawAxis()

cv::aruco::drawAxis(image_, intrinsic_matrix_, distortion_matrix_, rvecs[i], tvecs[i], markerLength * 2.5f);
參數(shù):
(1)image_ :繪制坐標(biāo)軸的圖像;
(2)intrinsic_matrix_ :相機(jī)的內(nèi)參矩陣;
(3)distortion_matrix_ :相機(jī)的畸變參數(shù); 
(4)rvecs:旋轉(zhuǎn)向量;
(5)tvecs:平移向量;
(6)markerLength :繪制坐標(biāo)軸的長度,單位為m。

2.標(biāo)記的可視化
cv::aruco::drawDetectedMarkers()

cv::aruco::drawDetectedMarkers(image_, board.match_corners, board.match_ids);
參數(shù):
(1)image :繪制標(biāo)記的圖像;
(2)corners :檢測到的aruco 標(biāo)記的角點(diǎn)列表;
(3)ids:檢測到的每個標(biāo)記對應(yīng)到其所屬字典中的id ;
(4)borderColor :繪制標(biāo)記外框的顏色;

4.應(yīng)用

1.增強(qiáng)現(xiàn)實(shí)
Opencv之Aruco碼的檢測和姿態(tài)估計(jì)
2.激光雷達(dá)和相機(jī)的聯(lián)合標(biāo)定
Opencv之Aruco碼的檢測和姿態(tài)估計(jì)
還有很多其他的應(yīng)用,這里就不舉例了。文章來源地址http://www.zghlxwxcb.cn/news/detail-433904.html

到了這里,關(guān)于Opencv之Aruco碼的檢測和姿態(tài)估計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于目標(biāo)檢測、跟蹤 的人體姿態(tài)估計(jì) 算法進(jìn)行跌倒檢測 ---- fall detection

    前序文章: 深度學(xué)習(xí)與視頻分析簡介 視頻分析:基于目標(biāo)檢測(YOLO)實(shí)現(xiàn)走路看手機(jī)檢測、玩手機(jī)檢測、跌倒檢測等 基于深度學(xué)習(xí)算法的行為識別解決方案:打電話、玩手機(jī)、摔倒等行為動作的識別,跟蹤

    2024年02月09日
    瀏覽(20)
  • 簡要介紹 | 基于深度學(xué)習(xí)的姿態(tài)估計(jì)技術(shù)

    簡要介紹 | 基于深度學(xué)習(xí)的姿態(tài)估計(jì)技術(shù)

    注1:本文系“簡要介紹”系列之一,僅從概念上對基于深度學(xué)習(xí)的姿態(tài)估計(jì)技術(shù)進(jìn)行非常簡要的介紹,不適合用于深入和詳細(xì)的了解。 注2:\\\"簡要介紹\\\"系列的所有創(chuàng)作均使用了AIGC工具輔助 姿態(tài)估計(jì) 是計(jì)算機(jī)視覺領(lǐng)域的一個重要研究方向,它主要關(guān)注如何從圖像或視頻中提

    2024年02月09日
    瀏覽(25)
  • YOLOv5姿態(tài)估計(jì):HRnet實(shí)時檢測人體關(guān)鍵點(diǎn)

    YOLOv5姿態(tài)估計(jì):HRnet實(shí)時檢測人體關(guān)鍵點(diǎn)

    前言: Hello大家好,我是Dream。 今天來學(xué)習(xí)一下 利用YOLOv5進(jìn)行姿態(tài)估計(jì),HRnet與SimDR檢測圖片、視頻以及攝像頭中的人體關(guān)鍵點(diǎn) ,歡迎大家一起前來探討學(xué)習(xí)~ 首先需要我們利用Pycharm直接克隆github中的姿態(tài)估計(jì)原工程文件,如果不知道怎樣在本地克隆Pycharm,可以接著往下看,

    2024年01月17日
    瀏覽(27)
  • Mediapipe人體骨架檢測和實(shí)時3d繪制——Mediapipe實(shí)時姿態(tài)估計(jì)

    Mediapipe人體骨架檢測和實(shí)時3d繪制——Mediapipe實(shí)時姿態(tài)估計(jì)

    大約兩年前,基于自己的理解我曾寫了幾篇關(guān)于Mediapipe的文章,似乎幫助到了一些人。這兩年,忙于比賽、實(shí)習(xí)、畢業(yè)、工作和考研。上篇文章已經(jīng)是一年多前發(fā)的了。這段時間收到很多私信和評論,請?jiān)彑o法一一回復(fù)了。我將嘗試在這篇文章里回答一些大家經(jīng)常問到的問

    2024年02月03日
    瀏覽(90)
  • yolov8+多算法多目標(biāo)追蹤+實(shí)例分割+目標(biāo)檢測+姿態(tài)估計(jì)

    yolov8+多算法多目標(biāo)追蹤+實(shí)例分割+目標(biāo)檢測+姿態(tài)估計(jì)

    YOLOv8是一種先進(jìn)的目標(biāo)檢測算法,結(jié)合多種算法實(shí)現(xiàn)多目標(biāo)追蹤、實(shí)例分割和姿態(tài)估計(jì)功能。該算法在計(jì)算機(jī)視覺領(lǐng)域具有廣泛的應(yīng)用。 首先,YOLOv8算法采用了You Only Look Once(YOLO)的思想,通過單次前向傳遞將目標(biāo)檢測問題轉(zhuǎn)化為回歸問題。它使用了深度卷積神經(jīng)網(wǎng)絡(luò),能

    2024年02月20日
    瀏覽(31)
  • YOLOv8 人體姿態(tài)估計(jì)(關(guān)鍵點(diǎn)檢測) python推理 && ONNX RUNTIME C++部署

    YOLOv8 人體姿態(tài)估計(jì)(關(guān)鍵點(diǎn)檢測) python推理 && ONNX RUNTIME C++部署

    目錄 ? 1、下載權(quán)重 ?編輯2、python 推理 3、轉(zhuǎn)ONNX格式 4、ONNX RUNTIME C++ 部署 utils.h utils.cpp detect.h detect.cpp main.cpp CmakeList.txt 我這里之前在做實(shí)例分割的時候,項(xiàng)目已經(jīng)下載到本地,環(huán)境也安裝好了,只需要下載pose的權(quán)重就可以 輸出: ? 用netron查看一下: ?如上圖所是,YOLO

    2024年02月07日
    瀏覽(29)
  • aruco二維碼檢測原理詳解與基于opencv的代碼實(shí)現(xiàn)(自己詳細(xì)整理)

    aruco二維碼檢測原理詳解與基于opencv的代碼實(shí)現(xiàn)(自己詳細(xì)整理)

    aruco二維碼檢測原理講解及基于opencv的代碼和ros功能包實(shí)現(xiàn) 20240403 aruco二維碼介紹 aruco又稱為aruco標(biāo)記、aruco標(biāo)簽、aruco二維碼等,其中 CharucoBoard GridBoard AprilTag 原理相通,只是生成字典不同,而AprilTag用于機(jī)器人領(lǐng)域或可編程攝像頭比較多,而aruco CharucoBoard GridBoard則用于AR應(yīng)用

    2024年04月13日
    瀏覽(28)
  • YOLOPose:除了目標(biāo)檢測,YOLO還能不花代價地估計(jì)人體姿態(tài),對實(shí)時性能有要求必看!

    YOLOPose:除了目標(biāo)檢測,YOLO還能不花代價地估計(jì)人體姿態(tài),對實(shí)時性能有要求必看!

    導(dǎo)讀: YOLO,是一種流行的目標(biāo)檢測框架。如果將YOLO引入姿態(tài)檢測任務(wù)中,將取得什么結(jié)果呢?這篇文章實(shí)現(xiàn)了單階段的2D人體姿態(tài)檢測,與自上而下或自下而上的方法不同,該方法將人體檢測與關(guān)鍵點(diǎn)估計(jì)聯(lián)合實(shí)現(xiàn),在不采用數(shù)據(jù)增強(qiáng)如翻轉(zhuǎn)、多尺度等情況下,實(shí)現(xiàn)COCO ke

    2024年02月06日
    瀏覽(16)
  • YOLOv8的目標(biāo)對象的分類,分割,跟蹤和姿態(tài)估計(jì)的多任務(wù)檢測實(shí)踐(Netron模型可視化)

    YOLOv8的目標(biāo)對象的分類,分割,跟蹤和姿態(tài)估計(jì)的多任務(wù)檢測實(shí)踐(Netron模型可視化)

    YOLOv8是目前最新版本,在以前YOLO版本基礎(chǔ)上建立并加入了一些新的功能,以進(jìn)一步提高性能和靈活性,是目前最先進(jìn)的模型。YOLOv8旨在快速,準(zhǔn)確,易于使用,使其成為廣泛的 目標(biāo)檢測和跟蹤,實(shí)例分割,圖像分類和姿態(tài)估計(jì)任務(wù) 的絕佳選擇。 YOLOv8的安裝條件 Python=3.8 Py

    2024年02月11日
    瀏覽(25)
  • Python Opencv實(shí)踐 - 人體姿態(tài)檢測

    Python Opencv實(shí)踐 - 人體姿態(tài)檢測

    ? ? ? ? 本文仍然使用mediapipe做練手項(xiàng)目,封裝一個PoseDetector類用作基礎(chǔ)姿態(tài)檢測類。 ? ? ? ? mediapipe中人體姿態(tài)檢測的結(jié)果和手部跟蹤檢測的結(jié)果是類似的,都是輸出一些定位點(diǎn),各個定位點(diǎn)的id和對應(yīng)人體的位置如下圖所示: ? ? ? ? 關(guān)于mediapipe的pose解決方案類更詳細(xì)

    2024年02月03日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包