OpenCV3常用函数及功能汇总

  1 //-----------------------------------【头文件包含部分】--------------------------------------
  2 //            描述:包含程序所依赖的头文件
  3 //-----------------------------------------------------------------------------------------------
  4 
  5 #include <iostream>
  6 #include <opencv2/opencv.hpp>
  7 #include <opencv2/highgui/highgui.hpp>
  8 #include <opencv2/core/core.hpp>
  9 #include <opencv2/imgproc/imgproc.hpp>
 10 //#include "opencv2/xfeature2d.hpp"
 11 
 12 
 13 //-----------------------------------【命名空间声明部分】--------------------------------------
 14 //            描述:命名空间声明
 15 //-----------------------------------------------------------------------------------------------
 16 using namespace std ;
 17 using namespace cv ;
 18 
 19 
 20 
 21 //-----------------------------------【全局变量声明部分】--------------------------------------
 22 //            描述:全局变量声明
 23 //-----------------------------------------------------------------------------------------------
 24 Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3,g_dstImage4,g_dstImage5 ;
 25 int g_nBoxFilterValue = 6 ; //方框滤波内核值
 26 int g_nMeanBlurValue = 10 ; //均值滤波内核值
 27 int g_nGaussianBlurValue = 6 ; //高斯滤波内核值
 28 int g_nMedianBlurValue = 10 ; //中值滤波参数值
 29 int g_nBilateralFilterValue = 10 ; //双边滤波参数值
 30 
 31 
 32 
 33 //-----------------------------------【全局函数声明部分】--------------------------------------
 34 //            描述:全局函数声明
 35 //-----------------------------------------------------------------------------------------------
 36 //轨迹条回调函数
 37 static void on_BoxFilter(int, void *) ;     //方框滤波
 38 static void on_MeanBlur(int , void *) ;     //均值快滤波
 39 static void on_GaussianBlur(int, void *) ;  //高斯滤波器
 40 static void on_MedianBlur(int, void *) ;    //中值滤波器
 41 static void on_BilateralFilter(int, void *) ;   //双边滤波器
 42 
 43 
 44 /*===================================================================
 45  * // 说明
 46  * 平滑处理-五种滤波函数
 47  *
 48  * 1.方框滤波-boxFilter()函数 |线性
 49  * 2.均值滤波-blur()函数 |线性
 50  * 3.高斯滤波-GaussianBlur() |线性
 51  * 4.中值滤波-medianBlur()函数
 52  * 5.双边滤波-bilateralFilter()函数
 53  *
 54  *
 55  * 形态学图像处理
 56  * /功能:消除噪声;分割除独立元素,在图像中连接相邻的元素;求找图像中的明显极大值或极小值;求出图像的梯度
 57  * 1.膨胀-dilate()函数 求局部最大值 与核进行卷积
 58  * 2.腐蚀-erode()函数  求局部最小值 与核进行卷积
 59  * (膨胀就是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域)
 60  * (腐蚀就是原图中的高亮部分被腐蚀,领域被蚕食,效果图拥有比原图更小的高亮区域)
 61  *
 62  * 图像运算
 63  * 1.开运算 先腐蚀后膨胀 消除平滑边界和小像素物体 dst = open(src,element) = dilate(erode(src,element))
 64  * 2.闭运算 先膨胀后腐蚀 排除黑色区域 dst = close(src,element) = erode(dilate(src,elemnt))
 65  * 3.顶帽运算 原图-开运算 效果:突出比原图轮廓周围更明亮的区域 作用:可做背景提取
 66  * 4.黑帽运算 效果:突出比原图轮廓周围的区域更暗的区域 作用:用来分离比邻近点暗一些的斑块
 67  * 5.形态学梯度
 68  *
 69  * 边缘检测算子
 70  * 1.canndy :Canny(src,src,3, 9,3)多级边缘检测算法 低错误率/高定位性/最小响应
 71  * 2.sobel算子: 主要用作边缘检测的离散微分算子,用以计算图像灰度函数的近似梯度。
 72  * 3.laplacian函数: 主要是利用sobel算子的运算。它通过加上sobel算子运算出的图像x方向和y方向上的导数
 73  *
 74  * 图像金字塔
 75  * 1.resize调整图像大小:
 76  * resize(src,dst,dst.size()) ;     //指定dsize=dst.size()
 77  * resize(src,dst,Size(),0.5,0.5) ; //指定fx和fy,让函数计算除目标图像的大小
 78  *
 79  * opencv霍夫变换
 80  *     1.霍夫线变换 H
 81  *     (1)标准霍夫变换 => 由HoughLines函数调用
 82  *     (2)多尺度霍夫变换 => 由HoughLines函数调用
 83  *     (3)累计概率霍夫变换 => 由HoughLinesP函数调用
 84  *
 85  *     2.霍夫圆变换
 86  *  重映射示例 remap
 87  *  SURF算法
 88  *  Harris角点检测
 89  *
 90  * *****************************************************************************/
 91 
 92 
 93 
 94 
 95 //-----------------------------------【全局函数声明部分】--------------------------------------
 96 //            描述:全局函数声明
 97 //-----------------------------------------------------------------------------------------------
 98 int main() {
 99 
100     //===========================[载入图像]====================================
101     Mat img = imread("/home/allen/pic/girl.jpg") ;
102     Mat dst1 = img.clone() ;
103     Mat dst2 = img.clone() ;
104     Mat srcImage = imread("/home/allen/pic/girl.jpg") ;
105 
106 
107     //===========================[图像相关]====================================
108     //Mat对象创建
109     Mat out_boxFilter ;       //方框滤波
110     Mat out_blur    ;         //均值滤波
111     Mat out_GaussianBlur ;    //高斯滤波
112     Mat out_medianBlur ;      //中值滤波
113     Mat out_bilateralFilter ; //双边滤波
114 
115     //膨胀 or 腐蚀|操作-获取自定义核
116     Mat element = getStructuringElement(MORPH_RECT,Size(15,15)) ;
117     Mat img_dilate ;    //膨胀
118     Mat img_erode ;     //腐蚀
119 
120     Mat img_open ; //开运算
121     Mat img_close ; //闭运算
122 
123     //canny边缘检测
124     Mat dstImage,edge,grayImage ;
125     dstImage.create(srcImage.size(),srcImage.type()) ;
126     cvtColor(srcImage,grayImage,COLOR_BGR2GRAY) ;
127     blur(grayImage,edge,Size(3,3)) ;
128 
129     //sobel算子
130     Mat grad_x, grad_y ; //创建grad_x, grad_y矩阵
131     Mat abs_grad_x, abs_grad_y,dst ;
132 
133     Mat src_sobel = imread("/home/allen/pic/girl.jpg") ;
134     Sobel(src_sobel,grad_x,CV_16S,1,0,3,1,1,BORDER_DEFAULT) ;   //求x方向梯度
135     convertScaleAbs(grad_x,abs_grad_x) ;
136     Sobel(src_sobel,grad_y,CV_16S,0,1,3,1,1,BORDER_DEFAULT) ;   //求y方向梯度
137     convertScaleAbs(grad_y,abs_grad_y) ;
138     addWeighted(abs_grad_x,0.5,abs_grad_y,0.5,0,dst) ;//合并梯度
139 
140     //laplacian()函数
141     Mat src_lap,src_gray,dst_lap,abs_lap ;
142     src_lap = imread("/home/allen/pic/girl.jpg") ;
143     GaussianBlur(src_lap,src_lap,Size(3,3),0, 0,BORDER_DEFAULT) ; //高斯滤波消除噪声
144     cvtColor(src_lap,src_gray,COLOR_BGR2GRAY) ; //zhuanhaun为灰度图
145     Laplacian(src_gray,dst_lap,CV_16S,3,1,0,BORDER_DEFAULT) ; //使用laplacian函数
146     convertScaleAbs(dst_lap,abs_lap) ; //计算绝对值,并将结果转换为8位
147 
148     //Scharr()函数
149     Mat src_sch,grad1_x,grad1_y ;
150     Mat abs_grad1_x,abs_grad1_y,dst_sch ;
151     src_sch = imread("/home/allen/pic/girl.jpg") ;
152     Scharr(src_sch,grad1_x,CV_16S,1,0,1,0,BORDER_DEFAULT) ;
153     convertScaleAbs(grad1_x,abs_grad1_x) ;
154     Scharr(src_sch,grad1_y,CV_16S,0,1,1,0,BORDER_DEFAULT) ;
155     convertScaleAbs(grad1_y,abs_grad1_y) ;
156     addWeighted(abs_grad1_x,0.5,abs_grad1_y,0.5,0,dst_sch) ;
157 
158     //resize调整图像大小
159     Mat src_Image = imread("/home/allen/pic/girl.jpg") ;
160     Mat tmpImage,dstImage1,dstImage2 ;  //临时变量与目标图像的定义
161     tmpImage = src_Image ; //将原始图赋给临时变量
162     resize(tmpImage,dstImage1,Size(tmpImage.cols/2,tmpImage.rows/2),(0,0),(0,0),3) ;
163     resize(tmpImage,dstImage2,Size(tmpImage.cols*2,tmpImage.rows*2),(0,0),(0,0),3) ;
164 
165     //pyrUp()进行向上取样操作并模糊
166     pyrUp( tmpImage, dstImage, Size( tmpImage.cols*2, tmpImage.rows*2 ) );
167     //PyrDown()向下采样并模糊
168     pyrDown(tmpImage,dstImage,Size(tmpImage.cols/2,tmpImage.rows/2)) ;
169 
170 
171     //=================================HoughLine()霍夫线变换=================================
172 //    Mat srcImage_lines = imread("/home/allen/pic/chess.jpg");  //工程目录下应该有一张名为1.jpg的素材图
173 //    Mat midImage,dstImage_lines ;//临时变量和目标图的定义
174 //    //【2】进行边缘检测和转化为灰度图
175 //    Canny(srcImage_lines ,midImage, 50, 200, 3);//进行一此canny边缘检测
176 //    cvtColor(midImage,dstImage_lines, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
177 //    //【3】进行霍夫线变换
178 //    vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
179 //    HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );
180 //    //【4】依次在图中绘制出每条线段
181 //    for( size_t i = 0; i < lines.size(); i++ )
182 //    {
183 //        float rho = lines[i][0], theta = lines[i][1];
184 //        Point pt1, pt2;
185 //        double a = cos(theta), b = sin(theta);
186 //        double x0 = a*rho, y0 = b*rho;
187 //        pt1.x = cvRound(x0 + 1000*(-b));
188 //        pt1.y = cvRound(y0 + 1000*(a));
189 //        pt2.x = cvRound(x0 - 1000*(-b));
190 //        pt2.y = cvRound(y0 - 1000*(a));
191 //        line( dstImage_lines, pt1, pt2, Scalar(55,100,195), 1, LINE_AA);
192 //    }
193 
194 
195 
196     //=================================HoughLineP()函数 霍夫线变换=================================
197 //    Mat srcImage_lines = imread("/home/allen/pic/chess.jpg");  //工程目录下应该有一张名为1.jpg的素材图
198 //    Mat midImage_p,dstImage_lines;//临时变量和目标图的定义
199 //
200 //    //【2】进行边缘检测和转化为灰度图
201 //    Canny(srcImage_lines, midImage_p, 50, 200, 3);//进行一此canny边缘检测
202 //    cvtColor(midImage_p,dstImage_lines,COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
203 //
204 //    //【3】进行霍夫线变换
205 //    vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
206 //    HoughLinesP(midImage_p, lines, 1, CV_PI/180, 80, 50, 10 );
207 //
208 //    //【4】依次在图中绘制出每条线段
209 //    for( size_t i = 0; i < lines.size(); i++ )
210 //    {
211 //        Vec4i l = lines[i];
212 //        line( dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 1, LINE_AA);
213 //    }
214 
215 
216 
217     //=================================HoughCircle()函数 霍夫线变换=================================
218 //    Mat srcImage_circle = imread("/home/allen/pic/circle.jpg");
219 //    Mat midImage_circle,dstImage_circle;//临时变量和目标图的定义
220 //
221 //    //【2】显示原始图
222 //    imshow("【原始图】", srcImage_circle);
223 //
224 //    //【3】转为灰度图,进行图像平滑
225 //    cvtColor(srcImage_circle,midImage_circle, COLOR_BGR2GRAY);//转化边缘检测后的图为灰度图
226 //    GaussianBlur( midImage_circle, midImage_circle, Size(9, 9), 2, 2 );
227 //
228 //    //【4】进行霍夫圆变换
229 //    vector<Vec3f> circles;
230 //    HoughCircles( midImage_circle, circles,HOUGH_GRADIENT,1.5, 10, 200, 100, 0, 0 );
231 //
232 //    //【5】依次在图中绘制出圆
233 //    for( size_t i = 0; i < circles.size(); i++ )
234 //    {
235 //        Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
236 //        int radius = cvRound(circles[i][2]);
237 //        //绘制圆心
238 //        circle( srcImage, center, 3, Scalar(0,255,0), -1, 8, 0 );
239 //        //绘制圆轮廓
240 //        circle( srcImage, center, radius, Scalar(155,50,255), 3, 8, 0 );
241 //    }
242 //
243 //    //【6】显示效果图
244 //    imshow("【效果图】", srcImage_circle);
245 
246 
247 
248 //=================================重映射=================================
249 //    Mat srcImage_remap,dstImage_remap ;
250 //    Mat map_x,map_y ;
251 //
252 //    srcImage_remap = imread("/home/allen/pic/girl.jpg") ;
253 //    imshow("原始图",srcImage_remap) ;
254 //    dstImage_remap.create(srcImage_remap.size(),srcImage_remap.type()) ;
255 //    map_x.create(srcImage_remap.size(),CV_32FC1) ;
256 //    map_y.create(srcImage_remap.size(),CV_32FC1) ;
257 //    for (int j = 0; j < srcImage_remap.rows; j++)
258 //    {
259 //        for (int i = 0; i < srcImage_remap.cols; i++)
260 //        {
261 //            map_x.at<float>(j,i) = static_cast<float>(i) ;
262 //            map_y.at<float>(j,i) = static_cast<float>(srcImage_remap.rows - j) ;
263 //        }
264 //    }
265 //    remap(srcImage_remap,dstImage_remap,map_x,map_y,INTER_LINEAR,BORDER_CONSTANT, Scalar(0,0, 0)) ;
266 //    imshow( "【程序窗口】", dstImage_remap );
267 
268 
269     //=================================Harris角点检测=================================
270 //    Mat img_harris = imread("/home/allen/pic/gegirl.jpg", 0);
271 //    imshow("原始图", img_harris);
272 //
273 //    //进行Harris角点检测找出角点
274 //    Mat cornerStrength;
275 //    cornerHarris(img_harris, cornerStrength, 2, 3, 0.01);
276 //
277 //    //对灰度图进行阈值操作,得到二值图并显示
278 //    Mat harrisCorner;
279 //    threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);
280 //    imshow("角点检测后的二值效果图", harrisCorner);
281 
282 
283 
284     //===========================[图像操作]====================================
285     //五种滤波函数
286 //    boxFilter(img,out_boxFilter,-1,Size(5,5)) ;   //方框滤波
287 //    blur(img,out_blur,Size(7,7)) ;                //均值滤波
288 //    GaussianBlur(img,out_GaussianBlur,Size(5,5),0,0) ;  //高斯滤波
289 //    medianBlur(img,out_medianBlur,7) ;                  //中值滤波
290 //    bilateralFilter(img,out_bilateralFilter,25,25*2,25/2) ;    //双边滤波
291 //    //形态学操作
292 //    dilate(img,img_dilate,element) ;    //膨胀操作
293 //    erode(img,img_erode,element) ;      //腐蚀操作
294 //
295 //    morphologyEx(img,img,MORPH_OPEN,element) ; //开运算
296 //    morphologyEx(img,img,MORPH_CLOSE,element) ; //闭运算
297 //    morphologyEx(img,img,MORPH_GRADIENT,element) ; //形态学梯度
298 //    morphologyEx(dst1,img,MORPH_TOPHAT,element) ; //顶帽运算
299 //    morphologyEx(img,img,MORPH_BLACKHAT,element) ; //黑帽运算
300 //    morphologyEx(img,img,MORPH_ERODE,element) ; //mor腐蚀
301 //    morphologyEx(img,img,MORPH_DILATE,element) ; //mor腐蚀
302 
303 //    Canny(edge,edge,3, 9,3) ; //canny边缘检测
304 
305 
306 
307 
308     //===========================[图像显示]====================================
309     //创建窗口
310 //    namedWindow("[原图]") ;
311 //    namedWindow("") ;
312 //    namedWindow("方框滤波") ;
313 //    namedWindow("均值滤波") ;
314 //    namedWindow("高斯滤波") ;
315 //    namedWindow("中值滤波") ;
316 //    namedWindow("双边滤波") ;
317 //    namedWindow("膨胀") ;
318 //    namedWindow("腐蚀") ;
319 //    namedWindow("开运算") ;
320 //    namedWindow("闭运算") ;
321 //    namedWindow("形态学梯度") ;
322 //    namedWindow("顶帽运算") ;
323 //    namedWindow("黑帽运算") ;
324 //    namedWindow("Canny边缘检测") ;
325 //    namedWindow("sobel算子") ;
326 
327 
328     //窗口显示
329 //    imshow("[原图]",dst1) ; //原图
330 //    imshow("方框滤波",out_boxFilter) ;  //方框滤波
331 //    imshow("均值滤波",out_blur) ;       //均值滤波
332 //    imshow("高斯滤波",out_GaussianBlur) ;   //高斯滤波
333 //    imshow("中值滤波",out_medianBlur) ;     //中值滤波
334 //    imshow("双边滤波",out_bilateralFilter) ; //双边滤波
335 
336 //    imshow("膨胀",img_dilate) ;    //膨胀
337 //    imshow("腐蚀",img_erode)  ;    //腐蚀
338 //    imshow("开运算",img) ;         //开运算
339 //    imshow("闭运算",img) ;         //闭运算
340 //    imshow("形态学梯度",img) ;      //形态学梯度
341 //    imshow("顶帽运算",img) ;       //顶帽运算
342 //    imshow("黑帽运算",img) ;       //黑帽运算
343 
344 //    imshow("Canny边缘检测",edge) ; //Canny边缘检测
345 //    imshow("sobel算子X方向",abs_grad_x) ;     //sobel算子X方向
346 //    imshow("sobel算子Y方向",abs_grad_y) ;     //sobel算子Y方向
347 //    imshow("sobel算子整体方向",dst) ;          //sobel算子整体方向
348 //    imshow("laplacian变换",abs_lap) ;         //laplacian函数
349 //    imshow("scharr函数x方向",abs_grad1_x) ;     //scharr函数x方向
350 //    imshow("scharr函数y方向",abs_grad1_y) ;     //scharr函数y方向
351 //    imshow("合并梯度后scharr",dst_sch) ;         //显示scharr整体效果图
352 
353 //    imshow("size调整图像大小/2",dstImage1) ;  //resize调整大小/2
354 //    imshow("size调整图像大小*2",dstImage2) ;  //resize调整大小*2
355 //    imshow("pyrup效果图",dstImage) ;   //pyrUp效果图
356 //    imshow("pyrdown",dstImage)  ;   //pyrDown效果图
357 
358 
359 //    imshow("HoughLine原始图",srcImage_lines) ; //霍夫线变换的原始图
360 //    imshow("边缘检测后的图",midImage) ;    //canny效果图
361 //    imshow("霍夫线变换效果图",dstImage_lines) ; //霍夫线变换后的效果图
362 
363 //    imshow("【原始图】", srcImage_lines); //显示原始图
364 //    imshow("【边缘检测后的图】", midImage_p); //边缘检测后的图
365 //    imshow("【效果图】", dstImage_lines); //【7】显示效果图
366 
367 //    imshow("【效果图】", srcImage_circle); //霍夫圆变换
368 
369 
370 
371     //===========================[结尾处理]====================================
372     waitKey(0) ;
373     cout << endl << "\t按下'q'键时,程序退出~!\n" ;
374     while (char(waitKey(1))!='q'){}
375     return 0 ;
376 
377 }

 

上一篇:OpenCV识别数码管方案之整体数字的轮廓识别


下一篇:opencv 学习