OpenCV 4.12.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:830
#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], //bytesPerRow
colorSpace, //颜色空间
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// 位图信息
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// 从 CGImage 获取 UIImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}

输出

YouTube 上查看更多图像效果的运行代码实例。