remapeamento de imagem opencv cv::remap() (imagem para cima e para baixo, espelhamento esquerdo e direito)


conceito

O que é remapeamento?
Este é o processo de pegar pixels de um local em uma imagem e posicioná-los em outro local em uma nova imagem.
Para completar o processo de mapeamento, pode ser necessária alguma interpolação de posições de pixels não inteiros, uma vez que nem sempre há uma correspondência de um para um pixel entre as imagens de origem e destino.
Podemos expressar o remapeamento ( x , y ) para cada localização de pixel como:
insira a descrição da imagem aqui
onde g() é a imagem mapeada, f() é a imagem de origem e h(x, y) é a função de mapeamento aplicada a (x, y ).

A função opencv suporta cv::remap()

1. Protótipo de função:

CV_EXPORTS_W void remap( InputArray src, OutputArray dst,
                         InputArray map1, InputArray map2,
                         int interpolation, int borderMode = BORDER_CONSTANT,
                         const Scalar& borderValue = Scalar());

2. Descrição do parâmetro

src: imagem de origem.
dst: imagem de destino. Tem o mesmo tamanho que map1 e o mesmo tipo que src.
map1: O valor da coordenada de x quando map1 é armazenado, existem tipos CV_16SC2,
CV_32FC1 ou CV_32FC2
CV_32FC1 ou CV_32FC2. Para obter mais informações sobre conversões de ponto flutuante, consulte ConvertMaps
Representation to Fixed Point Speed.
map2: map2 armazena o valor da coordenada de y, que é do tipo CV_16SC2,
CV_32FC1 ou CV_32FC2
interpolation: interpolation method (consulte #InterpolationFlags). O método #INTER_AREA
não é suportado por esta função.
borderMode: método de extrapolação de pixel (veja #BorderTypes) quando
borderMode: modo de manipulação de borda
borderValue: valor usado para bordas. O valor padrão é 0.

Código de teste:

   cv::Mat src;
    src = cv::imread("D:\\QtProject\\Opencv_Example\\remap\\remap.png", cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
    
    
        cout << "matTemplate Cannot load image" << endl;
        return;
    }
    cv::imshow("src", src);

    cv::Mat dstUpDown(src.size(), src.type());
    cv::Mat map_x(src.size(), CV_32FC1);
    cv::Mat map_y(src.size(), CV_32FC1);

    //上下镜像
    for( int i = 0; i < map_x.rows; i++ )
     {
    
    
         for( int j = 0; j < map_x.cols; j++ )
         {
    
    
            map_x.at<float>(i, j) = (float)j;
            map_y.at<float>(i, j) = (float)(map_x.rows - i);
         }
     }

    cv::remap( src, dstUpDown, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
    cv::imshow("dstUpDown", dstUpDown);

    //左右镜像
    for( int i = 0; i < map_x.rows; i++ )
     {
    
    
         for( int j = 0; j < map_x.cols; j++ )
         {
    
    
            map_x.at<float>(i, j) = (float)(map_x.cols - j);
            map_y.at<float>(i, j) = (float)i;
         }
     }
    cv::Mat dstLeftRight(src.size(), src.type());
    cv::remap( src, dstLeftRight, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
    cv::imshow("dstLeftRight", dstLeftRight);

Efeito de execução do programa:

Espelho para cima e para baixo: espelho
insira a descrição da imagem aqui
esquerdo e direito
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_44901043/article/details/123486972
Recomendado
Clasificación