转 OpenCV Mat 数据读写
转:https://blog.csdn.net/u011520181/article/details/83831866
1、创建 Mat 对象:
-
// 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
-
cv::Mat mBGRAImg = cv::Mat::zeros(320, 240, CV_8UC4);
-
-
// 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
-
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 中:
-
// 从文件中读取内容到 Mat 中
-
cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
-
-
// 将 RGBA 数据转成灰度数据
-
cv::Mat gray;
-
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
② 将 RGBA 裸数据赋值给 Mat:
-
// 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
-
cv::Mat mRGBAImg = cv::Mat::zeros(320, 240, CV_8UC4);
-
-
// 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
-
cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1);
-
-
-
//方法一:直接将数据指针赋值给 mat.data
-
// 假设已经有了 RGBA 裸数据,如从 OpenGL 中 glReadPixels 读出来的
-
// 或从 java 层传下来的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL);
-
uchar * rgba_data = xxx;
-
mRGBAImg.data = (uchar *) rgba_data;
-
-
// 将 RGBA 数据转成灰度数据
-
cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY);
-
-
-
-
//方法二:依次给 Mat 每个元素赋值
-
for (int i = 0; i < height; ++i) {
-
for (int j = 0; j < width; ++j) {
-
// RGBA ==> cv::RGBA
-
mRGBAImg.at<cv::Vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
-
mRGBAImg.at<cv::Vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
-
mRGBAImg.at<cv::Vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
-
mRGBAImg.at<cv::Vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
-
}
-
}
3、读取 Mat 中的数据:
① 将 Mat 中的数据输出:
-
// 如将人脸关键点坐标的 Mat 拼成字符串输出出来
-
char str[2024];
-
int offset = 0;
-
-
for (int i = 0; i < face_key_pionts.rows; i+=2) {
-
for (int j = 0; j < face_key_pionts.cols; ++j) {
-
offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at<float>(i, j), face_key_pionts.at<float>(i + 1, j));
-
}
-
}
-
-
LOGE("FacePointTest()-->>face_key_pionts = %s\n", str);
② 将 Mat 中的数据保存成文件:
-
// 从文件中读取图片,并保存为 RGBA 裸数据
-
cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);
-
-
FILE * rgba_file = fopen(rgba_file_path, "wb");
-
fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
-
fclose(rgba_file);
-
-
-
// 将 RGBA 数据转成灰度数据并保存成文件
-
cv::Mat gray;
-
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
-
FILE * gray_file = fopen(gray_file_path, "wb");
-
fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
-
fclose(gray_file);
③ 图像裸数据 在线查看
转 OpenCV Mat 数据读写的更多相关文章
- opencv MAT数据操作
1.存取单个像素值 最通常的方法就是 img.at<uchar>(i,j) = 255; img.at<Vec3b>(i,j)[0] = 255; 2.用指针扫描一幅图像 对于 ...
- c++读写matlab中.mat数据
前言:在进行图形图像处理时,经常会用到matlab进行算法的仿真验证,然后再移植到别的语言中.有时会涉及到数据的交互,比如直接读取matlab的.mat类型数据,或者是将c++中的数组存为.mat,为 ...
- 快速遍历OpenCV Mat图像数据的多种方法和性能分析 | opencv mat for loop
本文首发于个人博客https://kezunlin.me/post/61d55ab4/,欢迎阅读! opencv mat for loop Series Part 1: compile opencv ...
- OpenCV Mat数据类型及位数总结(转载)
OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量, ...
- 【转】OpenCV Mat数据结构
转载自xiahouzuoxin原文 OpenCV基础篇之Mat数据结构 程序及分析 /* * FileName : MatObj.cpp * Author : xiahouzuoxin @163.co ...
- Qt QImage与OpenCV Mat转换
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...
- Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解
data: uchar类型的指针,指向Mat数据矩阵的首地址.可以理解为标示一个房屋的门牌号: dims: Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处 ...
- mat文件读写
一起来学演化计算-mat文件读写 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matlab读取和保存mat文件数据 在matlab命令行中输入save 变量名a,将a变量保存在新生成的a. ...
- 【VS开发】C++ opencv Mat基础
OpenCV2:Mat 1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...
随机推荐
- flex布局开发
flex布局开发 布局原理 flex时flexible Box的缩写,意为"弹性布局",用来为盒子模型提供最大的灵活性,任何一个容器都可以定位flex布局 [注意] 当我们为父盒子 ...
- 「SAP技术」SAP MM 事务代码ME17的用法
SAP MM 事务代码ME17的用法 1,如下采购信息记录需要被归档: PIR号码,5300007816 2, ME12打上删除标记, 3, 事务代码ME17做归档 3.1 创建archive ...
- 2019年上半年收集到的AI计算机视觉方向干货文章
2019年上半年收集到的AI计算机视觉方向干货文章 时光飞逝,一晃上半年快要结束了.对人工智能高度感兴趣的笔者,每天都要看不少人工智能方面的文章,很多是干货文章,受益匪浅,所以整理成这个系列的文章. ...
- python的列表元素输出
1)for循环输出 这种方法是大家最容易想到的,也是最简单的,但是它有一个弊端:它的输出是竖向排列的,而我们往往需要水平输出. >>> for i in [1,2,3]: print ...
- Spring,SpringMvc,MyBatis用到的设计模式
1.MyBatis: 首先看MyBatis执行流程: (1)首先,SqlSessionFactoryBuilder 去读取 mybatis 的配置文件,然后 build 一个 DefaultSqlSe ...
- ubuntu 查看软件包中的内容 (已经安装)
在 使用 apt 进行安装软件的时候,我们要经常判断,软件安装了什么和安装到什么地方.这时候 我们要使用 dpkg -L 命令来进行查看: 同样 在 fedora 上可以使用 rpm -ql iper ...
- Houdini设置
关闭网络编辑器动画 Animate network changes 平移时保持视口枢轴 Maintain Viewport Pivot when Panning 通知帮助提示将出现在Houdini的状 ...
- (四)Amazon Lightsail 部署LAMP应用程序之扩展PHP前端
扩展PHP前端 既然PHP前端和数据库是分开的,您将为Web层添加可伸缩性和容错性: 在以下步骤,您将获取Web前端实例的快照,并从该快照部署另外2个Web层实例.最终,您将在三个Web实例前面添加一 ...
- 浅谈js的类数组对象arguments
类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...
- ACM-ICPC 2018 南京网络赛
题目顺序:A C E G I J L A. An Olympian Math Problem 打表,找规律,发现答案为n-1 C. GDY 题意: m张卡片,标号1-13: n个玩家,标号1-n:每个 ...