当前位置:   article > 正文

opencv 二 Mat的基本操作1(Mat初始化、基本属性、数学操作、位运算)_opencv mat初始化

opencv mat初始化

一、 Mat的初始化

Mat的初始化,以下代码实现了mat的四种初始化方法
其中,mat1源自文件读取,mat2为创建一个全0的CV_8UC3图像,mat3为创建一个全0的CV_8UC1图像,mat4 为创建一个固定颜色的图像

  1. string path = "D:\\Img_data\\t1.jpg";
  2. int mode=1;//1表示读取为彩色图,0:灰度图,-1:原始格式(根据图像实际格式确定)
  3. Mat mat1 = imread(path,mode);
  4. Mat mat2 = Mat::zeros(512,512,CV_8UC3);
  5. Mat mat3 =Mat::ones(512,512,CV_8UC1);
  6. Mat mat4 (512,512,CV_8UC3,Scalar(255, 255, 255));//Scalar(255, 255, 255)指定了颜色值,此值为白色

二、Mat的基本属性

Mat的基本属性包含图像的宽、高;数据类型;通道数;是否内存连续。Mat作为一个矩阵,宽对应矩阵的列数,高对应矩阵的行数。

使用imread(filename)即可将图像从文件读取到内存中,通过以下代码即可实现加载图像输出基本属性。

  1. //Mat的基本属性
  2. // 宽、高;数据类型;通道数
  3. cout << "宽(列):" << mat.cols << ",高(行):" << mat.rows << endl;
  4. cout << "数据类型: " << mat.type() << endl;
  5. cout << "通道数: " << mat.channels() << endl;

 代码执行效果:

 可以看到数据类型输出的int,这是因为opencv用枚举来对应具体的数据类型,完整的数据类型对应关系如下图所示:

是否内存连续的关键定义有:连续,内存。连续是指mat中每一个像素存放位置是否连续,因为计算机内存存储是按一维排列的,而mat数据是多维度的(既其shape是多维的),在计算机存储时是以一维空间存放多维数据。 对于内存连续的数据,shape仅是规定了读取规则(例如二维数据,读多少个元素则换行)。

如以下mat(10x10)的图像,在刚读取出来时每一个元素都是连续存储的(在用户视图上其是二维的),当图片经过裁剪操作后所得到的小图(如下图中的阴影区域)行内的元素是连续的,但行与行之间的元素是不连续的(如:换行后指针位置从37到44)。

用户视角下的图片
图片在内存中的实际存储规则

不连续的mat,经过mat.clone()操作后,会返回一个相同大小的连续存储的mat。 

三、 mat的数学操作

mat可以像普通的数值一样进行减加乘除运算,需要注意的是整型的mat与整型mat的数学计算结果仍然是整数。如,进行mat的加法,实则是实现2个图像的叠加,进行mat的减法,实则是实现了目标的滤除。

  1. cv::Mat mat9 = cv::Mat::ones(9, 9, CV_16FC1)*9;
  2. cv::Mat mat2 = cv::Mat::ones(9, 9, CV_16FC1)*2;
  3. cv::Mat result_18 = mat2.mul(mat9);//逐像素值相乘,得到的还是一个矩阵
  4. cv::Mat resutl_7=mat9-mat2;
  5. cv::Mat resutl_11=mat9+mat2;
  6. cv::Mat resutl_4_5=mat9/mat2;

四、 mat的按位运算

mat的位运算包含与或非、异或操作等。如,进行mat按位与运算,可以实现根据值为255的mask的抠图。

按位与:bitwise_and

按位或:bitwise_or

按位异或:bitwise_xor

按位非:bitwise_not

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/886803
推荐阅读
相关标签
  

闽ICP备14008679号