转 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是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...
 
随机推荐
- frigate_TUNNEL
			
#coding=utf-8 Result=open('result.txt',"w") FileTunnel = open('tunnel.txt').readlines() Ne ...
 - JVM 参数配置
			
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m ...
 - iOS----------提交被拒
			
Hello, Thank you for resubmitting your app for review. Guideline 2.5.1 - Performance - Software Requ ...
 - Github使用总结(添加ssh-key,新建仓库,添加协作者) 转
			
http://jingyan.baidu.com/article/ab0b5630936ab6c15afa7d1c.html https://help.github.com/articles/gene ...
 - MySQL中日期和时间类型
			
1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...
 - weblogic新增域并进行Jconsole监听
			
一.创建域: 第一步,打开域配置界面: [bofm@UAT02-BIZ-ZJCG-AP-002 bin]$ cd /home/software/weblogic/Oracle/Middleware/w ...
 - mysql 之优化
			
# ### part1 : sql语句优化 # (1) mysql 执行流程 客户端: 发送链接请求,然后发送sql语句 服务端: 1.连接层: 提供和客户端链接的服务 show processlis ...
 - mysql综合性练习
			
题目描述 设定有一个数据库,里面有4张表: 学生表(student) 课程表(course) 成绩表(score) 教师信息表(teacher) 表结构如下: 表一_学生表(student) 属性名 ...
 - SQL Server阻塞的检查
			
1. 阻塞 除了内存.CPU.I/O这些系统资源以外,阻塞和死锁是影响数据库应用性能的另一大因素. 所谓的「阻塞」,是指当一个数据库会话中的事务,正在锁定其他会话事务想要读取或修改的资源,造成这些 ...
 - Python散列类型和运算符
			
集合定义 集合的交 并 差 常见的运算符的用法 字典的定义 字典的 get items keys pop popitem update 方法 三种逻辑运算 集合 集合特性 唯一性:不存在两 ...