在不知道类型 opencv 的情况下访问矩阵值
Acces Matrix value without knowing the type opencv
我正在编写一个函数,我需要在其中访问 Mat
的一个元素,但是这个函数可以接收 Mat
不同类型的元素。所以,如果我有:
filtered.at<TypeofMat>(i) = (typeofmat) somevalue;
我只想到做这样的事情filtered.at<myMat.type()>(i)
,但显然这行不通,因为type
returns a int
我卡住了,有人能给点提示吗?
如果可能的话,让接收openCV Mat的函数成为模板函数:
void f<typename T>(const Mat& m)
{
(void) m.at<T>(0, 0);
}
这样使用:
Mat m1/* ... */;
m1.at<int>(0, 0) = 0;
f<int>(m);
您可以将源矩阵转换为双精度矩阵(类型CV_64F
)。这样你就不会因为转换而丢失任何数据。然后你可以像往常一样处理这个矩阵,因为你知道它的类型。最后一步是将目标图像转换回源类型。
不过,您需要知道矩阵的通道数。 CV_assert
将确保您使用的是正确的类型。
#include <opencv2/opencv.hpp>
using namespace cv;
void foo(const Mat& src, Mat& dst)
{
// Assert number of channels
CV_Assert(src.channels() == 3);
// Convert to CV64F
Mat3d _src, _dst;
src.convertTo(_src, CV_64F);
_dst.create(_src.size());
// Work on _src and _dst (you know the type)
_dst(0,0) = _src(0,0) + Vec3d(1,2,3);
// Convert _dst to src type
_dst.convertTo(dst, src.type());
}
int main()
{
Mat3b img(10,10,Vec3b(0,0,0));
Mat res;
foo(img, res);
// res will be CV_8UC3
return 0;
}
这种方法还有其他替代方法:
- 创建模板函数并调用适当的专业化。参见 here
- 研究原始指针。参见 here
- 仅使用能够正确处理每种类型的 OpenCV 函数。参见 here。如果可用,这通常是最佳选择。
我正在编写一个函数,我需要在其中访问 Mat
的一个元素,但是这个函数可以接收 Mat
不同类型的元素。所以,如果我有:
filtered.at<TypeofMat>(i) = (typeofmat) somevalue;
我只想到做这样的事情filtered.at<myMat.type()>(i)
,但显然这行不通,因为type
returns a int
我卡住了,有人能给点提示吗?
如果可能的话,让接收openCV Mat的函数成为模板函数:
void f<typename T>(const Mat& m)
{
(void) m.at<T>(0, 0);
}
这样使用:
Mat m1/* ... */;
m1.at<int>(0, 0) = 0;
f<int>(m);
您可以将源矩阵转换为双精度矩阵(类型CV_64F
)。这样你就不会因为转换而丢失任何数据。然后你可以像往常一样处理这个矩阵,因为你知道它的类型。最后一步是将目标图像转换回源类型。
不过,您需要知道矩阵的通道数。 CV_assert
将确保您使用的是正确的类型。
#include <opencv2/opencv.hpp>
using namespace cv;
void foo(const Mat& src, Mat& dst)
{
// Assert number of channels
CV_Assert(src.channels() == 3);
// Convert to CV64F
Mat3d _src, _dst;
src.convertTo(_src, CV_64F);
_dst.create(_src.size());
// Work on _src and _dst (you know the type)
_dst(0,0) = _src(0,0) + Vec3d(1,2,3);
// Convert _dst to src type
_dst.convertTo(dst, src.type());
}
int main()
{
Mat3b img(10,10,Vec3b(0,0,0));
Mat res;
foo(img, res);
// res will be CV_8UC3
return 0;
}
这种方法还有其他替代方法:
- 创建模板函数并调用适当的专业化。参见 here
- 研究原始指针。参见 here
- 仅使用能够正确处理每种类型的 OpenCV 函数。参见 here。如果可用,这通常是最佳选择。