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)
网友评论