美文网首页
OpenCV3-基本数据结构

OpenCV3-基本数据结构

作者: AlanGe | 来源:发表于2020-06-29 23:31 被阅读0次

    先来三个案例:

    案例一:图片腐蚀效果

    main.cpp
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, const char * argv[]) {
    
        //第一步:加载图片
        Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
    
        if( mat_image_src.empty() ){
            cout <<  "打不开或者没有该图片" << std::endl;
            return -1;
        }
    
        //第二步:进行腐蚀操作
        //参数一:腐蚀类型->矩形方式
        //参数二:腐蚀大小->范围(腐蚀单位大小)->腐蚀程度大小
        Mat mat_element = getStructuringElement(MORPH_RECT, Size(20, 20));
        //开始腐蚀
        Mat mat_image_dst;
        //参数一:原始图片
        //参数二:腐蚀之后的图片
        //参数三:腐蚀范围
        erode(mat_image_src, mat_image_dst, mat_element);
    
        //第三步:显示图片
        imshow("图片腐蚀", mat_image_dst);
        waitKey();
        return 0;
    }
    

    案例二:图片模糊效果

    main.cpp
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, const char * argv[]) {
    
        //第一步:加载图片
        Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
    
        if( mat_image_src.empty() ){
            cout <<  "打不开或者没有该图片" << std::endl;
            return -1;
        }
    
        Mat mat_image_dst;
        blur(mat_image_src, mat_image_dst, Size(20, 20));
    
        //第三步:显示图片
        imshow("图片模糊", mat_image_dst);
        waitKey();
        return 0;
    }
    

    案例三:图片边缘检测

    main.cpp
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, const char * argv[]) {
    
        //第一步:加载图片
        Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
        if( mat_image_src.empty() ){
            cout <<  "打不开或者没有该图片" << std::endl;
            return -1;
        }
        //创建和mat_image_src同样大小的OpenCV图片(Mat)
        Mat mat_image_dst;
        mat_image_dst.create(mat_image_src.size(), mat_image_src.type());
    
        //将图片进行灰度处理
        Mat mat_image_gray;
        cvtColor(mat_image_src, mat_image_gray, COLOR_BGR2GRAY);
    
        //使用3*3内核来降噪处理
        Mat mat_image_edge;
        blur(mat_image_gray, mat_image_edge, Size(3, 3));
    
        //进行Canny算子处理
        Canny(mat_image_edge, mat_image_edge, 3, 9, 3);
    
        //第三步:显示图片
        imshow("边缘检测", mat_image_edge);
        waitKey();
        return 0;
    }
    

    OpenCV基本数据结构

    1、学习OpenCV基本结构->Mat结构

    1、我们可以简单认为Mat是OpenCV中的图片
    2、矩阵数据结构
    3、Mat同时是一个C++类

    2、总结一下->Mat结构->创建方式有哪些?

    方式一:创建Mat->构造方法创建

    1、Mat mat_image_dst(mat_image_src.rows, mat_image_src.cols, CV_8UC3);
    2、Mat mat_image_dst(Size(mat_image_src.rows, mat_image_src.cols), CV_8UC3);
    3、Mat mat_image_dst(200, 200, CV_8UC3, Scalar(255, 0, 0));
    4、Mat mat_image_dst(Size(300, 300), CV_8UC3, Scalar(255, 0, 0));
    5、Mat mat_image_dst(mat_image_src);
    6、Mat mat_image_dst(mat_image_src, Rect(0, 0, 100, 100));
    ……  
    

    方式二:创建Mat->create成员函数(方法)

    代码如下
    Mat mat(100, 100, CV_8UC3, Scalar(0, 0, 255));
    mat.create(50, 50, CV_8UC(3));
    分析代码
    运行结果:发现一片漆黑,没有任何颜色(存在问题)
    注意事项:这个create函数起始不能够为Mat矩阵设置初始值,但是可以在尺寸发生改变的时候重新为矩形数据开辟内存空间
    

    方式三:创建Mat->Matlab初始化(库)

    代码如下
    Mat mat = Mat::eye(100, 100, CV_64F);
    Mat mat = Mat::ones(100, 100, CV_64F);
    Mat mat = Mat::zeros(100, 100, CV_64F);
    
    分析代码
    eye:表示缩放操作
    ones:表示任何一个数组然后初始化Mat
    zeros:表示用这个函数可以创建一个作为参数的一个矩阵初始化器->初始化器(默认值:0)
    

    方式四:对小Mat矩阵通过都好分隔符方式初始化(直接赋值方式)

    代码如下
    Mat mat = (Mat_<int>(2, 2) << 0, 3, -1, 0);
    

    方式五:通过clone函数和copyTo函数作为一个已经存在Mat对象,创建一个新的Mat对象
    代码如下

    Mat mat_image_clone = mat_image_src.clone();
    Mat mat_image_clone;
    mat_image_src.copyTo(mat_image_clone);
    ……
    

    3、OpenCV开发中->常用数据结构

    3.1 第一个->Point类->表示点

    第一种:二维点
    
        Point2f p2f(100, 100);
    
    第二种:三维点
    
        Point3f p3f(100, 100, 100);
    

    3.2 第二个->Scalar类->常用于表示颜色RGB值,就是三个参数

    代码如下
    
            Scalar(0, 0, 255);
    
        分析代码
    
            参数一:蓝色->B
    
            参数二:绿色->G
    
            参数三:红色->R
    
    扩展知识
      Scalar祖宗是Matx
      Matx设计目的:用于存储小图片(像素点->RGB、BGR)->小矩阵(轻量级Mat)
      做OpenCV开发将Mat->Matx,Matx->Mat
    

    3.3 第三个->Size类->表示尺寸大小(说白了:表示图片大小)

    Size(100, 100);
    

    3.4 第四个->Rect类->矩形类型(长方形、正方形等等…)

    Mat表示矩阵
    
            Rect rect(0, 0, 100, 100);
    
    常用函数
    
            rect.size()->返回矩形宽高(区域)
    
            rect.area()->返回矩形面积->width * height
    
            rect.contains()->判断某个点是否在矩形范围之内
    
            rect.tl()->返回左上角点的坐标
    
            rect.br()->返回右下角点的坐标
    
            rect1 & rect2 ->表示两个矩形交集
    
            rect1 | rect2 ->表示两个矩形并集
    
            rect + Point(50, 50)->表示矩形平移操作
    
            rect + Size(50, 50)->表示矩形缩放操作
    
            ……
    

    4、Vec类?->核心->存储像素点

    Matx:是轻量级Mat类(专门用于存储小图片->小内存)
    
    Vec本身是一个模版类(泛型类:定义的时候是没有类型的,需要客户端动态指定类型)
    
    typedef Vec<uchar, 2> Vec2b;
    
        类型:uchar类型(无符号char类型)
    
        个数(元素个数):2个
    
    typedef Vec<uchar, 3> Vec3b;->RGB像素点存储
    
        类型:uchar类型(无符号char类型)
    
        个数(元素个数):3个
    
    typedef Vec<uchar, 4> Vec4b;->ARGB像素点存储
    
        类型:uchar类型(无符号char类型)
    
        个数(元素个数):4个
    
    一个像素点:->搞了Mat类
    
    总结:源码里面Vec类->开辟了一块内存空间(数组,大小一开始就会指定)
    

    5、Range类->范围大小

    OpenCV开发->常用函数

    1、第一个函数->cvtColor函数->颜色空间转换?

    类型之间转换
    
    RGB和BGR区别->内存存储顺序问题(不一样)
    

    2、ellipse函数?

    写一个案例->加深理解->绘制一个椭圆
    
    绘制集合图像:圆、椭圆等等…
    
    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace cv;
    using namespace std;
    
    #define WINDOWS_WIDTH 240
    
    //绘制椭圆
    void drawEllipse(Mat &mat_image, double angle){
        //参数一:图片(画板)
        //参数二:中心点
        //参数三:轴大小(主轴大小)->半径
        //参数四:旋转角度
        //参数五:起始角度
        //参数六:结束角度
        //参数七:椭圆颜色
        //参数八:类型(如果小于表示实心圆、如果大于等于0表示空心圆)
        //如果这个大于0的,那么椭圆外围线大小
        ellipse(mat_image,
                Point2i(WINDOWS_WIDTH/2, WINDOWS_WIDTH/2),
                Size2i(WINDOWS_WIDTH/4, WINDOWS_WIDTH/16),
                angle,
                0,
                360,
                Scalar(0, 0, 255),
                -1);
    }
    
    int main(int argc, const char * argv[]) {
    
        //第一步:创建一张图片->空白图片
        Mat mat_image = Mat::zeros(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3);
    //    Mat mat_image(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3, Scalar(255, 255, 255));
    
        //第二步:给我们的图绘制集合图形 -- 绘制椭圆
        drawEllipse(mat_image, 0);
    
        //第三步:显示图片
        namedWindow("图片");
        imshow("图片", mat_image);
        waitKey();
        return 0;
    }
    

    3、circle函数?

    写一个案例->加深理解
    
    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace cv;
    using namespace std;
    
    #define WINDOWS_WIDTH 240
    
    // 绘制圆
    void drawCircle(Mat &mat_image, Point2i center){
        //参数一:图片(画板)
        //参数二:中心点
        //参数三:半径
        //参数四:圆的颜色
        //参数五:类型(如果小于表示实心圆、如果大于等于0表示空心圆)
        //如果这个大于0的,那么圆外围线大小
        circle(mat_image, center, WINDOWS_WIDTH / 4, Scalar(0, 0, 255), 5);
    }
    
    int main(int argc, const char * argv[]) {
    
        //第一步:创建一张图片->空白图片
        Mat mat_image = Mat::zeros(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3);
    //    Mat mat_image(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3, Scalar(255, 255, 255));
        
        //第二步:绘制圆
        drawCircle(mat_image, Point2i(WINDOWS_WIDTH / 2, WINDOWS_WIDTH / 2));
    
        //第三步:显示图片
        namedWindow("图片");
        imshow("图片", mat_image);
        waitKey();
        return 0;
    }
    

    …很多函数->后面继续学习

    相关文章

      网友评论

          本文标题:OpenCV3-基本数据结构

          本文链接:https://www.haomeiwen.com/subject/nirzfktx.html