OpenCV 数据结构(二)

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)

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

推荐阅读更多精彩内容