美文网首页OpenCV for Object-c
OpenCV 数据结构(二)

OpenCV 数据结构(二)

作者: 做设计的iOS开发 | 来源:发表于2018-06-25 22:04 被阅读0次

CV::Mat

Mat类 (Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类,其功能十分强大,rows和cols参数代表图像的2维矩阵的行数 列数

初始化方法

openCV 提供了很多初始化方法

在iOS 中通过 UIImage 初始化

   UIImage*inputImage = [UIImage imageNamed:@"XXX"];

    Mat imageSrc;

    UIImageToMat(inputImage, imageSrc);

/*

Mat(int _rows, int _cols, int _type, const cv::Scalar &_s)

第一个参数 列

第二个参数 行

第二个参数 图片类型

第四个参数 颜色

 */

Mat imagesrc(100,100,CV_8UC3,Scalar(r,g,b));

图片的复制

图片的复制可以通过两个函数来完成 分别是  clone()   copyTo  

clone是完全深考贝,即重新开辟内存

copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝

图片的转换

目前 openCV 主要只支持处理单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。 如果Mat类型数据的深度和通道数不满足上面的要求则需要使用convertTo()函数和cvtColor()函数来进行转换。 

convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。 

而cvtColor()函数是负责转换不同通道的Mat

注意:  有很多时候发现引进来的图片处理了,无效果,其实就是因为 openCV 主要只支持处理单通道和3通道的图像,我们常引用的是ARGB类型的图片 一定要转成RGB 3通道才能处理


示例

 UIImage *inputImage = [UIImage imageNamed:@"XXX"];    

//转换成 Mat    

Mat   imageSrc;    

UIImageToMat(inputImage, imageSrc);         

// convertTo 转换成 3通道    

Mat   imageSrc_dst1;    

imageSrc.convertTo(imageSrc_dst1, CV_8UC3);         

//cvtColor 转换      

Mat imageSrc_dst2;    

cvtColor(imageSrc, imageSrc_dst2, CV_RGB2BGR,3);     



Mat::at

  cv::Mat的成员函数: .at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型,这是因为 cv::Mat可以存放任意数据类型的元素。因此at方法的实现是用模板函数来实现的。示例是获取一张CV_8UC3(3通道) 图片的中心点的像素点的RGB值(注意RGB的排列也是有顺序的)

  //创建一张图片

    Mat imagesrc(100,100,CV_8UC3,Scalar(255,0,0));

    int row =50;

    int col =50;

    //图片上的像素点

    imagesrc.at(row,col);

    //

    imagesrc.at(row,col)[0];//B的值

    imagesrc.at(row,col)[1];//G的值

    imagesrc.at(row,col)[2];//R的值

CV_8UC1   CV_8UC3   CV_8UC4

 CV_8     bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧- 如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite

   S   代表---signed int---有符号整形

   U   代表--unsigned int--无符号整形

   F    代表--float---------单精度浮点型

   3C  代表一张图片的通道数,比如:

        C1   灰度图片(单通道图像)

        C3  RGB彩色图像,(3通道图像)

        C4  带Alph通道的RGB图像(4通道图像)

Scalar 

在openCV中表示颜色 

示例  Scalar(B,G,R)  这边要注意顺序 是BGR

Point 

 表示了由其图像坐标 X 和 Y指定的2D点

Point_<int>    就是Point2i, 

Point_<float> 就是Point2f,

Point_<double>就是Point2d。

Size 

表示图像的width height

Size_<int>    就是Size2i,也是Size

Size_<float> 就是Size2f。

Rect

表示图像的 x、y、width、height,分别为左上角点的坐标和矩形的宽和高

关于 Rect 操作示例

    int x =0;

    int y =0;

    int w =100;

    int h =100;

    Rect2i rect =Rect2i(x,y,w,h);

    //size

    rect.size();

    //面积

    rect.area();

    //判断一个点是否在矩形内

    Point2i point(50,50);

    bool result = rect.contains(point);

    NSLog(@"----%d",result);

    //返回左上坐标的点

    Point2i topLeftPoint =rect.tl();

    //(cv::Point2i) topLeftPoint = (x = 0, y = 0)

    //返回右下角坐标的

    Point2i bottomRightPoint =rect.br();

    //(cv::Point2i) bottomRightPoint = (x = 100, y = 100)

    //两个矩形的交集

    Rect2i rect1 =Rect2i(0,0,100,100);

    Rect2i rect2 =Rect2i(50,50,100,100);

    Rect2i iRect = rect1 & rect2;

    //(cv::Rect2i) iRect = (x = 50, y = 50, width = 50, height = 50)

    //两个矩形的并集

    Rect2i asRect = rect1 | rect2;

    //(cv::Rect2i) asRect = (x = 0, y = 0, width = 150, height = 150)

    //矩形平移

    Point2i changePoint =Point2i(200,200);

    Rect2i  rect3 =Rect2i(0,0,100,100);

    Rect2i changePointRect = rect3+changePoint;

    //(cv::Rect2i) changeRect = (x = 200, y = 200, width = 100, height = 100)

    //矩形缩放

    Size2i changeSize =Size2i(300,300);

    Rect2i  rect4 =Rect2i(0,0,100,100);

    Rect2i changeSizeRect = rect4+changeSize;

    //(cv::Rect2i) changeSizeRect = (x = 0, y = 0, width = 400, height = 400)

相关文章

  • Opencv中数据结构Mat的相关属性

    搬运自本人 CSDN 博客:《Opencv中数据结构Mat的相关属性》 Opencv中数据结构Mat的相关属性 前...

  • OpenCV 数据结构(二)

    CV::Mat Mat类(Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类,其功能十分强大,ro...

  • OpenCV3-基本数据结构

    先来三个案例: 案例一:图片腐蚀效果 案例二:图片模糊效果 案例三:图片边缘检测 OpenCV基本数据结构 1、学...

  • OpenCV学习之路(二)——Mat对象

    早期的 OpenCV 中,使用 IplImage 和 CvMat 数据结构来表示图像。IplImage和 CvMa...

  • opencv库函数

    1,像素操作 2,opencv数据结构 CV_8U 0 8 16 24CV_8S 1 9 ...

  • 分水岭

    OpenCV学习(7) 分水岭算法(1) Opencv(二)—图像分割之分水岭算法! OpenCV---分水岭算法

  • Opencv的数据结构

    cv::Vec<>:长度最长不超过9。常用别名:cv::Vec{2,3,4,6}{b,w,s,i,f,d}。 b ...

  • 行人检测

    opencv︱opencv中实现行人检测:HOG+SVM(二) - 素质云笔记/Recorder... - CSDN博客

  • OpenCV算法学习笔记之几何变换

    此篇文章是OpenCV算法学习笔记的第二篇文章,之前的文章请看: OpenCV算法学习笔记之初识OpenCV 对于...

  • opencv4.3模块介绍

    1、oepncv4.3包含如下模块: 主要模块: core——核心功能模块,包含opencv的基本数据结构,动态数...

网友评论

    本文标题:OpenCV 数据结构(二)

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