关于QImage提取单色通道方法(vector)
转载请标明处:
作者:微微苏荷
近日,用QT和mxnet结合做一个图像识别的demo。遇到需要把图片从QImage转为vector单色分离的格式的要求,用来识别时输入。
经实践,找到3种方法,分享给大家:
需要注意的是,QImage的存储顺序是 BGRA(opencv也是这样反着的),不是正常口述RGBA.
另:mx_float == float
一.
int image_size = width * height * channels; //图像的宽/高/通道数(除去了A通道)
std::vector<mx_float> image_data = std::vector<mx_float>(image_size);
mx_float* ptr_image_r = image_data.data();
const uchar* pData= image.constBits(); // 获取图像原始数据 mx_float* ptr_image_g = image_data.data() + image_size / 3;
mx_float* ptr_image_b = image_data.data() + image_size / 3 * 2;
for (int i = 0; i < height; i++){
int lineNum_32 = i * width * 4;
for (int k = 0; k < width; k++){
if(1 < IMAGE_CHANNELS){
// 乘以4的原因是QImage是四个通道存储的,BGRA,所以每个像素都占有4个字节。
*ptr_image_r++ = static_cast<mx_float> (pData[lineNum_32 + k * 4 + 2]) ;
*ptr_image_g++ = static_cast<mx_float> (pData[lineNum_32 + k * 4 + 1]);
}
*ptr_image_b++ = static_cast<mx_float> (pData[lineNum_32 + k * 4 ]) ;
}
}
二.利用image.scanLine(),获取每行扫描线的首地址
int image_size = width * height * channels; //图像的宽/高/通道数(除去了A通道)
std::vector<mx_float> image_data = std::vector<mx_float>(image_size);
mx_float* ptr_image_r = image_data.data();
const uchar* pData= image.constBits(); // 获取图像原始数据 mx_float* ptr_image_g = image_data.data() + image_size / 3;
mx_float* ptr_image_b = image_data.data() + image_size / 3 * 2;
for (int i = 0; i < height; i++){
uchar *imageScanLine = image.scanLine(i);
for (int k = 0; k < width; k++){
if(1 < IMAGE_CHANNELS){
// 乘以4的原因是QImage是四个通道存储的,BGRA,所以每个像素都占有4个字节。
*ptr_image_r++ = static_cast<mx_float>(\
imageScanLine[k * 4 + 2]) ;
*ptr_image_g++ = static_cast<mx_float>(\
imageScanLine[k * 4 + 1]) ; }
*ptr_image_b++ = static_cast<mx_float>(\
imageScanLine[k * 4]) ;
}
}
三.最可靠最简洁的方法.但是可能性能比上两个稍微差些(没有评估),因为他每个像素都要从QImage获取一次,不确定会不会比一次获取完和一次获取一行有性能之差,但个人感觉不会,因为QImage也是在内存中,不存在文件IO。但是他很简单,不需要考虑图片的位深和存储顺序/大端小端等问题。
int image_size = width * height * channels; //图像的宽/高/通道数(除去了A通道)
std::vector<mx_float> image_data = std::vector<mx_float>(image_size);
mx_float* ptr_image_r = image_data.data();
const uchar* pData= image.constBits(); // 获取图像原始数据 mx_float* ptr_image_g = image_data.data() + image_size / 3;
mx_float* ptr_image_b = image_data.data() + image_size / 3 * 2;
for (int i = 0; i < height; i++){
uchar *imageScanLine = image.scanLine(i);
for (int k = 0; k < width; k++){
// 没有做兼容单通道
QRgb bits = image.pixel(i, k);
*ptr_image_r++ = static_cast<mx_float>(qRed(bits)) ;
*ptr_image_g++ = static_cast<mx_float>(qGreen(bits));
*ptr_image_b++ = static_cast<mx_float>(qBlue(bits)) ;
}
}
关于QImage提取单色通道方法(vector)的更多相关文章
- C++ pair方法/vector方法
一,pair方法 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一 ...
- Linux下从视频提取音频的方法
Linux下可以利用mencoder将视频里的音频提取出来.方法如下: 1.首先安装mencoder.对于Ubuntu来说,软件仓库里就有mencoder,可直接输入如下命令安装 sudo apt-g ...
- 返回数据中提取数据的方法(JSON数据取其中某一个值的方法)
返回数据中提取数据的方法 比如下面的案例是,取店铺名称 接口返回数据如下: {"Code":0,"Msg":"ok","Data& ...
- JavaScript中,提取子字符串方法:Slice、Substring、Substr的比较。
在JavaScript中,提取子字符串主要是通过 Slice.Substring.Substr 三个方法之一. // slice // 语法: string.slice(beginSlice [, e ...
- ImagXpress中如何修改Alpha通道方法汇总
ImagXpress支持处理Alpha通道信息来管理图像的透明度,Alpha通道支持PNG ,TARGA和TIFF文件,同时还支持BMP和ICO文件.如果说保存的图像样式不支持Alpha通道,就将会丢 ...
- 【json提取器】- 提取数据的方法
json 提取器的使用 方法 json 提取器 提取的结果 我用调试取样器进行查看
- PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法
方法一:依据ASCII码转换,GB2312库对多音字也无能为力. GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换.如:中国前总理朱镕基的"镕"字. GB2312中 ...
- 【Windows】免费图片提取文字的方法
今天意外的看到一个可以提取图片中文字的网站,自己试了下,提取效果还不错 网址为: https://zhcn.109876543210.com/ 现在有图片如下 我想从中提取的文字 1.打开网址,上传图 ...
- LeetCode的一道题引申的python实现的对字符串进行分词,提取词频的方法
在LeetCode上刷一道题,题目如下: 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度. 示例?1: 输入: "abcabcbb"输出 ...
随机推荐
- PHP的final关键字、static关键字、const关键字
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
- C#操作XML的通用方法总结
转载至http://www.cnblogs.com/pengze0902/p/5947997.html 1.创建xml 复制代码 /// <summary> /// 创建XML文档 /// ...
- U盘存放大于4G数据文件且无须格式化U盘的解决方法
现在优盘的容量越来越大了,价格越来越便宜,可是它也有个缺点,因为它默认的文件系统是"FAT32",这种文件系统最大只能保存4G的文件,超过4G的文件就不能保存在优盘上了,这样就不能 ...
- http执行过程分析
执行过程: 1.用户在浏览器(客户端)里输入或者点击一个网址链接: 2.浏览器通过网址域名查找ip地址.DNS查找方式是通过浏览器缓存(会记录DNS记录)→系统缓存→TCP/IP参数中设置的首选DNS ...
- 使用GRUB 添加新的启动项 (menu entry)
GRUB版本: Grub2 基础知识: 相关的文件和目录结构: A./etc/grub.d/ 上图中有一个40_custom的脚本: 可以通过修改40_custom脚本来加入自定义的启动项. B./e ...
- linux 系统、命令、软件
软件名称:Putty 使用方法:http://jingyan.baidu.com/article/e73e26c0eb063324adb6a737.html 需要资料: 服务IP:228.5624.5 ...
- Java EE 经验
环境配置 GlassFish Error 1 Exception while loading the app : CDI deployment failure:Error loading class ...
- .net MVC中异常日志
在日常工作中,我们有些项目可能进入了维护期,但是项目可能存在一些潜伏较深的bug导致我们在测试阶段并未发现,那么错误日志记录为我们的项目维护起着重要的作用.记录系统日志的方法如下 1.在系统根目录建立 ...
- CSS布局 ——从display,position, float属性谈起
页面布局,或者是在页面上做些小效果的时候经常会用到 display,position和float 属性,如果对它们不是很了解的话,很容易出现一些莫名其妙的效果,痛定思痛读了<CSS Master ...
- sql server2008根据经纬度计算两点之间的距离
--通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...