OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效
Posted
技术标签:
【中文标题】OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效【英文标题】:OpenCV Tracker property access fails with SEGFAULT on ARM, but works in X86_64 【发布时间】: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,那么如果应用程序不是使用某些选项构建的,那么它更容易受到内存损坏问题的影响。
【参考方案1】:
这是 Opencv 4.3.0 中的一个错误,我打开了一个问题 here 但仍然没有答案,我不知道它是否已修复。无论如何,相同的代码在 OpenCV 3.4.10 中有效,在 4.1.2 中失败,证实了我的想法,版本 4 中应该有一些东西。
编辑 截至 2021 年 4 月 23 日,4.5.2 版本的 bug 仍然存在,我打开了一个新问题 here。
【讨论】:
以上是关于OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效的主要内容,如果未能解决你的问题,请参考以下文章
Rosmin--OpenCV Color Blob Tracker on Android
Rosmin--OpenCV Color Blob Tracker on Android