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