前のチュートリアル: 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;
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;
}
Comma-separated Matrix Initializer.
Definition mat.hpp:964
#define CV_8UC4
Definition interface.h:80
- (
cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
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
Definition interface.h:77
処理が終わったら、UIImageに戻す必要がある。以下のコードはグレースケール画像とカラー画像の両方の変換に対応している(if 文内のチャンネル数で判定する)。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
Converts an image from one color space to another.
処理が終わったら、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);
CGImageRef imageRef = CGImageCreate(cvMat.cols,
cvMat.rows,
8,
8 * cvMat.elemSize(),
cvMat.step[0],
colorSpace,
kCGImageAlphaNone|kCGBitmapByteOrderDefault,
provider,
NULL,
false,
kCGRenderingIntentDefault
);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
出力
さらに多くの画像エフェクトを使って実際にコードを動かした例は YouTube で確認できる。