5

在 OpenCV 中,像这样访问Mat对象中的像素是很常见的:

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

问题是,如果您不知道先验数据的类型,就会陷入困境。有没有办法编写接受Mat带有模板类型的通用函数头T?我想为线性代数计算构建函数,我不想用一个if子句分隔doubleand float。就像是:

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

这在 OpenCV 中可行吗?

4

3 回答 3

3

似乎另一种方法是使用Mat_对象而不是Mat

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

如果要将 a 传递Matfunc,则必须指定类型:

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

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

于 2013-04-12T08:56:44.473 回答
1

这可以通过模板化你的函数来实现:

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

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

还要注意使用模板的缺点:使用模板的缺点是什么?

于 2013-04-12T08:01:44.360 回答
1

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

" 使用 cv::Mat 类的 at 方法有时会很麻烦,因为必须将返回的类型指定为每次调用的模板参数。在矩阵类型已知的情况下,可以使用 cv::Mat_ class 是 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

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

于 2013-04-12T13:32:19.230 回答