1 cvMat简介
图像在计算机中是以数组的形式存放的,Mat是OpenCV中用于存放图像的数据结构。通过调用相关方法,我们能够实现对图像的输入输出以及一些操作。同时,Mat又不止可以作为图像容器,它也可以作为一种比较纯粹的描述矩阵这种数学对象的结构。它比C中的IplImage好的地方在于,由于它的“计数器”机制,我们不需要对它进行手动的内存回收,从而避免了常常困扰C/C++程序员的“内存泄露”问题。
tips:
(1)关于CvMat的通道数的理解:
可以理解为CvMat的一个矩阵值中包含几个数据,单通道即表示矩阵中的一个值中只有一个数据;
当用CvMat保存彩色图像数据时,可以理解为3通道矩阵,即矩阵中一个值包含R、G、B三个数据
(2)当CvMat的数据类型为CV_8UC1时,对于数据的访问,需选择CvMat.data.ptr指针
不同的数据类型,访问元素时指针的选择不同。
2 矩阵CvMat的两种声明和初始化方法
(1)直接给CvMat赋值,逐点赋值
CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 );
cvZero( mat );
cvmSet( mat, 0, 0, 1 );
cvmSet( mat, 0, 1, 2 );
cvmSet( mat, 1, 0, 3 );
cvmSet( mat, 2, 2, 4 );
cvReleaseMat( &mat );
(2)利用现有数组,对CvMat赋值
double a[12] = { 1, 2,3, 4,
5, 6, 7, 8,
9,10, 11, 12 };
CvMat mat = cvMat( 3, 4, CV_64FC1, a );
(3)IplImage到cvMat的转换
方式一、cvGetMat方式:
CvMat mathdr, *mat = cvGetMat( img, &mathdr );
方式二、cvConvert方式:
CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
cvConvert( img, mat );
// #define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 )
(4)cvArr(IplImage或者cvMat)转化为cvMat
方式一、cvGetMat方式:
int coi = 0;
cvMat *mat = (CvMat*)arr;
if( !CV_IS_MAT(mat) )
{
mat = cvGetMat( mat, &matstub, &coi );
if (coi != 0) reutn; // CV_ERROR_FROM_CODE(CV_BadCOI);
}
写成函数为:
// This is just an example of function
// to support both IplImage and cvMat as an input
CVAPI( void ) cvIamArr( const CvArr* arr )
{
CV_FUNCNAME( "cvIamArr" );
__BEGIN__;
CV_ASSERT( mat == NULL );
CvMat matstub, *mat = (CvMat*)arr;
int coi = 0;
if( !CV_IS_MAT(mat) )
{
CV_CALL( mat = cvGetMat( mat,&matstub, &coi ) );
if (coi != 0)CV_ERROR_FROM_CODE(CV_BadCOI);
}
// Process as cvMat
__END__;
}
(5)图像直接操作
方式一:直接数组操作 int col, row,z;
uchar b, g, r;
for( y = 0; row < img->height; y++ )
{
for ( col = 0; col < img->width; col++ )
{
b = img->imageData[img->widthStep * row + col *3]
g = img->imageData[img->widthStep * row + col *3 + 1];
r = img->imageData[img->widthStep * row + col *3 + 2];
}
}
方式二:宏操作:
int row, col;
uchar b, g, r;
for( row = 0; row < img->height; row++ )
{
for ( col = 0; col < img->width; col++ )
{
b = CV_IMAGE_ELEM( img, uchar, row, col * 3 );
g = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 1 );
r = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 2 );
}
}
下面是运用cvMat的代码
- #include <iostream>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/core/core.hpp>
- //#include <opencv/cv.hpp> <