0

比如说我在 opencv 中有一个 size(3,1) Mat 具有预先计算的值(不同的元素值),我想通过首先在头文件中使用 #define 宏定义它来在函数中使用它作为常量。因为它将在一个将被多次调用的函数中。我不想为每个调用初始化矩阵。是否可以在#define 宏中将矩阵定义为全局常量?如何 ?

4

1 回答 1

0

只要我知道你不能在多次出现的宏之间共享同一个对象(因为宏是由预处理器解析的,它基本上将宏定义的一段代码复制到宏调用的地方),所以我认为你应该坚持使用函数或静态方法。

您可以使用返回对所述 Mat 对象的引用的静态 Mat 对象(使用您的值初始化)定义函数(或静态方法)。可以通过 lambda 函数进行初始化。请参见以下示例:

const cv::Mat &getCustomConstMat()
{
    static cv::Mat customMat(
                []()
                ->cv::Mat
    {
        cv::Mat myMat(3,3, CV_8UC1);
        myMat.at<uchar>(0,0) = static_cast<uchar>(1);
        // here comes the rest of the initialisation
        return cv::Mat(myMat);
    }()
    );
    return customMat;
}

在这个例子中,静态对象customMat只被初始化一次(在第一次调用函数时getCustomConstMat)。它从 lambda 函数的返回值初始化,该函数创建所需的对象,对其进行初始化并返回。这个 lambda 函数只执行一次 - 在静态customMat对象的初始化期间。

于 2014-09-04T12:25:51.537 回答