iOS 下使用 OpenCV 实现图像处理

来源:互联网 发布:淘宝怎么提高收藏宝贝 编辑:程序博客网 时间:2024/05/28 23:11



i iOS 下使用 OpenCV 实现图像处理

目的

在这个教程中我们将学习如何在 iOS 上用 OpenCV 实现基本的图像处理。

介绍

在 OpenCV 中所有的图像处理操作一般是基于 Mat 结构来进行的。而 iOS 上要在屏幕上显示图片用的是 UIImage 控件实现。为了将 OpenCV Mat 转成 UIImage 我们需要用到 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 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 语句中对 channles 的数量进行判断)

cv::Mat greyMat;cv::cvtColor(inputMat, greyMat, CV_BGR2GRAY);

After the processing we need to convert it back to 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; }

输出

header

更多的图像处理效果请看 YouTube .


0 0
原创粉丝点击