转:https://blog.csdn.net/u011520181/article/details/83831866

1、创建 Mat 对象:


  1. // 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
  2. cv::Mat mBGRAImg = cv::Mat::zeros(320, 240, CV_8UC4);
  3. // 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
  4. cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1);

对于 type,格式为:CV_位数+数值类型+C通道数,例如:

    CV_8UC1 表示:单通道阵列,8bit 无符号整数

    CV_8UC4 表示:4 通道阵列,8bit 无符号整数

    CV_32FC1 表示:单通道阵列,32bit float 型

2、给 Mat 赋值:

① 从文件中读取图片到 Mat 中:


  1. // 从文件中读取内容到 Mat 中
  2. cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
  3. // 将 RGBA 数据转成灰度数据
  4. cv::Mat gray;
  5. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);

② 将 RGBA 裸数据赋值给 Mat:


  1. // 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
  2. cv::Mat mRGBAImg = cv::Mat::zeros(320, 240, CV_8UC4);
  3. // 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
  4. cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1);
  5. //方法一:直接将数据指针赋值给 mat.data
  6. // 假设已经有了 RGBA 裸数据,如从 OpenGL 中 glReadPixels 读出来的
  7. // 或从 java 层传下来的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL);
  8. uchar * rgba_data = xxx;
  9. mRGBAImg.data = (uchar *) rgba_data;
  10. // 将 RGBA 数据转成灰度数据
  11. cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY);
  12. //方法二:依次给 Mat 每个元素赋值
  13. for (int i = 0; i < height; ++i) {
  14. for (int j = 0; j < width; ++j) {
  15. // RGBA ==> cv::RGBA
  16. mRGBAImg.at<cv::Vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
  17. mRGBAImg.at<cv::Vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
  18. mRGBAImg.at<cv::Vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
  19. mRGBAImg.at<cv::Vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
  20. }
  21. }

3、读取 Mat 中的数据:

① 将 Mat 中的数据输出:


  1. // 如将人脸关键点坐标的 Mat 拼成字符串输出出来
  2. char str[2024];
  3. int offset = 0;
  4. for (int i = 0; i < face_key_pionts.rows; i+=2) {
  5. for (int j = 0; j < face_key_pionts.cols; ++j) {
  6. offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at<float>(i, j), face_key_pionts.at<float>(i + 1, j));
  7. }
  8. }
  9. LOGE("FacePointTest()-->>face_key_pionts = %s\n", str);

② 将 Mat 中的数据保存成文件:


  1. // 从文件中读取图片,并保存为 RGBA 裸数据
  2. cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);
  3. FILE * rgba_file = fopen(rgba_file_path, "wb");
  4. fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
  5. fclose(rgba_file);
  6. // 将 RGBA 数据转成灰度数据并保存成文件
  7. cv::Mat gray;
  8. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
  9. FILE * gray_file = fopen(gray_file_path, "wb");
  10. fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
  11. fclose(gray_file);

③ 图像裸数据 在线查看

http://rawpixels.net

转 OpenCV Mat 数据读写的更多相关文章

  1. opencv MAT数据操作

    1.存取单个像素值 最通常的方法就是 img.at<uchar>(i,j) = 255; img.at<Vec3b>(i,j)[0] = 255; 2.用指针扫描一幅图像 对于 ...

  2. c++读写matlab中.mat数据

    前言:在进行图形图像处理时,经常会用到matlab进行算法的仿真验证,然后再移植到别的语言中.有时会涉及到数据的交互,比如直接读取matlab的.mat类型数据,或者是将c++中的数组存为.mat,为 ...

  3. 快速遍历OpenCV Mat图像数据的多种方法和性能分析 | opencv mat for loop

    本文首发于个人博客https://kezunlin.me/post/61d55ab4/,欢迎阅读! opencv mat for loop Series Part 1: compile opencv ...

  4. OpenCV Mat数据类型及位数总结(转载)

    OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量, ...

  5. 【转】OpenCV Mat数据结构

    转载自xiahouzuoxin原文 OpenCV基础篇之Mat数据结构 程序及分析 /* * FileName : MatObj.cpp * Author : xiahouzuoxin @163.co ...

  6. Qt QImage与OpenCV Mat转换

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...

  7. Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解

    data: uchar类型的指针,指向Mat数据矩阵的首地址.可以理解为标示一个房屋的门牌号: dims: Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处 ...

  8. mat文件读写

    一起来学演化计算-mat文件读写 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matlab读取和保存mat文件数据 在matlab命令行中输入save 变量名a,将a变量保存在新生成的a. ...

  9. 【VS开发】C++ opencv Mat基础

    OpenCV2:Mat 1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...

随机推荐

  1. 打开excel打印时报“不能使用对象链接和嵌入”

    解决思路: 1.以WIN + R 打开命令行, 在命令行中输入dcomcnfg,打开组件服务. 2.在组件服务窗口中,点击到[控制根节点]->[组件服务]->[计算机]->[我的电脑 ...

  2. 为了能早点买房,我用 Python 预测房价走势!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Python高校 PS:如有需要Python学习资料的小伙伴可以加 ...

  3. 用ggplot包画一个简单饼图

    首先用library函数加载ggplot2包 library(ggplot2) library(dplyr) library(tidyr) library(splines) 接下来,进行数据准备: d ...

  4. 你不知道的JS第一卷

    这两天,开始看你不知道的JavaScript,第一卷.

  5. 【XML】XML基本结构以及XML-Schema约束

    XML 简介 1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发.可 ...

  6. JDK10源码分析之HashMap

    HashMap在工作中大量使用,但是具体原理和实现是如何的呢?技术细节是什么?带着很多疑问,我们来看下JDK10源码吧. 1.数据结构 采用Node<K,V>[]数组,其中,Node< ...

  7. 透过systemctl管理mysqld服务

    1. 背景 CentOS 7.x 之前的版本,系统启动时,第一支呼叫的程序是 init ,然后 init 去唤起所有的系统所需要的服务,无论是本地服务还是网络服务.所有的服务启动脚本都放置于 /etc ...

  8. [Go] golang实时监控日志文件的包tail

    在linux中有一个tail命令,tail -f可以实时的监控文件新增加的内容,如果用代码实现这个逻辑,可以下载使用这个包go get github.com/hpcloud/tail/... 测试代码 ...

  9. K60时钟分析

    转载:https://blog.csdn.net/hcx25909/article/details/7164650 1.飞思卡尔K60时钟系统          飞思卡尔K60时钟系统如上图所示,可以 ...

  10. postman---postman参数关联

    我们做接口测试的时候都会遇到一个场景,就是参数关联,所谓的参数关联就是上一个参数的返回值用于下一个参数的请求中,通过python中requests我们知道如何请求,那么通过postman如何请求? 参 ...