转载请标明处:

  作者:微微苏荷

  本文地址:关于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)的更多相关文章

  1. C++ pair方法/vector方法

    一,pair方法 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一 ...

  2. Linux下从视频提取音频的方法

    Linux下可以利用mencoder将视频里的音频提取出来.方法如下: 1.首先安装mencoder.对于Ubuntu来说,软件仓库里就有mencoder,可直接输入如下命令安装 sudo apt-g ...

  3. 返回数据中提取数据的方法(JSON数据取其中某一个值的方法)

    返回数据中提取数据的方法 比如下面的案例是,取店铺名称 接口返回数据如下: {"Code":0,"Msg":"ok","Data& ...

  4. JavaScript中,提取子字符串方法:Slice、Substring、Substr的比较。

    在JavaScript中,提取子字符串主要是通过 Slice.Substring.Substr 三个方法之一. // slice // 语法: string.slice(beginSlice [, e ...

  5. ImagXpress中如何修改Alpha通道方法汇总

    ImagXpress支持处理Alpha通道信息来管理图像的透明度,Alpha通道支持PNG ,TARGA和TIFF文件,同时还支持BMP和ICO文件.如果说保存的图像样式不支持Alpha通道,就将会丢 ...

  6. 【json提取器】- 提取数据的方法

    json 提取器的使用 方法 json 提取器  提取的结果   我用调试取样器进行查看

  7. PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法

    方法一:依据ASCII码转换,GB2312库对多音字也无能为力. GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换.如:中国前总理朱镕基的"镕"字. GB2312中 ...

  8. 【Windows】免费图片提取文字的方法

    今天意外的看到一个可以提取图片中文字的网站,自己试了下,提取效果还不错 网址为: https://zhcn.109876543210.com/ 现在有图片如下 我想从中提取的文字 1.打开网址,上传图 ...

  9. LeetCode的一道题引申的python实现的对字符串进行分词,提取词频的方法

    在LeetCode上刷一道题,题目如下: 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度. 示例?1: 输入: "abcabcbb"输出 ...

随机推荐

  1. R 培训之 Table

    res = read.table("ttest_expression.tsv",sep=",",header = TRUE)rownames(res)=res[ ...

  2. easyui rowStyler属性

    1.项目中示例 { idField : 'id', // 只要创建数据表格 就必须要加 ifField title : title, fit : true, url : top.baseUrl+ 'c ...

  3. thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印

    今天分享一下thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印.博主是新手,在这里卡住了很久(>_<) thinkphp 3.2.3整合ueditor 1.4 下载 ...

  4. opencv_判断两张图片是否相同

    QQ:231469242 pip install opencv 如果找不到版本,去非官方下载opencv第三方包http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下 ...

  5. Spring MVC学习笔记——SiteMesh的使用(转)

    转自 SiteMesh的使用 SiteMesh的介绍就不多说了,主要是用来统一页面风格,减少重复编码的. 它定义了一个过滤器,然后把页面都加上统一的头部和底部. 需要先在WEB-INF/lib下引入s ...

  6. photoshop常见抠图方法

    1.多边形套索:这种工具是用于抠图的边界比较平直,但颜色比较复杂类的图像,它也是最笨最无奈的方法,只能是利用鼠标一点一点去点击抠选.2.磁性套索工具:分为三种:套索,多边形,磁性.这类工具一般只用于边 ...

  7. 【01-06】JPA 全局单一主键

    建一张主键表 @Override public boolean equals(Object o) { return (o == this || (o instanceof AbstractEntity ...

  8. thinkphp一句话疑难解决笔记 3

    错误调试, E($msg)? 这个是tp内置的E 方法, E 函数. 它是tp抛异常 的另外一种方式. 默认的异常处理方式是, 在 框架下的 ThinkPHP/Tpl/think_exception. ...

  9. Git Stash紧急处理问题,需要切分支

    在开发过程中,大家都遇到过bug,并且有些bug是需要紧急修复的. 当开发人员遇到这样的问题时,首先想到的是我新切一个分支,把它修复了,再合并到master上. 当时问题来了,你当前正在开发的分支上面 ...

  10. eclipse导入myeclipse的web项目没法识别问题解决

    (转载)原作者地址:http://www.cnblogs.com/Topless/archive/2011/11/23/2260085.html 1.进入项目目录,找到.project文件,打开. 2 ...