Opencv入门(二)

/********************************************************************************************

*opencv3.2 c++版学习常用函数总结,后续学习中不断添加新函数。

*********************************************************************************************/

1、图像读写函数

Mat imread(const String& filename,int flags = IMREAD_COLOR);

filename:图片的路径

flags:

  • flags>0,三通道彩色图
  • flags=0,灰度图
  • flags<0,包含Alpha通道的图像

Mat img1 = imread("1.jpg",2|4) //加载无损图像

Mat img2 = imread("1.jpg",0)    //载入灰度图

Mat img3 = imread("1.jpg",199)  //载入三通道彩色图

Mat  bool imwrite(const string& filename, InputArray image, const vector<int>& params=vector<int>())
filename:文件名,不能包含中文路径

image:输入图像矩阵

params –

Format-specific save parameters encoded as pairs paramId_1, paramValue_1, paramId_2, paramValue_2, ... . The following parameters are currently supported:

  • For JPEG, it can be a quality ( CV_IMWRITE_JPEG_QUALITY ) from 0 to 100 (the higher is the better). Default value is 95. 对于JPEG,图像质量。
  • For PNG, it can be the compression level ( CV_IMWRITE_PNG_COMPRESSION ) from 0 to 9. A higher value means a smaller size and longer compression time. Default value is 3. 对于PNG,压缩等级。
  • For PPM, PGM, or PBM, it can be a binary format flag ( CV_IMWRITE_PXM_BINARY ), 0 or 1. Default value is 1.

void imshow(const string& winname, InputArray image)

winname:窗口名字

image:要显示的图像矩阵


2、获得旋转矩阵的函数

Mat getRotationMatrix2D(Point center,double angle,double scale)

主要是获取图像以center为中心、angle的角度、scale缩放比例的旋转矩阵

center:旋转中心

angle:旋转角度

scale:缩放因子

3、仿射变换函数

warpAffine(src,dst,warp_mat,dst_size)

src:输入图像

dst:输出图像

warp_mat:仿射矩阵

dst_size:输出图像大小

4、求仿射矩阵函数

Mat getAffineTransform(srcTri,dstTri)

通过三点的映射几何关系获得仿射矩阵。。。。

srcTri:输入的三点矩阵

dstTri:输出的三点矩阵

5、图像混合函数

addWeighted(inputArray img1,double alpha,inputArray img2,double beta,double gamma,OutputArray dst,int dtype=-1)

运算公式:dst = alpha*img1 + beta*img2 +gamma

img1:需要混合的图像矩阵

alpha:img1图像所占的比例

img2:需要混合的图像矩阵

beta:img2图像所占的比例(一般为1-alpha)

gamma:偏移量

dst:img1和img2按照比例混合后的输出图像

dtype:输出矩阵的深度,默认-1

6、图像大小变换函数

resize(inputArray src,OputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)

例:resize(img1,img2,Size(800,480))

src:原图像阵列

dst:输出图像阵列

dsize:输出图像的大小

fx,fy:分别是沿着x、y轴的缩放系数

interpolation :

INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认)
INTER_AREA - 区域插值
INTER_CUBIC - 三次样条插值

INTER_LANCZOS4 - Lanczos插值

7、数值取整函数

cvRound(num) 返回跟参数最接近的整数值

cvFloor 返回不大于参数的最大整数值

cvCeil 返回不小于参数的最小整数值

8、绘制直方图函数

CV_EXPORTS void calcHist( const Mat* images, int nimages,

                          const int* channels, InputArray mask,
                          SparseMat& hist, int dims,
                          const int* histSize, const float** ranges,

                          bool uniform=true, bool accumulate=false );

例:Histogram::Histogram()

{
    histSize[0] = 256;
    histSize[1] = 256;
    histSize[2] = 256;
    hranges[0] = 0.0;
    hranges[1] = 256.0;
    ranges[0] = hranges;
    ranges[1] = hranges;
    ranges[2] = hranges;
    channels[0] = 0;
    channels[1] = 1;
    channels[2] = 2;
}


