如何?:将cv :: Mat定义为类成员,然后在源代码文件中修改它

时间:2014-09-18 13:03:08

标签: c++ class opencv smart-pointers mat

我定义了一个具有cv :: Mat数据成员的类。然后在类方法中,我希望以某种方式修改此矩阵(更改值,添加行/列等)。

但是,我一直收到分段错误错误(我将错误放在底部)。

我想过使用cv :: Mat&引用而不是cv :: Mat作为类的数据成员,但随后它变得“杂乱”,因为它们必须被初始化。

我怀疑我必须以某种方式使用智能指针,但我的背景更多是C而不是C ++。

如果有人可以一步一步解释,我会非常感激。谢谢。

//Header file
class A
{
     public:
         A();
         void do_something();

     private:
         cv::Mat data;
}

//Source code file
#include "A.h"

A::A():data(cv::Mat()){}

void A::do_something()
{
   cv::Mat tmp(2,2,CV_32FC1, cv::Scalar(6));
   data = tmp;
   //also other mehtods fail like
   //data = tmp.clone();
   //data.push_back(2);
}

我得到的分段错误错误:

  • 使用data =(到其他矩阵)时

    编程接收信号SIGSEGV,分段故障。 xv :: Mat :: release(this = 0x0)中的0x00000000004051cc /opt/ros/hydro/include/opencv2/core/mat.hpp:366     if(refcount&&&& CV_XADD(refcount,-1)== 1)

  • 当我使用例如:data.push_back(value)

    编程接收信号SIGSEGV,分段故障。 cv :: Mat :: push_back中的0x00000000004056cf(this = 0x0,elem = @ 0x7fffffffdb2c:6)at /opt/ros/hydro/include/opencv2/core/mat.hpp:684     if(!data)

1 个答案:

答案 0 :(得分:1)

首先,感谢所有回复的人的帮助;他们让我以某种方式注意到我的错误。并道歉,因为它非常愚蠢。

问题在于我在test.cpp中的main函数中,我声明了一个指向A类的指针,但我没有用'new'命令初始化它。所以我猜数据cv :: Mat没有正确初始化导致分段错误。

//test.cpp
#include "A.h" 

int main()
{
    A* a;
    //a = new A(); //this line was missing in my program
    a->do_something();

    return 0;
}