OpenCV Mat Imagem para 1D ACS (RR ... R, GG..G, BB..B) vector

votos
2

cuDNN da Nvidia para a aprendizagem profunda tem um formato bastante interessante para imagens chamado ACS. Eu tenho um cv :: Mat img; que eu quero converter em um vetor unidimensional de carros alegóricos. O problema que estou tendo é que o formato do vetor 1D para CHW é (RR ... R, GG..G, BB..B).

Então, eu estou curioso para saber como eu posso extrair os valores de canal para cada pixel e encomendá-los para este formato.

Publicado 21/05/2017 em 06:31
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você pode iterar sobre a imagem e copiar manualmente os valores no lugar certo, ou você pode usar algo como cv::extractChannelcopiar os canais um por um assim:

#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;
}
Respondeu 21/05/2017 em 07:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more