Open CV通用Mat函数头部

7
在OpenCV中,通常可以通过以下方式访问Mat对象中的像素:
float b = A.at<float>(4,5);

问题在于,如果您事先不知道数据类型,您就会陷入困境。是否有一种编写通用函数头接受具有模板类型T的Mat的方法?我想要构建线性代数计算的函数,而我不想使用if语句分离doublefloat。类似于:

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

这在OpenCV中是否可能?
3个回答

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
这可以通过对函数进行模板化来实现:
template<typename T>
void func(Mat a) { 
    a.at<T>(3,4) = ...

但是请注意,你没有简单的方法将类型T限制为仅double或float,并且你的算法可能无法在其他类型上工作,但这可能不是实际问题。
还要注意使用模板的缺点:使用模板有哪些缺点?

这段代码无法编译 - 你尝试过还是只是猜测的? - nbubis
我并不是在猜测,但我必须承认我没有尝试编译它,抱歉,函数里有一个错别字。 - zakinster
其实我对openCV的Mat类并没有太关注,我以为你的代码中使用的是模板化的Mat类,但实际上只是方法而已,所以错别字是反过来的。最后的修改应该是针对openCV的Mat类进行编译。 - zakinster

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()方法在编译时知道要返回哪种类型。

编辑:使用Mat.type()

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

控制台输出:

16

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接