【发布时间】:2020-05-27 13:30:55
【问题描述】:
我正在尝试将我的应用程序移植到 raspberry pi 4,但没有使用跟踪器。我基本上使用跟踪器作为班级成员。虽然这适用于我的 Ubuntu 机器,但它会导致 raspberry 出现分段错误。我用这个最小的工作示例重现了这个问题(它没有任何意义,但准确地描述了我的问题)。我正在使用 OpenCV 4.3.0 并支持两者的推理引擎(在树莓中,我使用文档中指示的 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;
}
人.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;
}
【问题讨论】:
-
也许
tracker是nullptr?在假设它指向有效的地方之前,您应该检查它。 -
我刚刚检查过,它不是 nullptr(编辑问题)。我还想补充一点,这是完整的 MWE,没有别的,它在我的机器上工作,但在树莓派中的段错误..
-
getDefaultName()返回什么数据类型?是std::string吗? -
virtual std::string .. 我正在运行其他测试,问题仅在于“mosse”,所以我怀疑它可能是 OpenCV 的错误 ..
-
只是想让您确定您的应用程序版本的
std::string使用与返回给您的std::string相同的堆。如果不是,那么这将是您所看到的行为的原因之一。如果std::string来自 DLL,那么如果应用程序不是使用某些选项构建的,那么它更容易受到内存损坏问题的影响。
标签: c++ opencv pointers segmentation-fault