[opencv_contrib]学习笔记-aruco库(4.6.0新版)已弃更

本文记录了从4.8.0版本到4.9版本aruco库的学习心得,着重介绍了字典生成方法的变化,getPredefinedDictionary的返回类型调整以及drawAxis函数的缺失,反映了新版本库对初学者的挑战。
摘要由CSDN通过智能技术生成

于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能解读的,就这样

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值