转 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是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...
随机推荐
- 123: The filename, directory name, or volume label syntax is incorrect今天玩nginx的时候报错
今天在win下玩nginx的时候 提示500错误 看了下nginx的logs 提示 123: The filename, directory name, or volume label syntax ...
- oracle学习笔记(十五) PL/SQL语法结构以及使用
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...
- 点击事件的坐标计算(client || offset) +(X || Width || Left) 各种排列组合别绕晕
结论: 1,X,Y的都是属于点击位置的,width.height.left.top都是属于DOM的. 2,涉及的所有位置只与document或DOM内部有关,与DOM如何定位,周围有没有其他占位HTM ...
- tornado中传递参数的几种方式
方法一 :tornado路由可以使用正则表达式中的子表达式传递url参数.比如:(r"/member//(\w*)/([01]*)", MemberHandler)匹配以后,tor ...
- 用redis和cookie做单用户登录
因为公司的项目需要用到单用户登录,于是今天用redis和cookie给系统添加了单用户登录功能,再次简单记录一下. 单用户登录是为了防止同一账户在不同电脑和不同浏览器里面同时登录.所以我这边的思路是: ...
- NSURLSession的知识小记
1.NSURLSession的使用流程 使用NSRULSession对象创建Task, 然后执行Task 2.获取NSURLSession ()获得共享的Session + (NSURLSession ...
- Windows Cluster失败后,AlwaysOn在残存Server节点上快速恢复DB的详细步骤
AlwaysOn是一种集合了高可用和灾难恢复两种功能的技术,它支持一个或多个数据库整体的发生故障转移,它实现了一定程度上的负载均衡,减轻了主服务器的压力,是目前最好的一种选择.那么当极端情况发生时,集 ...
- MongoDB 副本集丢失数据的测试
在MongoDB副本集的测试中发现了一个丢数据的案例. 1. 概要描述 测试场景为:一主一从一验证 测试案例 step1 :关闭从副本: step 2 :向主副本中插入那条数据: step 3 :关闭 ...
- [Linux] SSH隧道本地端口转发访问远程服务中的数据库
当我的本地没有安装任何数据库服务的时候,可以直接通过我本地的端口访问远程机器上的数据库服务,实现这样的效果就可以使用本地转发功能 实际测试本地端口转发,把本地的9006端口转发给远程服务器的115.1 ...
- Linux:挂载磁盘分区
查看挂载的分区 df 命令主要用来了解系统中已经挂载的各个文件系统的磁盘使用情况. 常用选项: "-h" ,显示更易读的容量单位: "-T" ,显示文件系统的类 ...