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;
}
我正在尝试将我的应用程序移植到 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;
}