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 上檢視更多影像效果的執行程式碼例項。