在OpenCV中,访问Mat
对象中的像素是很常见的,如下所示:
float b = A.at<float>(4,5);
问题是,如果你不知道apriori的数据类型,你就会陷入困境。有没有办法编写接受Mat
模板类型为T
的通用函数标头?我想构建线性代数计算的函数,我不希望if
子句分开double
和float
。类似的东西:
void func(Mat <T> a) {
a.at<T>(3,4) = ...
这在OpenCV中是否可行?
答案 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通道数组等。