using namespace cv;
Mat MatBGRImage = imread("wokspace/my_src.jpg");
auto t0 = iLogger::timestamp_now_float();
Mat RGBImg, ResizeImg;
cvtColor(MatBGRImage, RGBImg, COLOR_BGR2RGB);
cv::resize(RGBImg, ResizeImg, Size(224, 224));
// mean_rgb = [0.485, 0.456, 0.406]
// std_rgb = [0.229, 0.224, 0.225]
int channels = ResizeImg.channels(), height = ResizeImg.rows, width = ResizeImg.cols;
float* nchwMat = (float*)malloc(channels * height * width * sizeof(float));
memset(nchwMat, 0, channels * height * width * sizeof(float));
// Convert HWC to CHW and Normalize
float mean_rgb[3] = {0.485, 0.456, 0.406};
float std_rgb[3] = {0.229, 0.224, 0.225};
uint8_t* ptMat = ResizeImg.ptr<uint8_t>(0);
int area = height * width;
for (int c = 0; c < channels; ++c)
{
for (int h = 0; h < height; ++h)
{
for (int w = 0; w < width; ++w)
{
int srcIdx = c * area + h * width + w;
int divider = srcIdx / 3; // 0, 1, 2
for (int i = 0; i < 3; ++i)
{
nchwMat[divider + i * area] = static_cast<float>((ptMat[srcIdx] * 1.0f/255.0f - mean_rgb[i]) * 1.0f/std_rgb[i] );
}
}
}
}
// 复制到GPU
size_t Src_size = 3 * 224 * 224 * sizeof(float);
for (int i = 0; i < explicit_batch; ++i)
{
cudaMemcpy(static_cast<float*>(input_tensor_image->pValue + i * Src_size),
nchwMat, Src_size, cudaMemcpyHostToDevice);
}
free(nchwMat);
auto t1 = iLogger::timestamp_now_float();
auto ms0 = t1 - t0;
printf("preprocess time: %.3f ms\n", ms0);
C++实现图像的通道变换
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 在项目中,可能一些输入的图像要求是RGB的图像格式,但是手边只有单通道的黑白相机进行采图,这时就需要将8位的...
- 查看图片[TOC] 双通道概述 指设备连接着WiFi的情况下,同时打开蜂窝通道,从而实现双通道同时进行网络请求,提...
- 1、实验概述 设计、实现图片网络爬虫,从网站上批量下载图片;并对图片进行图像处理。 2、实验环境 语言 网络爬虫:...