打开CV通用Mat函数头

时间:2013-04-12 07:55:09

标签: c++ templates opencv

在OpenCV中,访问Mat对象中的像素是很常见的,如下所示:

float b = A.at<float>(4,5);

问题是,如果你不知道apriori的数据类型,你就会陷入困境。有没有办法编写接受Mat模板类型为T的通用函数标头?我想构建线性代数计算的函数,我不希望if子句分开doublefloat。类似的东西:

 void func(Mat <T> a) { 
     a.at<T>(3,4) = ...

这在OpenCV中是否可行?

3 个答案:

答案 0 :(得分:3)

这样做的另一种方法是使用Mat_对象而不是Mat

template<typename T>
void func(Mat_ <T> a) {
   cout << a(0,0) << endl;
}

如果您想将Mat传递给func,则必须指定类型:

Mat a;
func(Mat_<float>(a)); 

如果您使用的是与原始Mat类型不同的类型,OpenCV将为您执行转换。

答案 1 :(得分:1)

这可以通过模板化你的功能来实现:

template<typename T>
void func(Mat a) { 
    a.at<T>(3,4) = ...

但请注意,您没有简单的方法将类型T约束为double或float,并且您的算法可能不适用于其他类型,但它可能不是实际问题。

另请注意使用模板的缺点:What are the disadvantages of using templates?

答案 2 :(得分:1)

OpenCV 2 Cookbook第40页声称这是不可能的。另外,关于Mat _:

“使用cv :: Mat类的at方法有时会很麻烦  因为必须将返回的类型指定为模板参数  每次通话。在已知矩阵类型的情况下,可以  使用cv :: Mat_类,它是cv :: Mat。

的模板子类
cv::Mat_<uchar> im2= image; // im2 refers to image 
im2(50,100)= 0; //access to row 50 and column 100 

由于cv :: Mat_的类型  创建变量时声明元素,operator()  method在编译时知道要返回哪种类型。“

编辑:使用Mat.type()

Mat image=imread("image.bmp");
cout<<image.type();

控制台输出:

16

Wiki:该方法返回矩阵元素类型,一个与CvMat类型系统兼容的id,如CV_16SC3或16位带符号的3通道数组等。