OpenCV Tracker 属性 访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效

OpenCV Tracker property access fails with SEGFAULT on ARM, but works in X86_64

我正在尝试将我的应用程序移植到 raspberry pi 4,但没有跟踪器。我基本上使用跟踪器作为 class 成员。虽然这在我的 Ubuntu 机器上有效,但它会导致树莓派出现分段错误。我用这个最小的工作示例重现了这个问题(它没有任何意义,但准确地描述了我的问题)。我正在使用 OpenCV 4.3.0 并支持两者的 INFERENCE ENGINE(在树莓派中我使用 docker 构建它,如文档中所示)。当我尝试访问跟踪器属性 (getDefaultName) 时发生分段错误。我不明白为什么这在我的计算机上有效但在树莓派上失败(我还补充说 OpenCV documentation 中的跟踪器示例有效)

main.cpp

#include <iostream>
#include "person.h"

using namespace std;

int main()
{
    cout << "Hello";
    person p;
    p.createTracker("mosse");
    if (p.tracker){
        cout << "not null" << endl;
    }
    else {
        cout << "null" << endl;
    }
    cout << p.tracker->getDefaultName();
    return 0;
}

person.h

#ifndef PERSON_H
#define PERSON_H

#include <opencv2/core/core.hpp>
#include <opencv2/tracking/tracker.hpp>

class person
{
public:
    person();
    cv::Ptr<cv::Tracker> tracker;

    void createTracker(std::string type);

};

#endif // PERSON_H

person.cpp

#include "person.h"

person::person()
{
}

void person::createTracker(std::string type)
{

    if(type== "mosse") {
        tracker = cv::TrackerMOSSE::create();
    } else if(type == "csrt")
        tracker = cv::TrackerCSRT::create();
    else if(type == "kcf")
        tracker = cv::TrackerKCF::create();
    else if(type == "tld")
        tracker = cv::TrackerTLD::create();
    else {
        std::cout << "Tracking type not specified! This should not happen.";
    }

编辑 "not null" 打印出来

编辑 2

将所有内容放入 main 函数中会按预期工作。为什么?

#include <iostream>
#include <opencv2/tracking/tracking.hpp>
#include <opencv2/core/core.hpp>

using namespace std;

int main()
{

    cout << "Hello" << endl;

    cv::Ptr<cv::Tracker> tracker = cv::TrackerMOSSE::create();

    cout << tracker->getDefaultName() << endl;

    return 0;
}

是Opencv 4.3.0的bug,我开了issue here 还是没有人回答,不知道有没有修复。无论如何,相同的代码在 OpenCV 3.4.10 中有效,但在 4.1.2 中失败,证实了我的想法,版本 4 应该有一些问题。

编辑 截至2021年4月23日,4.5.2版本仍然存在错误,我开了一个新问题here