美文网首页
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