在 OpenCV 中,像这样访问Mat
对象中的像素是很常见的:
float b = A.at<float>(4,5);
问题是,如果您不知道先验数据的类型,就会陷入困境。有没有办法编写接受Mat
带有模板类型的通用函数头T
?我想为线性代数计算构建函数,我不想用一个if
子句分隔double
and float
。就像是:
void func(Mat <T> a) {
a.at<T>(3,4) = ...
这在 OpenCV 中可行吗?
似乎另一种方法是使用Mat_
对象而不是Mat
:
template<typename T>
void func(Mat_ <T> a) {
cout << a(0,0) << endl;
}
如果要将 a 传递Mat
给func
,则必须指定类型:
Mat a;
func(Mat_<float>(a));
如果您使用与原始类型不同的Mat
类型,OpenCV 将为您执行转换。
这可以通过模板化你的函数来实现:
template<typename T>
void func(Mat a) {
a.at<T>(3,4) = ...
但请注意,您没有简单的方法将类型 T 限制为仅 double 或 float,并且您的算法可能不适用于其他类型,但这可能不是实际问题。
还要注意使用模板的缺点:使用模板的缺点是什么?
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 通道数组等。