#define宏在opencv中定义一个常量Mat

时间:2012-11-17 00:19:14

标签: c++ image-processing opencv

Les说我在opencv中有一个大小(3,1)Mat,带有预先计算的值(不同的元素值),我想在函数中使用它作为常量,首先使用头中的#define宏定义它文件。因为它将在一个将要被多次调用的函数中。我不想为每次调用初始化矩阵。是否可以在#define宏中将矩阵定义为全局作为常量?怎么样?

1 个答案:

答案 0 :(得分: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对象初始化期间。