(32)Air Band OpenCV2.4.13

    xiaoxiao2021-03-25  96

    本文是对OpenCV2.4.13文档的部分翻译,作个人学习之用,并不完整。

    重映射:

    就是提取一幅图像中一个位置的像素将他们放在另一幅图像中的另一个位置的过程。

    为了完成映射过程,可能需要对一些非整数的像素位置额外处理,因为原图和目标图不总是一对一的关系。

    我们可以将(x , y)位置像素的重映射这样表达:

    g()是重映射的图像,f()是原图像,h(x , y)是对(x , y)的映射函数。

    如:

    该函数在x方向进行了翻转。

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> using namespace cv; /// Global variables Mat src, dst; Mat map_x, map_y; const char* remap_window = "Remap demo"; int ind = 0; /// Function Headers void update_map( void ); /** * @function main */ int main() { /// 载入图像 src = imread("lena.jpg", 1 ); /// 创建与原图像同样大小的目标图像,x、y方向上的映射矩阵 dst.create( src.size(), src.type() ); map_x.create( src.size(), CV_32FC1 ); map_y.create( src.size(), CV_32FC1 ); /// 创建窗口 namedWindow( remap_window, WINDOW_AUTOSIZE ); /// 循环 for(;;) { /// 每1秒更新映射矩阵,并将其应用到原图像上,ESC退出 int c = waitKey( 1000 ); if( (char)c == 27 ) { break; } /// 更新map_x & map_y然后重新映射 update_map(); // 原图像,目标图像,x方向上的映射函数(相当于h(i,j)的第一部分),y方向上的映射函数,非整像素的添加类型(默认),默认 remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) ); // 显示结果 imshow( remap_window, dst ); } return 0; } /** * @function update_map * @brief 用四类映射填充map_x和map_y */ void update_map( void ) { // 将图像变为一半大小,在中间展示 // h(i,j)=(2*i-src.cols/2+0.5 , 2*j-src.rows/2+0.5) // 对于(i,j)对,src.cols/4<i<3*src.cols/4, src.rows/4<j<3*src.rows/4 // a将图像上下翻转:h(i,j)=(i,src.rows-j) // b将图像左右翻转:h(i,j)=(src.cols-i,j) // c合并a和b:h(i,j)=(src.cols-i,src.rows-j) // 这里map_x表示h(i,j)的第一个坐标,map_y表示第二个坐标 ind = ind%4; for( int j = 0; j < src.rows; j++ ) { for( int i = 0; i < src.cols; i++ ) { switch( ind ) { case 0: if( i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75 ) { map_x.at<float>(j,i) = 2*( i - src.cols*0.25f ) + 0.5f ; map_y.at<float>(j,i) = 2*( j - src.rows*0.25f ) + 0.5f ; } else { map_x.at<float>(j,i) = 0 ; map_y.at<float>(j,i) = 0 ; } break; case 1: map_x.at<float>(j,i) = (float)i ; map_y.at<float>(j,i) = (float)(src.rows - j) ; break; case 2: map_x.at<float>(j,i) = (float)(src.cols - i) ; map_y.at<float>(j,i) = (float)j ; break; case 3: map_x.at<float>(j,i) = (float)(src.cols - i) ; map_y.at<float>(j,i) = (float)(src.rows - j) ; break; } // end of switch } } ind++; }结果:

    转载请注明原文地址: https://ju.6miu.com/read-14115.html

    最新回复(0)