aruco板_Aruco生成标记与板的代码详解——

本文详细介绍了如何使用C++代码生成Aruco标记和网格板,包括设置参数如标记数量、边长、分隔距离、字典类型等,并展示了如何使用aruco库创建GridBoard对象和绘制图像。
摘要由CSDN通过智能技术生成

1 #include

2 #include

3

4 using namespacecv;5

6 namespace{7 const char* about = "Create an ArUco grid board image";8 const char* keys =

9 "{@outfile | | Output image }"

10 "{w | | Number of markers in X direction }"

11 "{h | | Number of markers in Y direction }"

12 "{l | | Marker side length (in pixels) }"

13 "{s | | Separation between two consecutive markers in the grid (in pixels)}"

14 "{d | | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,"

15 "DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7,"

16 "DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"

17 "DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"

18 "{m | | Margins size (in pixels). Default is marker separation (-s) }"

19 "{bb | 1 | Number of bits in marker borders }"

20 "{si | false | show generated image }";21 }22

23 int main(int argc, char *argv[]) {24 /*

25 * 函数功能:构造函数26 * 参数:27 * [in] argc main函数中的第一参数,即运行程序中获得指令的个数28 * [in] argv main函数中的第二个参数,即运行程序中指令的内容29 * [in] key_map 当启动程序是没有输入任何指令,则使用key_map中默认的指指令。30 * 备注:31 * key_map中的格式:32 * "{ s| 123asd |string parameter}33 * { d| 100 |digit parameter }34 * { @c| false |without camera }35 * { 1| some text |help }36 * { 2| 333 |another help }"37 *参数or指令名称|指令or参数内容 |指令说明38 *39 *40 * 运行程序输入指令的方式如下:(例如程序名称为extest.exe)41 * extest.exe -s=123asdd -d=1000 -@c=1042 * 注意:指令名称前面需要加一个“-”,或“--”。当输入指令后面没有参数,默认为true43 * 另外,前面加@的指令可以不输入指令名称,直接设置指令内容即可。44 * 没有输入的指令,则使用key_map中的默认值45 */

46 CommandLineParser parser(argc, argv, keys);47

48 /*

49 设置关于消息。50 当调用printMessage时,关于参数消息将显示在参数表之前。51 */

52 parser.about(about);53 //指令数小于7时,打印关于信息

54 if(argc < 7) {55 parser.printMessage();56 return 0;57 }58

59 //X方向上的标记数

60 int markersX = parser.get("w");61 //Y方向上的标记数

62 int markersY = parser.get("h");63 //标记边长(以像素为单位)

64 int markerLength = parser.get("l");65 //网格中两个连续标记之间的分隔(以像素为单位)

66 int markerSeparation = parser.get("s");67 //预定义的字典

68 int dictionaryId = parser.get("d");69 //边距大小(以像素为单位)默认为标记分隔符(-s)

70 int margins =markerSeparation;71 if(parser.has("m")) {72 margins = parser.get("m");73 }74 //标记边界中的位数

75 int borderBits = parser.get("bb");76 //显示生成的图像

77 bool showImage = parser.get("si");78 //获得@outfile的名称

79 String out = parser.get(0);80 //判断是否有错误,有则打印

81 if(!parser.check()) {82 parser.printErrors();83 return 0;84 }85 //确定页边距与标记的布局

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

91 //定义变量类型为Ptr<:dictionary>的指针,返回在PREDEFINED_DICTIONARY_NAME中定义的预定义词典之一

92 Ptr<:dictionary> dictionary =

93 aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));94

95 //定义变量类型为Ptr<:gridboard>的指针,返回GridBoard对象

96 /*

97 static Ptr cv::aruco::GridBoard::create(int markersX,98 int markersY,99 float markerLength,100 float markerSeparation,101 const Ptr & dictionary,102 int firstMarker = 0)103 Parameters:104 markersX X方向上的标记数105 markersY Y方向上的标记数106 markerLength 标记边长(通常以米为单位)107 markerSeparation 两个标记之间的分隔(与markerLength相同的单位)108 dictionary 指示标记类型的标记字典109 firstMarker 词典中要在板上使用的第一个标记的ID110 */

111 Ptr<:gridboard> board = aruco::GridBoard::create(markersX, markersY, float(markerLength),112 float(markerSeparation), dictionary);113

114 //show created board

115 /*

116 void cv::aruco::GridBoard::draw(Size outSize,117 OutputArray img,118 int marginSize = 0,119 int borderBits = 1)120 Parameters121 outSize 输出图像的大小(以像素为单位)122 img 用面板输出图像。该图像的大小为outSize,并且板将在中间,并保持木板的比例123 marginSize 输出图像中板的最小边距(以像素为单位)124 borderBits 标记边框的宽度125 */

126 Mat boardImage;127 board->draw(imageSize, boardImage, margins, borderBits);128

129 if(showImage) {130 imshow("board", boardImage);131 waitKey(0);132 }133

134 imwrite(out, boardImage);135

136 return 0;137 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值