第一步:
设定类型和norm_val归一化值:
const float mean_vals[3] = { 0.f, 0.f, 0.f };
const float norm_vals[3] = { 1 / 255.f, 1 / 255.f, 1 / 255.f };
第二步:
归一化,第一行是做hwc ->chw的转换并创造 ncnn::Mat类型,第二行是转换类型和归一化
ncnn::Mat in = ncnn::Mat::from_pixels(bgr2_resize.data, ncnn::Mat::PIXEL_BGR, bgr2_resize.cols, bgr2_resize.rows);
in.substract_mean_normalize(mean_vals, norm_vals);
第三步:
推理
// 推理
ncnn::Extractor ex = m_Net_lipid->create_extractor();
ex.set_light_mode(false);//是否轻量化
ex.set_num_threads(8);//推理的核数
第四步
输出
// 将输出转换为 cv::Mat
float* out_data = (float*)out.data;
cv::Mat o_roi(400, 400, CV_32FC1, out_data);
其他总结
假如我们处理一个语义分割,直接就可以调用output类型的方法
cv::Mat argmax_mat(1280, 1280, CV_8UC1);
// 遍历每个像素位置,找到在第0维度(通道)上的最大值索引
for (int y = 0; y < 1280; ++y) {
for (int x = 0; x < 1280; ++x) {
float max_val = std::numeric_limits<float>::lowest();
int max_index = 0;
for (int c = 0; c < 4; ++c) {
float val = out.channel(c).row(y)[x];
if (val > max_val) {
max_val = val;
max_index = c;
}
}
argmax_mat.at<uchar>(y, x) = static_cast<uchar>(max_index);
}
}