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;

【问题讨论】:

也许trackernullptr?在假设它指向有效的地方之前,您应该检查它。 我刚刚检查过,它不是 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 中有效的主要内容,如果未能解决你的问题,请参考以下文章

重新初始化后 OpenCV 3 Tracker 将无法工作

Rosmin--OpenCV Color Blob Tracker on Android

Rosmin--OpenCV Color Blob Tracker on Android

win10 下的opencv3.2.0实现tracker常见问题----必要条件整理

ARM服务器上安装FastDFS注意事项

结合opencv,在arm开发板上运行打开摄像头test文件,出现错误。。如下图: