无法在C ++类中分配cv :: Mat对象

时间:2017-06-13 01:35:38

标签: c++ opencv

这是我的代码,用于定义一个类并输入一些双精度数,以便成员函数可以给出一个Mat对象。

#include <opencv2/core.hpp>
#include <iostream>

using namespace std;
using namespace cv;

class A{
    public:
        void fun(double, double, double);
        void printfun();

    private:
        Mat R;
};

int main(int argc, char* argv[]){
    A a;
    a.fun(0.05, 0.05, 0.5);
    a.printfun();

    return 0;
}

void A::fun(double R_x, double R_y, double R_theta){
    R = (Mat_<double>(3,3) << R_x,0,0,0,R_y,0,0,R_theta);
    #double R_init[3][3]={{R_x, 0,   0}, 
    #                    {0,   R_y, 0}, 
    #                    {0,   0,   R_theta*3.1415/180}};
    #    
    #R = Mat(3, 3, CV_64F, R_init);

    cout << R << endl;

}

void A::printfun(){
    cout << R << endl;
}

在函数A::fun中,我需要计算一个Mat对象 R ,它被定义为私有变量。但是,当我有趣地使用第一句话时,coutfun()中的printfun()都会给出正确的矩阵。如果我使用灰色方法,则cout中的fun()打印正确,但cout中的printfun()会生成错误的矩阵R.

这有点奇怪,因为当fun()返回时,第二种方法计算的矩阵R会以某种方式发生变化。如果此类方法未在类类型中使用,则它将正常运行并提供正确的矩阵R。

另一个问题与此问题无关。如果我总是可以在公共或私有中定义变量(比如说R),然后使用成员函数为这个变量赋值,那么成员函数的返回类型总是可以&#34; void&#34;而不是它分配的变量的类型。这是c ++类类型的运作方式吗?

我是c ++的新手,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

您正在观察的行为有一个简单的解释。

  

似乎当fun()返回时,矩阵R由第二个计算   方法有所改变

你的观察是正确的。以下是第一个和第二个任务之间的区别:

在第一种方法中,R内容的内存是动态分配的,然后用指定的值初始化。当函数fun返回时,由于动态分配,R的内容将被保留。

在第二种方法中,使用指定的值初始化静态数组R_init(函数fun的本地)。然后在下一行中创建R并设置为使用R_init的内容。这里的关键区别是没有动态内存分配。 R只使用已分配的数组R_init来存储值。这意味着如果我们修改R_initR的内容也会发生变化。当fun返回时,无法保证R_init(a.k.a undefined behavior)内容的有效性,这会导致打印垃圾值。

虽然对于静态初始化,但首选方法是首选方法。但是如果你真的想使用第二种方法,可以使用Mat::clone函数强制单独复制内存,如下所示:

R = Mat(3, 3, CV_64F, R_init).clone();

关于第二个问题:

  

这是c ++类类型的运作方式吗?

函数返回类型可能不一定是void,因为它可能取决于您遵循的设计模式类型。这完全是一个选择问题。