2017-05-21 49 views
2

Nvidia的深度學習cuDNN有一個相當有趣的圖像稱爲CHW。我有一個cv :: Mat img;我想要轉換爲浮點的一維矢量。我遇到的問題是CHW的一維向量的格式是(RR ... R,GG..G,BB..B)。OpenCV Image Mat到1D CHW(RR ... R,GG..G,BB..B)矢量

因此,我很好奇我如何爲每個像素提取通道值併爲這種格式排序。

+0

和將單個通道複製到單個內存空間應該可行嗎?但可能有一個更簡單的方法 – Micka

回答

1

您可以手動遍歷圖像和值複製到正確的地方,或者你可以通過一個使用類似cv::extractChannel一個複製的渠道,像這樣:使用CV ::分裂

#include <opencv2/opencv.hpp> 

int main() 
{ 
    //create dummy 3 channel float image 
    cv::Mat sourceRGB(cv::Size(100,100),CV_32FC3); 
    auto size = sourceRGB.size(); 
    for (int y = 0; y < size.height; ++y) 
    { 
     for (int x = 0; x < size.width; ++x) 
     { 
      float* pxl = sourceRGB.ptr<float>(x, y); 
      *pxl = x/100.0f; 
      *(pxl+1) = y/100.0f; 
      *(pxl + 2) = (y/100.0f) * (x/100.0f); 
     } 
    } 

    cv::imshow("test", sourceRGB); 
    cv::waitKey(0); 

    //create single image with all 3 channels one after the other 
    cv::Size newsize(size.width,size.height*3); 
    cv::Mat destination(newsize,CV_32FC1); 

    //copy the channels from the source image to the destination 
    for (int i = 0; i < sourceRGB.channels(); ++i) 
    { 
     cv::extractChannel(
      sourceRGB, 
      cv::Mat(
       size.height, 
       size.width, 
       CV_32FC1, 
       &(destination.at<float>(size.height*size.width*i))), 
      i); 
    } 

    cv::imshow("test", destination); 
    cv::waitKey(0); 
    return 0; 
}