OpenCV 4.11.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:829
#define CV_8UC4
定义 interface.h:91
定义 core.hpp:107
- (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, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
将图像从一种颜色空间转换为另一种颜色空间。

处理完成后,我们需要将其转换回 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 上查看包含更多图像效果的运行代码示例。