OpenCV 4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
OpenCV iOS - 图像处理

上一个教程: OpenCV iOS Hello
下一个教程: OpenCV iOS - 视频处理

原创作者Charu Hans
兼容性OpenCV >=3.0

目标

在本教程中,我们将学习如何在 iOS 中使用 OpenCV 进行基本的图像处理。

简介

OpenCV 中,所有图像处理操作通常都在 Mat 结构上执行。但在 iOS 中,要在屏幕上呈现图像,其必须是 UIImage 类的实例。为了将 OpenCV Mat 转换成 UIImage,我们使用 iOS 中可用的 Core Graphics 框架。以下是在 Mat 和 UIImage 之间进行转换所需的代码。

- (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 每分量 8 位,4 个通道(颜色通道 + alpha)
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // 指针指向数据
cols, // 位图宽度
rows, // 位图高度
8, // 每分量位数
cvMat.step[0], // 每行字节数
colorSpace, // 颜色空间
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // 位图信息标志
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
n 维密集阵类
定义 mat.hpp:812
#define CV_8UC4
定义 interface.h:91
与磁盘上的文件关联的文件存储的“黑匣子”表示形式。
定义 core.hpp:102
- (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC1); // 每分量 8 位,1 个通道
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // 指针指向数据
cols, // 位图宽度
rows, // 位图高度
8, // 每分量位数
cvMat.step[0], // 每行字节数
colorSpace, // 颜色空间
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // 位图信息标志
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
#define CV_8UC1
定义 interface.h:88

处理后,我们需要将其转换回 UIImage。以下代码可以处理灰度和彩色图像转换(由 if 语句中的通道数量决定)。

cv::Mat greyMat;
cv::cvtColor(inputMat, greyMat, COLOR_BGR2GRAY);
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
将图像从一种颜色空间转换为另一种颜色空间。

处理后,我们需要将其转换回 UIImage。

-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// 从 cv::Mat 创建 CGImage
CGImageRef imageRef = CGImageCreate(cvMat.cols, //宽度
cvMat.rows, //高度
8, //每种组件的位数
8 * cvMat.elemSize(), //每像素的位数
cvMat.step[0], //每行的字节数
colorSpace, //颜色空间
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// 位图信息
provider, //CGDataProviderRef
NULL, //解码
false, //是否内插
kCGRenderingIntentDefault //意图
);
// 从 CGImage 获取 UIImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}

输出

YouTube 上查看一个运行代码的实例,其中包含更多图像效果。