《opencv实用探索·三》opencv Mat与数组互转

1、利用Mat来存储数据,避免使用数组等操作

//创建一个两行一列的矩阵
 cv::Mat mean = (cv::Mat_<float>(2, 1) << 0.77, 0.33);

 std::cout() << mean << std::endl;
 float a = mean.at<float>(0, 0);   //0.77
 float b = mean.at<float>(1, 0);   //0.33

2、数组传递给Mat

unsigned char buf[2][3]; //创建一个两行三列的数组
cv::Mat img(2, 3, CV_8UC1, (unsigned char*)buf);  //将数组转为一个两行三列的Mat类型

3、将Mat中的数据传递给数组

//如果Mat中的数据是连续的,传递到一维vector可以这样写
std::vector<uchar> array_(mat.rows * mat.cols);
if (mat.isContinuous())
    array_ = mat.data();
//传递到一维数组可以这样写
unsigned char* arr = new unsigned char[mat.rows * mat.cols];
if (mat.isContinuous())
    arr = mat.data();

在这里插入图片描述
在这里插入图片描述

C<number_of_channels>----代表通道数,C3表示3通道,没加默认位单通道
CV_8U-无符号8位整数(0-255)
CV_8S-有符号8位整数(-128-127)
CV_16U-无符号16位整数(0-65535)
CV_16S-有符号16位整数(-32768-32767)
CV_32S-有符号32位整数(-2147483648-2147483647)
CV_32F-有符号32位浮点数
CV_64F-有符号64位浮点数

注意:
单通道灰度图转三通道时,RGB三个通道像素值相等,效果看起来和单通道灰度图一样,唯一区别在于三通道灰度图上面绘制多边形可以设置颜色。

其他的一些补充:
(1)

Vec3f v3f(1.0, 3.0, 6.0); //三维向量,三通道float相当于含有三个float的数组

(2)
在这里插入图片描述

float matrix[3][3] = {
    4717.0, 0, 3926.09, 0, 4716.051, 2910.57, 0, 0, 1 };
cv::Mat z3 = cv::Mat(3, 3, CV_32FC3, matrix); //CV_32FC3不加C3默认为单通道,这里是三个通道,每个通道占32位
Z3 = [4717.0, 0, 3926.09, 0, 4716.051, 2910.57, 0, 0, 1;
杂数,杂数,杂数,杂数,杂数,杂数,杂数,杂数,杂数;
杂数,杂数,杂数,杂数,杂数,杂数,杂数,杂数,杂数
]

Vec3f v3f = mat.at<Vec3f>(0, 1); //获取第一行第二列像素(0, 4716.051, 2910.57)
cout << v3f << endl;; //(0, 4716.051, 2910.57)
//Vec3b是一个三通道类型,每个通道为一个uchar  
Vec3b v3b(100, 110, 200); //B = 100, G = 110, R = 200

在这里插入图片描述

//创建Mat对象,保存一张彩色图像(有3个通道),假设已知图像的数据类型是uchar注意(2, 3)对应(y, x)
Mat image = imread("d:/test/apple.jpg", 1); 

//为图像(y,x)位置的像素点B通道重新赋值 image.at<Vec3b>(2,3)[1]=200;//为图像(y,x)位置的像素点G通道重新赋值 image.at<Vec3b>(2,3)[2]=199;//为图像(y,x)位置的像素点R通道重新赋值遍历RGB图像读出像素值:(rows为行,cols为列,(rows, cols)->(y, x))
image.at<Vec3b>(2,3)[0]=255;

在这里插入图片描述

cv::Mat z3 = cv::Mat::zeros(3, 4, CV_8UC3); //零矩阵 cout<<z1<<endl; 3行4列,CV_8UC3无符号8位3通道

在这里插入图片描述
[(B,G,R), (B,G,R), (B,G,R), (B,G,R);
(B,G,R), (B,G,R), (B,G,R), (B,G,R);
(B,G,R), (B,G,R), (B,G,R), (B,G,R);
]

一个RGB32的像素,总共占32位,R,G,B分别占8位,还有一个空8位不用,可以用Vec3b获取RGB32像素值
一个ARGB32的像素,总共占32位,R,G,B,A分别占8位,可以用Vec4b获取ARGB32像素值

相关推荐

  1. Qt图像处理-OpenCv中MatQImage

    2023-12-08 04:30:02       56 阅读
  2. python使用pandas实现dictexcel文件

    2023-12-08 04:30:02       47 阅读
  3. DateLocalDate

    2023-12-08 04:30:02       57 阅读
  4. python字节串和数字

    2023-12-08 04:30:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 04:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 04:30:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 04:30:02       82 阅读
  4. Python语言-面向对象

    2023-12-08 04:30:02       91 阅读

热门阅读

  1. 服务器如何修改密码

    2023-12-08 04:30:02       55 阅读
  2. 《路由与交换技术》读书笔记

    2023-12-08 04:30:02       55 阅读
  3. 通过Python Flask快速构建应用程序

    2023-12-08 04:30:02       51 阅读
  4. 删除容器挂载卷打包容器镜像并传到阿里云

    2023-12-08 04:30:02       52 阅读
  5. What is John Deere diagnostic software called?

    2023-12-08 04:30:02       48 阅读
  6. Uni-App知识点

    2023-12-08 04:30:02       57 阅读
  7. STL-空间配置器

    2023-12-08 04:30:02       54 阅读
  8. react(2) - react-redux的基本使用

    2023-12-08 04:30:02       58 阅读