OpenCV3-基本数据结构

先来三个案例:

案例一:图片腐蚀效果

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;
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355