关于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的empty(),trim(),strlen()方法
如果empty()函数的参数是非空或非零的值,则empty()返回FALSE.换句话说,"".0."0".NULL.array().var$var:以及没有任何 ...
- Spring--多人开发
在spring中, 可以定义多个配置文件. 例子: ①首先定义一个班级类和一个学生类 1 package com.fuwh.spring; } } ...
- HTML中的SVG
HTML5中的SVG是Scalable Vector Graphic的简称,是一种用来绘制矢量图的HTML5标签,由万维网联盟定制,是一个基于可扩展标记语言,用于绘制二维可缩放矢量图形. 是一种使用X ...
- Tomcat性能优化
1.关闭AJP协议 注释以下配置 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPo ...
- eclispe+axis2+webservice入门
配置eclipse相关插件并启动axis2: http://blog.csdn.net/pilihaotian/article/details/52513697 这里你可能会遇到使用eclipse 启 ...
- 20155324王鸣宇对C语言课程回顾及对Java的展望
# 第二次预备作业 你有什么技能比大多人(超过90%以上)更好? 针对这个技能的获取你有什么成功的经验? 与老师博客中的学习经验有什么共通之处? 我谦虚的说整个2015级五系英雄联盟这个游戏我最厉害( ...
- 基于Lease分布式系统重试服务选举
/** * Copyright (c) 2015, www.cubbery.com. All rights reserved. */ package com.cubbery.event.retry; ...
- mysqldump数据库同步遇到的问题
1.同步数据是遇到 没有 lock database权限,报 " mysqldump: Got error: 1044: Access denied for user 'spider_dat ...
- ubuntu 系统下搭建Java的环境
1.首先可以使用 java -version来查看自己是否已经搭建了java的环境,如果出现了java的版本号则表示java的环境已经搭建好了!否则则继续下面的步骤进行java环境的搭建 2.进入Or ...
- 获取pe文件的文件类型
工程文件petype.cpp通过调用pefile类中的函数获取文件类型. 文件类型的判断通过5个监测点完成. 监测点1:dos头的e_magic 监测点2:nt头的Signature 监测点3:文件头 ...