輸入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淆衷,然后分別進(jìn)行轉(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;
}