作者:昌山小屋
来源:CSDN
原文:https://blog.csdn.net/ChuiGeDaQiQiu/article/details/84945901
版权声明:本文为博主原创文章,转载请附上博文链接!
参考为毛我要干这件事,把一张jpg图片转成bgr(注意顺序是bgr)二进制文件?最近在弄华为Hi3519AV100开发板上的一些深度学习的样例程序,没想到它的输入文件不是普通的jpg,而是bgr格式的二进制文件,所以不是我闲得蛋疼。还别说,这样确实是大大节省了空间。我一张3.8M的测试文件(test.jpg),转成二进制后为276K。
以上是引用的博文。
补充一点,海思提供windows Ruyi studio,仿真测试时,可以用jpg bmp等图片类型,但是需要转换成raw数据,速度特别慢,如果提前手动转换好,再拿去仿真测试,直接读入raw数据,速度就快很多。
代码也是参考了博文的代码,根据自己的习惯和环境,做了一点修改,虽然是小的修改,但万一谁刚好需要就拿去用省的自己修改了。
- c改成c/++
- IplImage *改为Mat;
- widthstep
- 补充一点验证结果
- visual studio平台编译
代码如下,vs中创建项目,增加源文件cvt2bgr.cpp,配置好opencv头文件和路径,编译、运行。
结果验证:
- dog_bike_car.jpg, 768x576,代码中resize成300x300,生成dog_bike_car_300x300.bgr,大小263kb,和海思sample中提供大小一样也是263kb.
- horse_dog_car_person.jpg, 500x375, resize成224x224,生成horse_dog_car_person_224x224.bgr,大小147kb,和海思sample中提供大小一样也是147kb.
- 将转换好的.bgr,和海思sample提供的bgr,测试结果一样,说明转换正确,大胆拿去用。
#include <unistd.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
typedef unsigned char U_CHAR;
int main()
{
const char *filename = "dog_bike_car.bmp";
const char *outname = "dog_bike_car.bgr";
int flag = 1;
cv::Mat img = cv::imread(filename);
if (!img.data)
{
printf("read image error\n");
return -1;
}
//缩放
resize(img, img, Size(300, 300)); //224x224
//imshow("img",img);
//waitKey(0);
U_CHAR *data = (U_CHAR*)img.data;
int step = img.step;
printf("Step: %d, height: %d, width: %d\n",
step, img.rows, img.cols);
FILE *fp = fopen(outname, "wb");
int h = img.rows;
int w = img.cols;
int c = img.channels();
for (int k = 0; k<c; k++) {
for (int i = 0; i<h; i++) {
for (int j = 0; j<w; j++) {
fwrite(&data[i*step + j*c + k], sizeof(U_CHAR), 1, fp);
}
}
}
fclose(fp);
return 0;
}