欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀opencv->tensorrt的數(shù)據(jù)排列方式

 更新時(shí)間:2023年02月02日 10:21:26   作者:永力  
這篇文章主要介紹了解讀opencv->tensorrt的數(shù)據(jù)排列方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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é)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)獲取aws route53域名信息的方法

    python實(shí)現(xiàn)獲取aws route53域名信息的方法

    最近由于工作原因接觸到aws的服務(wù),我需要實(shí)時(shí)獲取所有的域名信息,用于對(duì)其進(jìn)行掃描,因此寫了一個(gè)自動(dòng)化爬取腳本 給需要的人分享,對(duì)python獲取aws route53域名信息相關(guān)知識(shí)感興趣的朋友一起看看吧
    2023-12-12
  • django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法

    django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法

    今天小編就為大家分享一篇django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 破解安裝Pycharm的方法

    破解安裝Pycharm的方法

    今天小編就為大家分享一篇關(guān)于破解安裝Pycharm的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Python實(shí)現(xiàn)自定義異常實(shí)例

    Python實(shí)現(xiàn)自定義異常實(shí)例

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)自定義異常實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • python中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方案

    python中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方案

    本文呢給大家總結(jié)以下幾種方案實(shí)現(xiàn)定時(shí)任務(wù),可根據(jù)不同需求去使用不同方案,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以參考下
    2023-10-10
  • python如何將txt坐標(biāo)批量打印到原圖上

    python如何將txt坐標(biāo)批量打印到原圖上

    這篇文章主要介紹了python如何將txt坐標(biāo)批量打印到原圖上的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python求兩個(gè)文本文件以行為單位的交集、并集與差集的方法

    Python求兩個(gè)文本文件以行為單位的交集、并集與差集的方法

    這篇文章主要介紹了Python求兩個(gè)文本文件以行為單位的交集、并集與差集的方法,涉及Python文本文件與集合運(yùn)算的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Python中操作文件之write()方法的使用教程

    Python中操作文件之write()方法的使用教程

    這篇文章主要介紹了Python中操作文件之write()方法的使用教程,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • python繪制字符畫視頻的示例代碼

    python繪制字符畫視頻的示例代碼

    網(wǎng)上有很多的字符畫,看起來很炫酷,本文就通過一則示例實(shí)現(xiàn)字符畫視頻,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Python創(chuàng)建臨時(shí)文件和文件夾

    Python創(chuàng)建臨時(shí)文件和文件夾

    這篇文章主要介紹了Python如何創(chuàng)建臨時(shí)文件和文件夾,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論