解读opencv->tensorrt的数据排列方式

这篇文章主要介绍了解读opencv->tensorrt的数据排列方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

opencv->tensorrt的数据排列

在使用tensorrt的时候,将opencv的Mat格式处理成tensorrt输入方式。

中间还有图像预处理,包括通道的变换、图像尺寸变形,最重要的是如何将Mat格式处理成tensorrt 可接受的输入形式。

opencv的Mat中BGR形式的数据排列是这样的:

b(0,0), g(0,0), r(0,0), b(0,1), g(0,1), r(0,1),......, b(h-1,w-1), g(h-1,w-1), r(h-1,w-1)

tensorrt所需要的数据排列是这样的:

b(0,0), b(0,1),..., b(h-1,w-1), g(0,0), g(0,1)..., g(h-1,w-1), r(0,0),r(0,1), ..., r(h-1,w-1)

可见,需要将Mat的数据通道分离,重新排列,才能为tensorrt所用。

下面摘录两种常见的处理方法。

1.使用split函数分离通道

std::vector prepareImage(std::vector &vec_img) { std::vector result(BATCH_SIZE * IMAGE_WIDTH * IMAGE_HEIGHT * INPUT_CHANNEL); float *data = result.data(); int index = 0; for (const cv::Mat &src_img : vec_img) { if (!src_img.data) continue; float ratio = float(IMAGE_WIDTH) / float(src_img.cols)  split_img = { cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1, data + channelLength * (index + 2)),     // Mat与result数据区域共享 cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1, data + channelLength * (index + 1)), cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1, data + channelLength * index) }; index += 3; cv::split(flt_img, split_img);		// 通道分离 } return result;	// result与split_img的数据共享 } 

2.手撕通道,暴力直接

std::vector prepareImage(std::vector &vec_img) { std::vector result(BATCH_SIZE * INPUT_CHANNEL * IMAGE_HEIGHT * IMAGE_WIDTH); float* data = result.data(); int index = 0; int offset = IMAGE_WIDTH * IMAGE_HEIGHT; // 数据预处理 for(const auto &img:vec_img){ float ratio = IMAGE_WIDTH/float(img.cols) 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持0133技术站。

以上就是解读opencv->tensorrt的数据排列方式的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » python