zoukankan      html  css  js  c++  java
  • Opencv的使用小教程1——Opencv基础函数汇总

        1、VideoCapture
         2、imread
         3、resize
         4、clone
         5、cvtColor
         6、Scalar
         7、获取像素点的值
         8、Rect
         9、截取Rect部分图像
         10、equalizeHist直方图均衡化
         11、threshold阈值操作
         12、line直线绘画
         13、ellipse椭圆绘画:
         14、circle圆绘画:
         15、rectangle矩形绘画:
         16、fillPoly多边形绘画:

    基本上没有接触过图像处理的我,在项目的压迫下,要在一星期内精通一切,但是还是要微笑啊。
    在这里插入图片描述
    该部分主要提到的函数包括,摄像头读取、图片读取、图片复制、图片伸缩、直方图、二值化、基础绘画等。其它图像处理函数如滤波,角点检测的函数,将在其它文章汇总。
    Opencv常用图像处理函数汇总
    1、VideoCapture

    VideoCapture可用于从摄像头获取图像,在使用前可以通过如下函数进行初始化。

    VideoCapture cap;
    cap.open(0);                             
    //打开相机,电脑自带摄像头一般编号为0
    //外接摄像头编号为1,在设备管理器中可以查询
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);  //设置捕获视频的宽度
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 400);  //设置捕获视频的高度
    if (!cap.isOpened())                         //判断是否成功打开相机
    {
    	cout << "摄像头打开失败!" << endl;
    	return -1;
    }
    

    用如下函数可以捕获图像。

    //从相机捕获一帧图像
    cap >> frame;                                
    

    2、imread

    imread共有两个参数,分别是const String& filename和int flags。其中:
    filename代表想要读取的图片的路径与名字。
    flags代表标志位,该标志位代表转换成Mat的数据存储形式。默认值IMREAD_COLOR。
    其可以取得如下值:

    IMREAD_UNCHANGED          //如果设置,则返回的数据带有alpha通道(R,G,B,A 四个通道),否则没有alpha通道
    IMREAD_GRAYSCALE          //如果设置,则将图像转换为单通道灰度图像
    IMREAD_COLOR              //如果设置,则将图像转换成3通道BGR彩色图像
    IMREAD_ANYDEPTH           //如果设置,则在输入具有相应深度时返回16位/32位图像,否则将其转换为8位
    IMREAD_ANYCOLOR           //如果设置,则图像可能以任何颜色格式读取
    IMREAD_LOAD_GDAL          //如果设置,使用gdal驱动程序加载图像
    IMREAD_REDUCED_GRAYSCALE_2//如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/2
    IMREAD_REDUCED_COLOR_2    //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/2
    IMREAD_REDUCED_GRAYSCALE_4//如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/4
    IMREAD_REDUCED_COLOR_4    //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/4
    IMREAD_REDUCED_GRAYSCALE_8//如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/8
    IMREAD_REDUCED_COLOR_8    //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/4
    IMREAD_IGNORE_ORIENTATION //如果设置,不会根据EXIF的方向标志旋转图像
    

    实际上这些标志位存储在一个名为ImreadModes的枚举量里。
    在实际使用时可以通过如下函数进行图片读取:

    imread("image.jpg",IMREAD_GRAYSCALE);
    

    3、resize

    resize用于改变图片的分辨率
    void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
    其中,前两个参数分别为输入和输出图像。dsize表示输出图像的大小,如果为0,则利用fx和fy进行比例放大。
    当dsize=0时,表示利用fx和fy进行比例放大,fx=fy=2时,表示放大为原来的两倍;
    当fx=fy=0时,表示利用dsize放大,假设dsize = (640,400),那么将图像分辨率调整为(640,400)。
    interpolation表示插值方式,共有以下几种插值方法:

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

    在实际应用中可以通过如下方式进行应用:

    //从相机捕获一帧图像
    cap >> frame;                                
    
    //用于存放灰度数据
    Mat grayImage;                              
    
    // 利用dsize进行缩放
    double fScale = 1;
    Size dsize = Size(frame.cols*fScale, frame.rows*fScale);
    
    // 建立一个大小与imagedst相同的图像
    Mat imagedst = Mat(dsize, CV_32S);
    
    // imagedst表示目标图像
    resize(frame, imagedst, dsize);
    

    4、clone

    clone用于图像克隆,也就是图像复制。在实际应用中可以复制图像,在进行修改时可以不修改原图。
    通过如下方式可以实现图像克隆。

    Mat dst;
    dst = src.clone();
    

    5、cvtColor

    cvtColor用于图像的类型转换。如BGR图转换为灰度图,RGB图转化为BGR图等。
    通过如下方式可以实现图像的类型转换。

    cvtColor(src, srcGray, COLOR_BGR2GRAY);
    

    常用的转化码如下:

    CV_BGR2RGB	//在RGB或BGR色彩空间之间转换
    CV_RGB2BGR
    
    CV_RGB2GRAY	//RGB或者BGR色彩空间与灰度空间转换
    CV_BGR2GRAY
    CV_GRAY2RGB
    CV_GRAY2BGR
    
    CV_RGB2RGBA	//加入alpha通道或者删除alpha通道
    CV_BGR2BGRA
    CV_RGBA2RGB
    CV_BGRA2BGR
    

    6、Scalar

    Scalar(int,int,int);表示每个通道的数值,常常在建立空图片的时候使用。
    使用方式如下所示,其可以建立三个图像:

    Mat blue_m(256,256,CV_8UC3,Scalar(255,0,0));
    Mat green_m(256,256,CV_8UC3,Scalar(0,255,0));
    Mat red_m(256,256,CV_8UC3,Scalar(0,0,255));
    imshow("Blue",blue_m);
    imshow("Green",green_m);
    imshow("Red",red_m);
    

    7、获取像素点的值

    可以通过如下函数获得像素点的值:

    int pixel = image.at<Vec3b>(0, 0)[0];
    

    如上代表获取第i行,第j列,0为第一通道,1为第二通道,2为第三通道,若要获取透明通道则要Vec4b。

    8、Rect

    Rect用于获得矩形,其一共有四个输入值,分别是左上角坐标x,y,宽,高。
    可以通过如下函数建立一个矩形:

    Rect rec = Rect(0, 0, 640, 400);

    此时建立了一个分辨率为(640,400)的矩形。注意的是,函数中640是矩形的宽度,不是右下角的坐标。

    9、截取Rect部分图像

    Rect用于获得矩形,通过特定的函数可以获得该部分的图像。
    假设原图变量为image
    可以通过如下函数获得部分图像:

    Rect rec = Rect(200, 200, 200, 200);
    Mat part_img= image(rec); //获取缩放后右Camera的图像
    

    通过该方式获得了一个左上角位于image(200,200)位置,分辨率为(200,200)的图像。

    10、equalizeHist直方图均衡化

    均衡化的图像相比于原图有明显的增强,可用于增强原图的可观测性。
    可以通过如下函数进行直方图均衡化:

    equalizeHist(srcGray, dstGray);
    

    srcGray为原始灰度图,dstGray为目标灰度图。

    11、threshold阈值操作

    函数定义为:

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

    src:源图像。
    dst:输出图像
    thresh:阈值
    maxval:dst图像中最大值。
    type:阈值类型,可以具体类型如下:

    THRESH_BINARY		//大于阈值的部分被置为255,小于部分被置为0。
    THRESH_BINARY_INV	//大于阈值部分被置为0,小于部分被置为255。
    THRESH_TRUNC		//大于阈值部分被置为threshold,小于部分保持原样。
    THRESH_TOZERO 		//小于阈值部分被置为0,大于部分保持不变。
    THRESH_TOZERO_INV 	//大于阈值部分被置为0,小于部分保持不变。
    THRESH_BINARY | THRESH_OTSU	//利用OTSU自适应阈值。
    

    可以通过如下函数进行阈值操作:

    threshold(srcGray, srcGray, 0, 255, THRESH_BINARY | THRESH_OTSU);
    //或者
    threshold(srcGray, srcGray, 50, 255, THRESH_BINARY);
    

    12、line直线绘画

    函数定义为:

    void line(InputOutputArray img, Point pt1, Point pt2, 
    	const Scalar& color,int thickness = 1, 
    	int lineType = LINE_8, int shift = 0)
    

    img:源图像。
    pt1:起点;
    pt2:终点
    color:颜色,
    thickness:线条粗细,
    LINE_8:线条类型
    可以通过如下函数进行直线绘画:

    line( img, start, end, Scalar( 0, 0, 0 ), thickness=2, lineType=8 );
    

    13、ellipse椭圆绘画:

    函数定义为:

    void ellipse(InputOutputArray img, 
    	Point center, Size axes, double angle, 
    	double startAngle, double endAngle,
    	const Scalar& color, int thickness = 1,
    	int lineType = LINE_8, int shift = 0)
    

    img:源图像。
    center:中心点;
    axes:大小
    angle:旋转角,
    startAngle, endAngle:起始角度和结束角度
    color:颜色
    thickness:线条粗细,
    LINE_8:线条类型
    可以通过如下函数进行椭圆绘画:

    Point center = Point(200,200);
    Point axes = Point(100,50);
    ellipse( img, center, axes, angle, 0, 360, Scalar( 255, 0, 0 ), 1); 
    

    14、circle圆绘画:

    函数定义为:

    void circle(InputOutputArray img, Point center, int radius,
    	const Scalar& color, int thickness = 1,
    	int lineType = LINE_8, int shift = 0)
    

    img:源图像。
    center:中心点;
    radius:半径
    color:颜色
    thickness:线条粗细,
    LINE_8:线条类型
    可以通过如下函数进行圆绘画:

    Point center = Point(200,200);
    int r = 6;
    circle( img, center, r, Scalar( 0, 0, 255 ), 1);
    

    15、rectangle矩形绘画:

    函数定义为:

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

    img:源图像。
    pt1:左上角的点;
    pt2:右下角的点
    color:颜色
    thickness:线条粗细,
    LINE_8:线条类型
    可以通过如下函数进行矩形绘画:

    rectangle( image, Point(0,0), Point(200,200), Scalar( 0, 255, 255 ),
    	thickness = -1, lineType = 8 );
    

    16、fillPoly多边形绘画:

    函数定义为:

    void fillPoly(Mat& img, const Point** pts, const int* npts, 
    	int ncontours, const Scalar& color, int lineType = LINE_8, 
    	int shift = 0, Point offset = Point())
    

    img:源图像。
    pts:顶点数组;
    npts:顶点个数数组
    ncontours:几个多边形
    color:颜色
    thickness:线条粗细,
    LINE_8:线条类型
    第二个参数可通过如下定义:

    Point rookPoints[1][20];rookPoint[0][0]=Point(1,1);....
               const Point* ppt[1]={rookPoints[0]};
    int npt[]={20};
    

    可以通过如下函数进行矩形绘画:

    fillPoly( img,ppt,npt,1,Scalar( 255, 255, 255 ),1);
    

    天道酬勤 循序渐进 技压群雄
  • 相关阅读:
    P4097 [HEOI2013]Segment(李超线段树模板)
    P2155 [SDOI2008]沙拉公主的困惑
    BZOJ3675 [Apio2014]序列分割[斜率优化dp]
    hdu4261 Estimation[暴力dp+对顶堆]
    poj2374 Fence Obstacle Course[线段树+DP]
    poj1463 Strategic game[树形DP]
    CH5E02 [IOI1999]花店橱窗[暴力dp]
    CH5E01[NOIP2010] 乌龟棋[暴力]
    CH5702 Count The Repetitions[倍增dp]
    P1081 [NOIP2012]开车旅行[倍增]
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/15681732.html
Copyright © 2011-2022 走看看