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ì)
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ì)
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()文章來源:http://www.zghlxwxcb.cn/news/detail-433904.html
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í)
2.激光雷達(dá)和相機(jī)的聯(lián)合標(biāo)定
還有很多其他的應(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)!