opencv2 tutorial_code ImgTrans部分

来源:互联网 发布:衢州学院网络教学平台 编辑:程序博客网 时间:2024/05/22 17:47

1、CannyDetector_Demo.cpp  Canny边缘检测

(1)矩阵创建方法:Mat m; m.create(s.size(), s.type());

(2)先灰度化,再滤波,最后进行边缘检测

(3) Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );  //参数:输入图像、输出图像、低阈值、高阈值、核大小

2、copyMakeBorder_demo.cpp   扩充图像边缘,使图像放大

(1)RNG类:

RNG rng(12345);

rng.uniform(0, 255);

参考博客:http://blog.csdn.net/bitowang/article/details/8991931

copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );

参考博客:http://blog.csdn.net/qq_22764813/article/details/52787553

3、filter2D_demo.cpp 利用内核实现卷积运算

参考博客:http://blog.csdn.net/keith_bb/article/details/53103026

4、Geometric_Transforms_Demo.cpp 图像弯曲、旋转

warp_mat = getAffineTransform( srcTri, dstTri );

warpAffine( src, warp_dst, warp_mat, warp_dst.size() );

rot_mat = getRotationMatrix2D( center, angle, scale );

warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );

5、HoughCircle_Demo.cpp 霍夫圆

std::vector<Vec3f> circles;

void HoughCircles( InputArray image, OutputArray circles,
                               int method, double dp, double minDist,
                               double param1 = 100, double param2 = 100,
                               int minRadius = 0, int maxRadius = 0 );

circles:为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆

              半径;

method:为使用霍夫变换圆检测的算法,Opencv只实现了2-1霍夫变换,它的参数是

                 CV_HOUGH_GRADIENT;(一直都是如此)

dp:为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小

        一致,dp=2时霍夫空间是输入图像空间的一半,以此类推;

minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是

                 同一个圆心;

param1:为边缘检测时使用Canny算子的高阈值;

param2:为步骤1.5和步骤2.5中所共有的阈值;

minRadius,maxRadius:为所检测到的圆半径的最小值和最大值。

6、HoughLines_Demo.cpp 霍夫直线

vector<Vec2f> s_lines;

HoughLines( edges, s_lines, 1, CV_PI/180, min_threshold + s_trackbar, 0, 0 );

for( size_t i = 0; i < s_lines.size(); i++ )
     {
      float r = s_lines[i][0], t = s_lines[i][1];
      double cos_t = cos(t), sin_t = sin(t);
      double x0 = r*cos_t, y0 = r*sin_t;
      double alpha = 1000;


       Point pt1( cvRound(x0 + alpha*(-sin_t)), cvRound(y0 + alpha*cos_t) );
       Point pt2( cvRound(x0 - alpha*(-sin_t)), cvRound(y0 - alpha*cos_t) );
       line( standard_hough, pt1, pt2, Scalar(255,0,0), 3, LINE_AA);
     }

累计概率霍夫变换:

vector<Vec4i> p_lines;

HoughLinesP( edges, p_lines, 1, CV_PI/180, min_threshold + p_trackbar, 30, 10 );

for( size_t i = 0; i < p_lines.size(); i++ )
     {
       Vec4i l = p_lines[i];
       line( probabilistic_hough, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,0,0), 3, LINE_AA);
     }

7、imageSegmentation.cpp 图像分割

(1)原图-filter图=使图像更显眼

(2)distanceTransform()方法,可以实现图像细化、查找图像质心

参考博客:http://blog.csdn.net/dcrmg/article/details/52517991

(3)分水岭算法

8、Laplace_Demo.cpp 拉普拉斯变换

Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

9、Remap_Demo.cpp 重映射

重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

10、Sobel_Demo.cpp

Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );

Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );

convertScaleAbs( grad_x, abs_grad_x );
convertScaleAbs( grad_y, abs_grad_y );

addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );