赞
踩
Mat的初始化,以下代码实现了mat的四种初始化方法。
其中,mat1源自文件读取,mat2为创建一个全0的CV_8UC3图像,mat3为创建一个全0的CV_8UC1图像,mat4 为创建一个固定颜色的图像
- string path = "D:\\Img_data\\t1.jpg";
- int mode=1;//1表示读取为彩色图,0:灰度图,-1:原始格式(根据图像实际格式确定)
- Mat mat1 = imread(path,mode);
-
- Mat mat2 = Mat::zeros(512,512,CV_8UC3);
-
- Mat mat3 =Mat::ones(512,512,CV_8UC1);
-
- Mat mat4 (512,512,CV_8UC3,Scalar(255, 255, 255));//Scalar(255, 255, 255)指定了颜色值,此值为白色
Mat的基本属性包含图像的宽、高;数据类型;通道数;是否内存连续。Mat作为一个矩阵,宽对应矩阵的列数,高对应矩阵的行数。
使用imread(filename)即可将图像从文件读取到内存中,通过以下代码即可实现加载图像输出基本属性。
-
- //Mat的基本属性
- // 宽、高;数据类型;通道数
- cout << "宽(列):" << mat.cols << ",高(行):" << mat.rows << endl;
- cout << "数据类型: " << mat.type() << endl;
- cout << "通道数: " << mat.channels() << endl;
代码执行效果:
可以看到数据类型输出的int,这是因为opencv用枚举来对应具体的数据类型,完整的数据类型对应关系如下图所示:
是否内存连续的关键定义有:连续,内存。连续是指mat中每一个像素存放位置是否连续,因为计算机内存存储是按一维排列的,而mat数据是多维度的(既其shape是多维的),在计算机存储时是以一维空间存放多维数据。 对于内存连续的数据,shape仅是规定了读取规则(例如二维数据,读多少个元素则换行)。
如以下mat(10x10)的图像,在刚读取出来时每一个元素都是连续存储的(在用户视图上其是二维的),当图片经过裁剪操作后所得到的小图(如下图中的阴影区域)行内的元素是连续的,但行与行之间的元素是不连续的(如:换行后指针位置从37到44)。
不连续的mat,经过mat.clone()操作后,会返回一个相同大小的连续存储的mat。
mat可以像普通的数值一样进行减加乘除运算,需要注意的是整型的mat与整型mat的数学计算结果仍然是整数。如,进行mat的加法,实则是实现2个图像的叠加,进行mat的减法,实则是实现了目标的滤除。
- cv::Mat mat9 = cv::Mat::ones(9, 9, CV_16FC1)*9;
- cv::Mat mat2 = cv::Mat::ones(9, 9, CV_16FC1)*2;
- cv::Mat result_18 = mat2.mul(mat9);//逐像素值相乘,得到的还是一个矩阵
- cv::Mat resutl_7=mat9-mat2;
- cv::Mat resutl_11=mat9+mat2;
- cv::Mat resutl_4_5=mat9/mat2;
mat的位运算包含与或非、异或操作等。如,进行mat按位与运算,可以实现根据值为255的mask的抠图。
按位与:bitwise_and
按位或:bitwise_or
按位异或:bitwise_xor
按位非:bitwise_not
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。