opencv armnn_tf 對接

輸入armnn的圖像以數(shù)組的形式存儲,但是如果工程中涉及到圖像相關(guān)的內(nèi)容,一般會配合opencv使用,所以需要做到opencv中Mat數(shù)據(jù)類型和armnn需要的數(shù)組類型之間能夠相互轉(zhuǎn)換

Mat數(shù)據(jù)結(jié)構(gòu)詳解
參考自https://blog.csdn.net/yang_xian521/article/details/7107786

armnn中數(shù)據(jù)輸入輸出形式為一維的數(shù)組,維度順序為NHWC

找到博客 https://blog.csdn.net/guyuealian/article/details/80253066
完美解決問題

vector<_Tp> convertMat2Vector(const cv::Mat &mat)
{
    return (vector<_Tp>)(mat.reshape(1, 1)); //通道數(shù)不變,按行轉(zhuǎn)為一行
}

template <typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v, int channels, int rows)
{
    cv::Mat mat = cv::Mat(v);                           //將vector變成單列的mat
    cv::Mat dest = mat.reshape(channels, rows).clone(); //PS:必須clone()一份,否則返回出錯
    return dest;
}

主要思想是用一維的圖像作為中間媒介,mat2vector 先將圖像resize成單通道單行,經(jīng)過處理Mat.data 在內(nèi)存上連續(xù),可以直接用來構(gòu)造vector;vector2mat用vector構(gòu)造mat,然后resize成需要的通道數(shù)和size

唯一存在的問題就是我們神經(jīng)網(wǎng)絡(luò)的輸出圖像可能通道數(shù)不為1(灰度圖像),3(GRB)或者4(GRBA),而cv::resize 中assert了通道數(shù)必須為這三種,所以如果通道數(shù)不為上述三種情況的話,目前想到的辦法就是先對輸出vector做一個單通道的提取,保存多個vector,然后分別進行轉(zhuǎn)換。

vector<vector<_Tp> > split_channels(vector<_Tp> vec, int channels){
    vector<vector<_Tp> > result;
    int HxW = vec.size() / channels;
    for(int i = 0; i < channels; i++){
        vector<_Tp> tmp(HxW, 0);
        for(int j = 0; j < HxW; j++){
            int index = j * channels + i;
            tmp[j] = vec[index];
        }
        result.push_back(tmp);
    }
    return result;
}  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容