在本教程中,您将学习如何:
注意
下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。
在本教程中,我们将简要探讨为图像定义额外填充(边框)的两种方法:
这将在“代码”部分中更清楚地看到。
让用户选择在输入图像中使用哪种填充。有两种选择:
用户通过按“c”(常量)或“r”(复制)来选择任一选项
教程代码如下所示。
您也可以从这里下载
- #include "opencv2/imgproc.hpp"
- #include "opencv2/imgcodecs.hpp"
- #include "opencv2/highgui.hpp"
-
- using namespace cv;
-
- // Declare the variables
- Mat src, dst;
- int top, bottom, left, right;
- int borderType = BORDER_CONSTANT;
- const char* window_name = "copyMakeBorder Demo";
- RNG rng(12345);
-
- int main( int argc, char** argv )
- {
- const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
-
- // Loads an image
- src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
-
- // Check if image is loaded fine
- if( src.empty()) {
- printf(" Error opening image\n");
- printf(" Program Arguments: [image_name -- default lena.jpg] \n");
- return -1;
- }
-
- // Brief how-to for this program
- printf( "\n \t copyMakeBorder Demo: \n" );
- printf( "\t -------------------- \n" );
- printf( " ** Press 'c' to set the border to a random constant value \n");
- printf( " ** Press 'r' to set the border to be replicated \n");
- printf( " ** Press 'ESC' to exit the program \n");
-
- namedWindow( window_name, WINDOW_AUTOSIZE );
-
- // Initialize arguments for the filter
- top = (int) (0.05*src.rows); bottom = top;
- left = (int) (0.05*src.cols); right = left;
-
- for(;;)
- {
- Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
-
- copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
-
- imshow( window_name, dst );
-
- char c = (char)waitKey(500);
- if( c == 27 )
- { break; }
- else if( c == 'c' )
- { borderType = BORDER_CONSTANT; }
- else if( c == 'r' )
- { borderType = BORDER_REPLICATE; }
- }
-
- return 0;
- }
首先,我们声明将要使用的变量:
- // Declare the variables
- Mat src, dst;
- int top, bottom, left, right;
- int borderType = BORDER_CONSTANT;
- const char* window_name = "copyMakeBorder Demo";
- RNG rng(12345);
特别值得一提的是变量 rng,它是一个随机数生成器。我们用它来生成随机边框颜色,我们很快就会看到。
像往常一样,我们加载源图像 src:
- const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
-
- // Loads an image
- src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
-
- // Check if image is loaded fine
- if( src.empty()) {
- printf(" Error opening image\n");
- printf(" Program Arguments: [image_name -- default lena.jpg] \n");
- return -1;
- }
在简要介绍了如何使用该程序之后,我们创建了一个窗口:
- // Initialize arguments for the filter
- top = (int) (0.05*src.rows); bottom = top;
- left = (int) (0.05*src.cols); right = left;
程序在无限循环中运行,而未按下 ESC 键。如果用户按“c”或“r”,则 borderType 变量将分别取值 BORDER_CONSTANT 或 BORDER_REPLICATE:
- char c = (char)waitKey(500);
- if( c == 27 )
- { break; }
- else if( c == 'c' )
- { borderType = BORDER_CONSTANT; }
- else if( c == 'r' )
- { borderType = BORDER_REPLICATE; }
在每次迭代中(0.5 秒后),随机边框颜色(值)都会更新......
Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
此值是在 [0,255] 范围内随机选择的三个数字的集合。
最后,我们调用函数 copyMakeBorder()来应用相应的填充:
copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
我们在之前创建的图像中显示输出图像
imshow( window_name, dst );
编译上面的代码后,您可以执行它,并给出图像的路径作为参数。结果应为:
下面的一些屏幕截图显示了边框如何改变颜色以及BORDER_REPLICATE选项的外观:
参考文献 :
1、《Adding borders to your images》----Ana Huamán