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 }