OpenCV Image Mat для 1D CHW (RR … R, GG..G, BB..B) вектор

CuDNN Nvidia для глубокого обучения имеет довольно интересный формат для изображений, который называется CHW. У меня есть резюме :: Mat img; что я хочу преобразовать в одномерный вектор с плавающей точкой. Проблема, с которой я столкнулся, заключается в том, что формат 1D вектора для CHW (RR … R, GG..G, BB..B).

Поэтому мне интересно, как я могу извлечь значения каналов для каждого пикселя и упорядочить их для этого формата.

2

Решение

Вы можете либо перебрать изображение вручную и скопировать значения в нужное место, либо использовать что-то вроде cv::extractChannel скопировать каналы по одному так:

#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;
}
1

Другие решения

Других решений пока нет …