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)矢量
因此,我很好奇我如何爲每個像素提取通道值併爲這種格式排序。
Nvidia的深度學習cuDNN有一個相當有趣的圖像稱爲CHW。我有一個cv :: Mat img;我想要轉換爲浮點的一維矢量。我遇到的問題是CHW的一維向量的格式是(RR ... R,GG..G,BB..B)。OpenCV Image Mat到1D CHW(RR ... R,GG..G,BB..B)矢量
因此,我很好奇我如何爲每個像素提取通道值併爲這種格式排序。
您可以手動遍歷圖像和值複製到正確的地方,或者你可以通過一個使用類似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;
}
和將單個通道複製到單個內存空間應該可行嗎?但可能有一個更簡單的方法 – Micka