cv::Mat Histogram::getHistogram(const cv::Mat &image)
{
        cv::Mat hist;
        cv::calcHist(&image,1,channels,cv::Mat(),3,histSize,ranges);
        return hist;
}

image:原图像阵列

nimages:图像个数

channels:图像信道

mask:可选的掩码,如果不为空,则必须是8-bit数组,而且大小和原图像相同,非零位置为要计算的直方  图区域

hist:输出直方图阵列

dims:处理直方图的维数

histSize:每一维直方图的尺寸大小

ranges:直方图每一维数据的大小范围

9、绘画矩阵的函数

(1)、利用对角线来绘制矩形

void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)

例:cv::rectangle(matImage,cvPoint(88,88),cvPoint(168,168),Scalar(0,255,0),1,1,0);  

(2)、通过举行参数来绘制矩形

void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

例: Rect rec1 = Rect(100, 300, 600, 200);  

 rectangle (image3, rec2, Scalar(0, 0, 255), -1, 8, 0);

img:图像阵列

pt1:矩形的左上角点

pt2:矩形的右下角点

color:绘制矩形框的颜色

thickness:组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。

lineType:线条的类型

shift:坐标点的小数点位数

10、图像腐蚀和膨胀

(1、获取指定形状和尺寸的结构元素函数

Mat element = getStructuringElement(MORPH_RECT,  
                        Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  

                        Point( g_nStructElementSize, g_nStructElementSize ) );

参数一:形状选择

矩形:MORPH_RECT;

交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;

参数二:内核尺寸

参数三:描点的位置,默认(-1,-1)表示中心点

(2、图像腐蚀

void erode( InputArray src,  
               OutputArray dst,  
               InputArray kernel,  
               Point anchor=Point(-1,-1),  
               int iterations=1,  
               int borderType=BORDER_CONSTANT,  
               const Scalar& borderValue=morphologyDefaultBorderValue()  );

参数一:原图像

参数二:目标图像(输出)

参数三:腐蚀操作的内核,默认位于中心的3*3大小的核

参数四:默认(-1,-1)表示位于element的中心,一般不用管它

参数五:迭代使用erode函数的次数,默认值为1

参数六:边界模式选择

参数七:当边界值为常数时,有默认值morphologyDefaultBorderValue() 

(3、图像膨胀

void dilate(InputArray src,  
     OutputArray dst,  
     InputArray kernel,  
     Point anchor=Point(-1,-1),  
     int iterations=1,  
     int borderType=BORDER_CONSTANT,  

     const Scalar& borderValue=morphologyDefaultBorderValue() )

参数描述同上

例:Mat src = getStructuringElement(MORPH_RECT,Size(15,15));

Mat out,out1;

dilate(src,out,element);

erode(src,out1,element);

imshow("dilate",out);

imshow("erode",out1);

11、滑动条回调函数

创建进度条:

CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,  
                              int* value, int count,  
                              TrackbarCallback onChange = 0,  

                              void* userdata = 0);  

参数一:进度条名字

参数二:窗口名

参数三:进度条初始化阈值

参数四:进度条最大刻度值

参数五:回调函数,形式void callback(int,void *)

获取当前进度条的位置:

int getTrackbarPos(const string& trackbarname, const string& winname)

参数一:轨迹条的名字

参数二:轨迹条的父窗口名

12、鼠标操作回调函数

void setMouseCallback(conststring &winname,MouseCallback onMouse,void *userdata=0)

参数一:窗口名字

参数二:回调函数原型void Foo(int event,int x,int y,int flags,void *param)

参数三:用户定义传递到回调函数的数值

13、滤波操作函数详解

线性滤波器

(1、均值滤波,是归一化后的方框滤波器

void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

参数一:原图像阵列

参数二:输出图像阵列

参数三:内核大小

参数四:锚点(即需要滤波的点),默认为(-1,-1)中点

参数五:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

(2、高斯滤波

GaussianBlur( InputArray _src, OutputArray _dst, Size ksize,  
                   double sigma1, double sigma2,  

                   int borderType )  

参数一:输入图像阵列

参数二:输出图像阵列

参数三:核的大小

参数四:x方向正态分布参数

参数五:y方向正态分布参数

参数六:边界类型,默认就好

(3、方框滤波器

void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point auchor=Point(-1,-1),boolnormalize=true,int borderType = BORDER_DEFAULT)

参数一、二:输入输出阵列

参数三:输出图像的深度,-1表示原图的深度

参数四:内核的大小

参数五:锚点(即被平滑的那个点),Point(-1,-1)表示内核中心

参数六:表示内核是否被其区域归一化,当为true时为均值滤波

参数七:边界类型选择

非线性滤波器

(1、中值滤波

medianBlur(InputArray src,OutputArray dst,int size)

参数一:输入图像阵列

参数二:输出图像阵列

参数三:正方形区域的边长

(2、双边滤波

bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace,  

                      int borderType=BORDER_DEFAULT );

参数三:滤波时像素领域的直径,如果为-1则由后面的sigmaspace计算

参数四:计算图像的颜色偏移量

参数五:计算图像的空间偏移量

参数六:边界框

14、几种边缘检测算法

(1、sobel算子

void Sobel( InputArray src, OutputArray dst, int ddepth,

                         int dx, int dy, int ksize = 3,
                         double scale = 1, double delta = 0,

                         int borderType = BORDER_DEFAULT );

参数三:输出图像的深度

参数四、五:x、y方向的导数阶数

参数六:内核大小

最后三个参数:分别是缩放因子、增量、边界模式

(2、canny算子

Canny (     
    InputArray    image,    // 输入图像 (8位)
    OutputArray   edges,    // 输出图像 (单通道,8位)
    double      threshold1,  // 下阈值
    double      threshold2,  // 上阈值
    int         apertureSize = 3,
    bool        L2gradient = false //采用近似,若为true采用更精确

(3、Laplace算子

Laplacian (     
                InputArray     src,    //输入图像
                OutputArray    dst,  //输出图像
                int       ddepth,       //输出图像深度
                int       ksize = 1,     //内核大小
                double    scale = 1,  //缩放因子
                double    delta = 0,  //增量
                int       borderType = BORDER_DEFAULT  //边界模式

15、程序运行时间的计算

double time0 = static_cast<double>getTickCount();

.................

time0 = (static_cast<double>getTickCount()-time0)/getTickFrequency();

cout<<"the duration time is:"<<time0<<endl;

16、通道分离和合并

C++: void split(const Mat& src, Mat*mvbegin);  

C++: void split(InputArray m,OutputArrayOfArrays mv); 

参数一:InputArray 类型的m,或者 Mat & 型的src

参数二:OutputArrayOfArrays 类型的mv,或者vector容器

示例:

bool Split_channels()
{
        Mat img = imread("BruceLi.jpg");
        if(img.empty())
        {
                cout<<"read BruceLi.jpg fail"<<endl;
                return false;
        }
        vector<Mat> channels;
        split(img,channels);
        imshow("B",channels[0]);
        imshow("G",channels[1]);
        imshow("R",channels[2]);
        return true;
}
C++: void merge(const Mat* mv, size_tcount, OutputArray dst)  

C++: void merge(InputArrayOfArrays mv,OutputArray dst)  

参数一:输入矩阵 或者vector容器阵列

参数二:当mv输入一个空白的数组时,count代表输入矩阵的个数

参数三:输出矩阵

示例:

bool Split_channels()
{
        Mat img = imread("BruceLi.jpg");
        if(img.empty())
        {
                cout<<"read BruceLi.jpg fail"<<endl;
                return false;
        }
        vector<Mat> channels;
        split(img,channels);
        imshow("B",channels[0]);
        imshow("G",channels[1]);
        imshow("R",channels[2]);

        Mat image(img.size(),CV_8UC3);
        merge(channels,image);
        imshow("image",image);
        return true;
}

17、图像形态学处理函数

void morphologyEx(InputArray src,OutputArray dst,int op,InputArray kernel,

Point auchor = Point(-1,-1),intiterations = 1,int borderType = BORDER_CONSTANT,

const Scalar &borderValue = morphologyDefaultBorderValue());

参数一、二:分别是输入输出阵列

参数三:形态学运算的类型:MORPH_OPEN(开运算)、MORPH_CLOSE(闭运算)、MORPH_GRADIENT(形态学梯度)

MORPH_TOPHAT(顶帽)、MORPH_BLACKHAT(黑帽)、MORPH_ERODE(腐蚀)、MORPH_DILATE(膨胀)

参数四:内核大小,若为NULL则默认3*3,一般通过函数getStructuringElement获取内核

参数五:锚的位置,(-1,-1)默认中心点

参数六:迭代使用函数的次数,默认1

参数七:边界类型,有默认值

参数八:有默认值一般不需要管

实例:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>


using namespace std;
using namespace cv;


int main(int argc,char *argv[])
{
        Mat g_srcImage = imread(argv[1]);
        if(g_srcImage.empty())
        {
                cout<<"打开图像失败"<<endl;
                return -1;
        }
        namedWindow("原图");
        namedWindow("效果图");


        imshow("原图",g_srcImage);
        Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
        morphologyEx(g_srcImage,g_srcImage,MORPH_OPEN,element);


        imshow("效果图",g_srcImage);
        waitKey(0);
        return 0;

}

18、图像金字塔

1、向上取样:

void pyrUp(InputArray src,OutputArray dst,const Size& dstsize = Size(),int borderType =BORDER_DEFAULT )

参数一、二:输入输出阵列

参数三:输出图像打小

参数四:边界类型,一般不用管

2、向下采样

void pyrDown(InputArray src,OutputArray dst,const Size& dstsize = Size(),int borderType =BORDER_DEFAULT )

19、图像阈值化操作

double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type)

参数一、二:输入输出图像阵列

参数三:阈值

参数四:当第五个参数取0或1时的最大值

参数五:阈值类型CV_THRESH_BINARY,CV_THRESH_BINARY_INV,_TRUNC,_TOZERO,_TOZERO_INV(0,1, 2,3,4)

20、霍夫变换

1)、标准霍夫变换

void HoughLines(InputArray src,OutputArray lines,double rho,double theta,int threshold,double srn=0,double stn=0)

参数一:八位单通道二进制图像

参数二:每一条线有(p,θ)表示,p是离原点的距离,θ是线的旋转角度

参数三:直线搜索时的进步尺寸的单位半径

参数四:直线搜索时的进步尺寸的单位角度

参数五:累加平面的阈值参数,大于阈值才可以被检测并返回结果

参数六:粗略的累加器进步尺寸直接是参数三rho,精确的是rho/srn

参数七:theta/stn

2)、累计概率霍夫变换

void HoughLinesP(InputArray src,OutputArray lines,double rho,double theta,int threshold,double minLineLength=0,double maxLineGap=0)

参数一、三、四、五:和上一样

参数二:每条直线由四个元素组成(x_1,y_1) (x_2,y_2),表示线段的结束点

参数六:表示最低线段长度,比这个设定参数短的线段就不能被显现出来

参数七:允许将同一行点与点之间连接起来的最大距离

3)、霍夫圆变换

void HoughCircles(InputArray src,OutputArray circles,int method,int dp,double mindist,double param1=100,double param2=100,int minRadius=0,int maxRadius=0)

参数一:八位灰度单通道图像

参数二:输出矢量(x,y,radius)原点坐标和半径

参数三:检测方法,HOUGH_GRADIENT霍夫梯度法

参数四:检测圆心的累加器图像分辨率是输入图像的1/dp倍

参数五:算法能明显区分两个圆之间的最小距离,指圆心距离,过大时有些圆不能检测,过小时多圆重合。

参数六:表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半

参数七:表示检测阶段圆心的累加器阈值,越小越可以检测根本不存的圆,越大就检测出更加完美的圆

参数八:圆半径最小值

参数九:圆半径最大值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值