typedef struct elem_ {
float f1;
float f2;
} elem;
elem data[9] = { 0.0f };
CvMat mat = cvMat(3, 3, CV_32FC2, data );
float f1 = CV_MAT_ELEM(mat, elem, row, col).f1;
float f2 = CV_MAT_ELEM(mat, elem, row, col).f2;
CV_MAT_ELEM(mat, elem, row, col).f1 = 1212.0f;
CV_MAT_ELEM(mat, elem, row, col).f2 = 326.0f;
更新:适用于OpenCV2.0
1.选择一种类型来表示元素
Mat(或 CvMat)有 3 个维度:行、列、通道。
我们可以通过指定行和列来访问矩阵中的一个元素(或像素)。
CV_32FC2
表示该元素是 32 位浮点值,具有 2 个通道。
所以上面代码中的 elem 是一种可接受的表示CV_32FC2
.
您可以使用您喜欢的其他表示形式。例如 :
typedef struct elem_ { float val[2]; } elem;
typedef struct elem_ { float x;float y; } elem;
OpenCV2.0添加了一些新的类型来表示矩阵中的元素,例如:
template<typename _Tp, int cn> class CV_EXPORTS Vec // cxcore.hpp (208)
所以我们可以使用Vec<float,2>
代表CV_32FC2
,或使用:
typedef Vec<float, 2> Vec2f; // cxcore.hpp (254)
请参阅源代码以获取更多可以代表您的元素的类型。
这里我们使用Vec2f
2. 访问元素
访问 Mat 类中的元素的最简单有效的方法是 Mat::at。
它有 4 个重载:
template<typename _Tp> _Tp& at(int y, int x); // cxcore.hpp (868)
template<typename _Tp> const _Tp& at(int y, int x) const; // cxcore.hpp (870)
template<typename _Tp> _Tp& at(Point pt); // cxcore.hpp (869)
template<typename _Tp> const _Tp& at(Point pt) const; // cxcore.hpp (871)
// defineded in cxmat.hpp (454-468)
// we can access the element like this :
Mat m( Size(3,3) , CV_32FC2 );
Vec2f& elem = m.at<Vec2f>( row , col ); // or m.at<Vec2f>( Point(col,row) );
elem[0] = 1212.0f;
elem[1] = 326.0f;
float c1 = m.at<Vec2f>( row , col )[0]; // or m.at<Vec2f>( Point(col,row) );
float c2 = m.at<Vec2f>( row , col )[1];
m.at<Vec2f>( row, col )[0] = 1986.0f;
m.at<Vec2f>( row, col )[1] = 326.0f;
3.与旧界面交互
Mat提供了2个转换函数:
// converts header to CvMat; no data is copied // cxcore.hpp (829)
operator CvMat() const; // defined in cxmat.hpp
// converts header to IplImage; no data is copied
operator IplImage() const;
// we can interact a Mat object with old interface :
Mat new_matrix( ... );
CvMat old_matrix = new_matrix; // be careful about its lifetime
CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f;