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

标签 c++ opencv

这是我的代码,用于定义一个类并输入一些 double ,以便成员函数可以给出一个 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 中,我需要计算一个定义为私有(private)变量的Mat 对象R。但是,当我使用 fun 中的第一句来执行此操作时,fun()printfun() 中的 cout 都给出了正确的矩阵.如果我使用灰色的方法,fun() 中的 cout 打印正确,但 printfun() 中的 cout > 给出了错误的矩阵 R。

这有点奇怪,因为当 fun() 返回时,第二种方法计算的矩阵 R 似乎发生了某种变化。如果这个方法没有在类类型中使用,它会正确运行并给出正确的矩阵 R。

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

我是 C++ 的新手,所以任何帮助将不胜感激。

最佳答案

您所观察到的行为有一个简单的解释。

it seems when the fun() returns, matrix R computed by the second method changes somehow

您的观察是正确的。以下是第一个和第二个赋值之间的区别:

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

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

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

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

对于第二个问题:

Is this the way the c++ class type functions?

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

关于c++ - 无法在 C++ 类中分配 cv::Mat 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511057/

相关文章:

python - Python 中的 OpenCV - 在没有抗锯齿的情况下调整大小

c++ - 在继承类 C++ 中重载 >>

c++ - 为什么VS2015 MFC中同样的内存泄漏,内存分配数一直在变化?

c++ - 无法在opencv中读取视频

android - 在 OpenCV 中跟踪连续帧中的特征

c++ - VS 2010 打开相机但只显示灰色窗口

c++ - 点云三角剖分算法

c++ - DEC 到 BIN 使用 for 和

c++ - 如何让 g++ 列出所有 #included 文件的路径

opencv - 应该采取哪些步骤来确保在 PC 上运行的 OpenCV 代码将在特定的嵌入式设备上运行?