ios opencv图片处理_OpenCV iOS-图像处理

目标

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

介绍

在OpenCV中,所有的图像处理操作通常在Mat结构上进行。然而,在iOS中,为了在屏幕上呈现图像,它必须是UIImage类的一个实例。要将转换的OpenCV垫成的UIImage我们使用的核芯显卡在iOS中使用框架。以下是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 bits per component, 4 channels (color channels + alpha)

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data

cols, // Width of bitmap

rows, // Height of bitmap

8, // Bits per component

cvMat.step[0], // Bytes per row

colorSpace, // Colorspace

kCGImageAlphaNoneSkipLast |

kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);

CGContextRelease(contextRef);

return cvMat;

}- (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 bits per component, 1 channels

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data

cols, // Width of bitmap

rows, // Height of bitmap

8, // Bits per component

cvMat.step[0], // Bytes per row

colorSpace, // Colorspace

kCGImageAlphaNoneSkipLast |

kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);

CGContextRelease(contextRef);

return cvMat;

}

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

cv::cvtColor(inputMat, greyMat, COLOR_BGR2GRAY);

处理后,我们需要将其转换回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);

// Creating CGImage from cv::Mat

CGImageRef imageRef = CGImageCreate(cvMat.cols, //width

cvMat.rows, //height

8, //bits per component

8 * cvMat.elemSize(), //bits per pixel

cvMat.step[0], //bytesPerRow

colorSpace, //colorspace

kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info

provider, //CGDataProviderRef

NULL, //decode

false, //should interpolate

kCGRenderingIntentDefault //intent

);

// Getting UIImage from CGImage

UIImage *finalImage = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

CGDataProviderRelease(provider);

CGColorSpaceRelease(colorSpace);

return finalImage;

}

Output

你可能感兴趣的:(ios,opencv图片处理)