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;

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>