Доступ к свойствам OpenCV Tracker не работает с SEGFAULT на ARM, но работает в X86_64 - PullRequest
1 голос
/ 27 мая 2020

Пытаюсь перенести свое приложение на raspberry pi 4, но с трекерами не повезло. Я в основном использую трекер как член класса. Хотя это работает на моей машине с Ubuntu, это вызывает ошибку сегментации в raspberry. Я воспроизвел проблему с помощью этого минимального рабочего примера (это не имеет никакого смысла, но точно отражает мою проблему). Я использую OpenCV 4.3.0 с поддержкой INFERENCE ENGINE для обоих (в малине я построил его с использованием docker, как указано в документации). Ошибка сегментации возникает, когда я пытаюсь получить доступ к свойствам трекера (getDefaultName). Я не могу понять, почему это работает на моем компьютере и не работает на Raspberry (я также добавляю, что пример трекера в документации OpenCV работает)

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.";
    }

EDIT "not null "печатается

РЕДАКТИРОВАТЬ 2

Помещение всего в главную функцию работает должным образом. Почему?

#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;
}
...