《OpenCV3编程入门》第4章-学习笔记1-图像容器Mat详解

举报
王博Kings 发表于 2020/12/30 00:29:55 2020/12/30
【摘要】 图像容器Mat 一幅图片(数字图像)是一个像素点矩阵 刚开始的OpenCV,一直是C语言,也就是需要手动管理内存,必须release掉,否则会内存泄露 2.0时代以后,引入了C++类概念,广义上可以自动内存管理 Mat类:(1)不必手动开辟空间(2)不必再不需要时立即释放空间 Mat类由两部分数据组成: 矩阵头(矩阵尺寸+存储方法+存储地址)指向存储所有像素值...

图像容器Mat

一幅图片(数字图像)是一个像素点矩阵

刚开始的OpenCV,一直是C语言,也就是需要手动管理内存,必须release掉,否则会内存泄露

2.0时代以后,引入了C++类概念,广义上可以自动内存管理

Mat类:(1)不必手动开辟空间(2)不必再不需要时立即释放空间

Mat类由两部分数据组成:

  1. 矩阵头(矩阵尺寸+存储方法+存储地址)
  2. 指向存储所有像素值得矩阵的指针

为了解决传递图像时需要复制矩阵、降低程序的速度等问题,OpenCV使用了引用计数机制。(共享同一矩阵,有各自信息头)


  
  1. Mat A, C;//仅创建信息头
  2. A = imread("my.jpg", CV_LOAD_IMAGE_COLOR); //开辟矩阵空间
  3. Mat B(A); //拷贝构造函数
  4. C = A; //赋值运算符

如果要对某个区域进行提取。 也只需要创建包含边界信息的信息头


  
  1. Mat D(A, Rect(10,10,100,100)); // 使用矩形边界界定
  2. Mat E = A(Range:all(), Range(1,3));//使用行和列界定

如果确实想复制矩阵本身

Mat F = A.clone();

Mat G;

A.copyTo(G);

像素值存储方法

通常用三个或四个基元素来表示颜色。有时为了表示 透明色,会加入第四个元素alpha(A)

颜色系统分类:

  • RGB, 最常用
  • HSV    HLS  将颜色分为色调、饱和度、亮度/明度
  • YCrCb 在 JPEG图像格式中广泛使用
  • CIE      L*a*b* 是一种感知上均匀的颜色空间,用来度量两个颜色的距离

创建Mat对象的多种方法

预备知识:这里解释下形如CV_8UC3 的意思。
形如:  CV_[位数][带符号与否][类型前缀]C[通道数]
那么 CV_8UC3 表示使用8位的unsigned char类型,每个像素由三个元素组成三通道。


  
  1. /*
  2. 功能:新建Mat类的几种方法
  3. */
  4. #include <opencv2/core/core.hpp>
  5. #include <opencv2/highgui/highgui.hpp>
  6. #include <opencv2/imgproc/imgproc.hpp>
  7. #include <iostream>
  8. using namespace std;
  9. using namespace cv;
  10. int main()
  11. {
  12. //方法1:创建无初始化矩阵
  13. Mat image1;
  14. //方法二:创建4行6列类型为8位单通道矩阵
  15. Mat image2(4, 6, CV_8UC1);
  16. //方法三:创建大小为4×3类型为8位3通道矩阵;为3行4列,每三个数为一组。
  17. Mat image3(Size(4, 3), CV_8UC3);
  18. //方法四:创建一个用1+3j填充的2×4复矩阵;为2行4列,每两个数为一组。
  19. Mat image4(2, 4, CV_32FC2, Scalar(1, 3));
  20. //方法五:创建大小为5×3类型为8位3通道矩阵;为3行5列,每三个数为一组。
  21. Mat image5(Size(5, 3), CV_8UC3, Scalar(1, 2, 3));
  22. //方法六:将image2赋值给image6,共用数据对象
  23. Mat image6(image2);
  24. //方法七:将image2赋值给image6,克隆
  25. Mat image7 = image2.clone();
  26. //方法八:将image2赋值给image6,复制。注意:方法六、七、八、这三种复制的方法写法!!!
  27. Mat image8;
  28. image2.copyTo(image8);
  29. //输出矩阵结果
  30. cout << "image1 = " << endl << image1 << endl << endl;
  31. cout << "image2 = " << endl << image2 << endl << endl;
  32. cout << "image3 = " << endl << image3 << endl << endl;
  33. cout << "image4 = " << endl << image4 << endl << endl;
  34. cout << "image5 = " << endl << image5 << endl << endl;
  35. cout << "image6 = " << endl << image6 << endl << endl;
  36. cout << "image7 = " << endl << image7 << endl << endl;
  37. cout << "image8 = " << endl << image8 << endl << endl;
  38. //方法1:2x4行,3通道,三通道初值设为(1,2,3)
  39. Mat img1(2, 4, CV_8UC3, Scalar(1, 2, 3));
  40. //方法2:创造多维矩阵,指定维数,然后传递指向数组指针,包含每个维度尺寸
  41. //比如创造4维矩阵,每一维分别有2,3,4,5维,这个不能输出
  42. int sz[4] = {2,3,4,5};
  43. Mat img2(4, sz,CV_8UC1 , Scalar::all(0));
  44. //方法3:为已经存在IplImage指针创建信息头
  45. //opencv2.4.9版本
  46. //IplImage* img3 = cvLoadImage("1.jpg", 1);
  47. //Mat mtx(img3);
  48. //opencv3.0.0版本
  49. IplImage* temp = cvLoadImage("1.jpg", 1);
  50. Mat img3 = cv::cvarrToMat(temp);
  51. //方法4:利用Create函数
  52. Mat img4;
  53. img4.create(4, 4, CV_8UC(2));
  54. //方法5:matlab初始化
  55. Mat img5 = Mat::eye(4, 4, CV_64F);
  56. Mat img6 = Mat::ones(3, 3, CV_32F);
  57. Mat img7 = Mat::zeros(2, 2, CV_8UC1);
  58. //方法6:对小矩阵使用逗号分隔式初始化
  59. Mat img8 = (Mat_<double>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
  60. //输出矩阵结果
  61. cout << "img1 = " << endl << img1 << endl << endl;
  62. //cout << "img2 = " << endl << img2 << endl << endl;
  63. cout << "img3 = " << endl << img3 << endl << endl;
  64. cout << "img4 = " << endl << img4 << endl << endl;
  65. cout << "img5 = " << endl << img5 << endl << endl;
  66. cout << "img6 = " << endl << img6 << endl << endl;
  67. cout << "img7 = " << endl << img7 << endl << endl;
  68. cout << "img8 = " << endl << img8 << endl << endl;
  69. system("pause"); //作用:暂停黑窗口,否则窗口一闪而过,看不见信息
  70. return 0;
  71. }

结果如下: 

 

 

 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/83988257

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。