W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在本教程中,您將學習如何:
使用OpenCV函數(shù)cv :: remap來實現(xiàn)簡單的重映射例程。
其中 g() 是重映射圖像, f() 源圖像和 h(x,y),是對操作(x,y)的映射函數(shù)。
會發(fā)生什么?很容易看出,圖像將在x方向上翻轉(zhuǎn)。例如,輸入圖像:
觀察紅色圓圈如何相對于x改變位置(考慮x的水平方向):
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
Mat src, dst;
Mat map_x, map_y;
const char* remap_window = "Remap demo";
int ind = 0;
void update_map( void );
int main(int argc, const char** argv)
{
CommandLineParser parser(argc, argv, "{@image |../data/chicky_512.png|input image name}");
std::string filename = parser.get<std::string>(0);
src = imread( filename, IMREAD_COLOR );
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(;;)
{
char c = (char)waitKey( 1000 );
if( c == 27 )
{ break; }
update_map();
remap( src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );
// Display results
imshow( remap_window, dst );
}
return 0;
}
void update_map( void )
{
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++;
}
Mat src,dst;
Mat map_x,map_y;
char * remap_window = “ Remap demo” ;
int ind = 0;
src = imread(argv [1],1);
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);
while(true)
{
char c =(char)waitKey(1000);
如果(c == 27)
{ break ; }
update_map();
remap(src,dst,map_x,map_y,INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));
imshow(remap_window,dst);
}
應用重映射的函數(shù)是cv :: remap。我們給出以下參數(shù):
我們?nèi)绾胃挛覀兊挠成渚仃噈at_x和mat_y?繼續(xù)閱讀:
將圖片縮小到一半,并顯示在中間:
對所有的 (i,j) ,比如:
將圖像倒過來:
從左到右反映圖像:
b和c的組合:
這在以下代碼片段中表示。這里,map_x表示第一坐標H(I,J)和map_y第二坐標。
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.25 ) + 0.5 ;
map_y.at<float>(j,i) = 2*( j - src.rows*0.25 ) + 0.5 ;
}
else
{ map_x.at<float>(j,i) = 0 ;
map_y.at<float>(j,i) = 0 ;
}
break;
case 1:
map_x.at<float>(j,i) = i ;
map_y.at<float>(j,i) = src.rows - j ;
break;
case 2:
map_x.at<float>(j,i) = src.cols - i ;
map_y.at<float>(j,i) = j ;
break;
case 3:
map_x.at<float>(j,i) = src.cols - i ;
map_y.at<float>(j,i) = src.rows - j ;
break;
} // end of switch
}
}
ind++;
}
在編譯上面的代碼之后,可以執(zhí)行它作為參數(shù)給出一個圖像路徑。例如,通過使用以下圖像:
這是將其減小到一半的大小并使其居中的結(jié)果:
把它顛倒過來:
反映在x方向:
反映在兩個方向:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: