網(wǎng)站首頁 編程語言 正文
opencv->tensorrt的數(shù)據(jù)排列
在使用tensorrt的時(shí)候,將opencv的Mat格式處理成tensorrt輸入方式。
中間還有圖像預(yù)處理,包括通道的變換、圖像尺寸變形,最重要的是如何將Mat格式處理成tensorrt 可接受的輸入形式。
opencv的Mat中BGR形式的數(shù)據(jù)排列是這樣的:
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所需要的數(shù)據(jù)排列是這樣的:
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的數(shù)據(jù)通道分離,重新排列,才能為tensorrt所用。
下面摘錄兩種常見的處理方法。
1.使用split函數(shù)分離通道
std::vector<float> prepareImage(std::vector<cv::Mat> &vec_img) {
std::vector<float> 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) < float(IMAGE_HEIGHT) / float(src_img.rows) ? float(IMAGE_WIDTH) / float(src_img.cols) : float(IMAGE_HEIGHT) / float(src_img.rows);
cv::Mat flt_img = cv::Mat::zeros(cv::Size(IMAGE_WIDTH, IMAGE_HEIGHT), CV_8UC3);
cv::Mat rsz_img;
cv::resize(src_img, rsz_img, cv::Size(), ratio, ratio);
rsz_img.copyTo(flt_img(cv::Rect(0, 0, rsz_img.cols, rsz_img.rows)));
flt_img.convertTo(flt_img, CV_32FC3, 1.0 / 255);
//HWC TO CHW
int channelLength = IMAGE_WIDTH * IMAGE_HEIGHT;
std::vector<cv::Mat> split_img = {
cv::Mat(IMAGE_HEIGHT, IMAGE_WIDTH, CV_32FC1, data + channelLength * (index + 2)), // Mat與result數(shù)據(jù)區(qū)域共享
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的數(shù)據(jù)共享
}
2.手撕通道,暴力直接
std::vector<float> prepareImage(std::vector<cv::Mat> &vec_img) {
std::vector<float> result(BATCH_SIZE * INPUT_CHANNEL * IMAGE_HEIGHT * IMAGE_WIDTH);
float* data = result.data();
int index = 0;
int offset = IMAGE_WIDTH * IMAGE_HEIGHT;
// 數(shù)據(jù)預(yù)處理
for(const auto &img:vec_img){
float ratio = IMAGE_WIDTH/float(img.cols) < IMAGE_HEIGHT/float(img.rows) ? IMAGE_WIDTH/float(img.cols) : IMAGE_HEIGHT/float(img.rows);
cv::Mat rsz_img;
cv::resize(img, rsz_img, cv::Size(), ratio, ratio, 0);
cv::Mat flt_img(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC3, cv::Scalar(128, 128, 128));
rsz_img.copyTo(flt_img(cv::Rect(0, 0, rsz_img.cols, rsz_img.rows)));
// 手撕三通道,填入data
int i = 0;
for (int row = 0; row < IMAGE_HEIGHT; ++row) {
uchar* uc_pixel = flt_img.data + row * flt_img.step;
for (int col = 0; col < IMAGE_WIDTH; ++col) {
data[index * 3 * IMAGE_HEIGHT * IMAGE_WIDTH + i] = (float)uc_pixel[2]/255.;
data[index * 3 * IMAGE_HEIGHT * IMAGE_WIDTH + i + IMAGE_HEIGHT * IMAGE_WIDTH] = (float)uc_pixel[1]/255.;
data[index * 3 * IMAGE_HEIGHT * IMAGE_WIDTH+ i + 2 * IMAGE_HEIGHT * IMAGE_WIDTH] = (float)uc_pixel[0]/255.;
uc_pixel += 3;
++i;
}
}
index++;
}
return result;
}
總結(jié)
原文鏈接:https://blog.csdn.net/sinat_38685124/article/details/121372821
相關(guān)推薦
- 2022-10-31 Linux系統(tǒng)docker部署.net?core3.1的詳細(xì)步驟_docker
- 2022-09-15 C/C++?左移<<,?右移>>的作用及說明_C 語言
- 2022-04-09 MFC模擬實(shí)現(xiàn)自定義消息發(fā)送_C 語言
- 2022-09-15 Android?Jetpack庫剖析之ViewModel組件篇_Android
- 2022-09-15 一文搞懂C++中繼承的概念與使用_C 語言
- 2023-04-14 jupyter-lab設(shè)置自啟動(dòng)及遠(yuǎn)程連接開發(fā)環(huán)境_python
- 2023-02-02 C語言求素?cái)?shù)的幾種方式總結(jié)_C 語言
- 2022-07-18 Android 解決InputMethodManager 內(nèi)存泄露問題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支