于3.11日开始学习aruco库,在此记录学习心得(终于写下第一篇原创帖QAQ)
学习用的是小白学视觉的书,用的是4.8.0版
-----------------------------------------------------------------------------------------------------
4.9最后一次更新(啃不动了,劳神苦心),4.6.0及以上版本的aruco库大改,很多函数没有了,学不动用回旧版了,现用的是4.5.5版本,应该是现GitHub上能下载的最后一个老版本了
-------------------------------------------------------------------------------------------------------
1、关于字典生成后绘制标记
opencv4.8.0不再使用drawMarker绘制标记,而是使用函数generateImageMarker(),其他参数与drawMarker相同
下面是官方create_marker.cpp
int main(int argc, char* argv[]) {
CommandLineParser parser(argc, argv, keys);
parser.about(about);
if (argc < 4) {
parser.printMessage();
return 0;
}
int markerId = parser.get<int>("id");
int borderBits = parser.get<int>("bb");
int markerSize = parser.get<int>("ms");
bool showImage = parser.get<bool>("si");
String out = parser.get<String>(0);
if (!parser.check()) {
parser.printErrors();
return 0;
}
aruco::Dictionary dictionary = aruco::getPredefinedDictionary(0);
if (parser.has("d")) {
int dictionaryId = parser.get<int>("d");
dictionary = aruco::getPredefinedDictionary(aruco::PredefinedDictionaryType(dictionaryId));
}
else if (parser.has("cd")) {
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
bool readOk = dictionary.aruco::Dictionary::readDictionary(fs.root());
if (!readOk) {
std::cerr << "Invalid dictionary file" << std::endl;
return 0;
}
}
else {
std::cerr << "Dictionary not specified" << std::endl;
return 0;
}
Mat markerImg;
aruco::generateImageMarker(dictionary, markerId, markerSize, markerImg, borderBits); //省流:参考此条
if (showImage) {
imshow("marker", markerImg);
waitKey(0);
}
imwrite(out, markerImg);
return 0;
}
2、关于getPredefinedDictionary()的返回值不再是Ptr<Dictionary>,而是Dictionary
获取特定模板字典返回的是Dictionary,但用detectMarkers检测字典又要传进Ptr<Dictionary>,不知道为什么改的这么难用,解决方法:
(偶然发现有个makePtr()可以返回Ptr<>)
Dictionary dictionary = getPredefinedDictionary(DICT_6X6_100);
Ptr<Dictionary>ptrdict = makePtr<Dictionary>(dictionary); //或右式改成:&dictionary;
然后后面画坐标轴的时候,原来的drawAxis函数又没有了,但我翻了一遍opencv文档,没发现aruco里代替的画坐标轴的函数,,???很无语,反正就是做不下去了,也没找到关于新版的blog能解读的,就这样