OpenCV官方文档学习记录(12)

构建边界;

因为做图像卷积的时候在图片边缘的像素按照公式是无法计算的,因此需要在边缘构建边界进行计算;

在opencv中构建边界的函数是:copyMakeBorder(src,dst,top,bottom,left,right,borderType,values);

先来代码:

 1 #include<opencv2/opencv.hpp>
 2 #include<iostream>
 3 #include<string>
 4
 5 using namespace std;
 6 using namespace cv;
 7
 8 int main(int argc,char **argv)
 9 {
10     if((argc-2)!=0)
11     {
12         cout<<"Usage: ./makeBorder \"image_name\""<<endl;
13         return 0;
14     }
15
16     Mat src=imread(argv[1]);
17     if(src.empty())
18     {
19         cout<<"Has not found image"<<endl;
20         return -1;
21     }
22
23     namedWindow("Src",CV_WINDOW_AUTOSIZE);
24     imshow("Src",src);
25
26     Mat dst;
27     RNG rng(12345);
28     Scalar values;
29     int top;
30     int bottom;
31     int left;
32     int right;
33     char c;
34     int borderType;
35
36     top=(int)(0.05*src.rows);
37     bottom=(int)(0.05*src.rows);
38     left=(int)(0.05*src.cols);
39     right=(int)(0.05*src.rows);
40
41     while(true)
42     {
43         c=waitKey(500);
44         if((char)c==27)
45             break;
46         //borderType=BORDER_CONSTANT;
47         borderType=BORDER_REPLICATE;
48         values=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
49         copyMakeBorder(src,dst,top,bottom,left,right,borderType,values);
50
51         namedWindow("Dst",CV_WINDOW_AUTOSIZE);
52         imshow("Dst",dst);
53     }
54
55     waitKey();
56     return 0;
57 }

同样的CMakeLists.txt

1 cmake_minimum_required(VERSION 2.8)
2 project( makeBorder.cpp )
3 find_package( OpenCV REQUIRED )
4 add_executable( makeBorder makeBorder.cpp )
5 target_link_libraries( makeBorder ${OpenCV_LIBS} )

将borderype类型分别取值时,结果分别是:

可以看出两个参数不同在于,前者是使用自行构建的像素进行填充,后者是将边缘像素拓展。当然,看上去是后者比较好看。

函数参数的说明就不多叙了,字面上可以自己理解。

以上。

时间: 2024-11-04 07:21:48

OpenCV官方文档学习记录(12)的相关文章

OpenCV官方文档学习记录(4)

基本图形的绘制,官方文档给了一个实例,绘制下面两幅图形,分别使用了圆,椭圆,矩形,多边形,线等构造. 主要是使我们了解到如何构建这些形状,以及如何使用两种数据类型Point和Scalar分别定义点和颜色: 先放图: 完整代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\

OpenCV官方文档学习记录(16)

Canny边缘检测 先不说函数作用,来代码: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 using namespace std; 8 u

OpenCV官方文档学习记录(11)

制作自己的filter, 主要使用filter2D函数: 先上代码: 1 #include "opencv2/opencv.hpp" 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 int main(void) 9 { 10 Mat src,dst; 11 12 Mat kernel; 13 Point anthor; 14 do

OpenCV官方文档学习记录(6)

离散傅里叶变换:DFT,文档p165 代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 #define NUMBER 20 8 9

OpenCV官方文档学习记录(5)

随机数生成类:RNG以及文字渲染 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 #define NUMBER 20 8 9 using na

OpenCV官方文档学习记录(15)

laplace边缘检测方式 不同于sobel的一阶导数式边缘检测,laplace算子是将图像的横纵都考虑进来的一种检测,主要使用的是二阶偏导数进行离散变换: 因为laplace也是使用分析梯度的方式进行变换,所以实际上调用的是sobel的方法.在上一篇上有体现,就是在两个方向上分别使用sobel计算结果. 代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5

OpenCV官方文档学习记录(1)

图像显示并转化为黑白输出到新文件 code: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 using namespace std; 8 u

OpenCV官方文档学习记录(19)

重映射(remapping) 主要涉及函数 remap 因为重映射函数所做的就是通过相应的矩阵参数,将原图像对应的像素点按照参数表达式重新排列到目标矩阵,所以通过不同的算法的描写可以形成许多操作: 1.保持原样: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"win

OpenCV官方文档学习记录(13)

sobel边缘检测(导数运算) 主要函数Sobel() 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 void showImg(const string &win_name,const Mat &img) 9 { 10 namedWindow(win_name