MNN C++输入图片多通道
前言
mnn正常的输入为 (1,3,h,w),由于我的网络输入需要把多帧叠加到一起,例如叠加6帧到channel上,则输入应为(1,3*6,h,w)。mnn提供的数据预处理无法处理这种数据。
解决方法
话不多说,直接上代码
std::queue<cv::Mat> cloneimgs(imgs); // 6帧数据
auto t_start_pre1 = std::chrono::high_resolution_clock::now();
MNN::Tensor givenTensor(inTensor_, MNN::Tensor::CAFFE); // 设定我们自己的输入张量
auto inputData = givenTensor.host<float>(); // 指针
for (int i=0;i<input_frame_;i++)
{
cv::Mat preImage = cloneimgs.front();
cloneimgs.pop();
cv::resize(preImage,preImage,cv::Size(input_w_,input_h_));
preImage.convertTo(preImage, CV_32FC3, 1 / 255.0); // 数据预处理 img = img*scale + shift
std::vector<cv::Mat> bgrChannels(3);
cv::split(preImage, bgrChannels); // 分通道
for (int j = 0; j < bgrChannels.size(); j++)
{
//HWC->CHW,注意opencv读取图片顺序为bgr,我网络输入也是bgr,所以通道顺序没变
// 如果需要rgb,改变j,从2到0即可
std::vector<float> data = std::vector<float>(bgrChannels[j].reshape(1, preImage.cols * preImage.rows));
memcpy(inputData + i*input_w_*input_h_*3+j*input_w_*input_h_,&data[0],sizeof(float)*data.size());
}
}
inTensor_->copyFromHostTensor(&givenTensor); // 把数据给到inTensor_
auto t_end_pre1 = std::chrono::high_resolution_clock::now();
float total_pre1 = std::chrono::duration<float, std::milli>(t_end_pre1 - t_start_pre1).count();
std::cout << "process data: " << total_pre1 << " ms." << std::endl;