Opencv 如何将图像转换为灰色
我是OpenCV的新手。我在图像转换方面有一些问题。我创建了一个新项目。它还有两个文件Wrapper.h/mm和UIImage+OpenCV.h/.mm。下面是代码:Opencv 如何将图像转换为灰色,opencv,xcode4.5,Opencv,Xcode4.5,我是OpenCV的新手。我在图像转换方面有一些问题。我创建了一个新项目。它还有两个文件Wrapper.h/mm和UIImage+OpenCV.h/.mm。下面是代码: //UIImage+OpenCV.h #import <UIKit/UIKit.h> @interface UIImage (OpenCV) //cv::Mat to UIImage + (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat; + (UIImage
//UIImage+OpenCV.h
#import <UIKit/UIKit.h>
@interface UIImage (OpenCV)
//cv::Mat to UIImage
+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat;
+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
orientation:(UIImageOrientation)orientation;
- (id)initWithCVMat:(const cv::Mat&)cvMat
orientation:(UIImageOrientation)orientation;
//UIImage to cv::Mat
- (cv::Mat)CVMat;
- (cv::Mat)CVMat3; // no alpha channel
- (cv::Mat)CVGrayscaleMat;
@end
//UIImage+OpenCV.mm
#import "UIImage+OpenCV.h"
@implementation UIImage (OpenCV)
-(cv::Mat)CVMat
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 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), self.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
- (cv::Mat)CVMat3
{
cv::Mat result = [self CVMat];
cv::cvtColor(result , result , CV_RGBA2RGB);
return result;
}
-(cv::Mat)CVGrayscaleMat
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat cols = self.size.width;
CGFloat rows = self.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
kCGImageAlphaNone |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
{
return [[UIImage alloc] initWithCVMat:cvMat];
}
- (id)initWithCVMat:(const 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
self = [self initWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return self;
}
@end
//UIImage+OpenCV.h
#进口
@接口UIImage(OpenCV)
//cv::Mat到UIImage
+(UIImage*)带有cvMat的图像:(常数cv::Mat&)cvMat;
+(UIImage*)带有cvMat的图像:(常数cv::Mat&)cvMat
取向:(UIImageOrientation)取向;
-(id)initWithCVMat:(常数cv::Mat&)cvMat
取向:(UIImageOrientation)取向;
//UIImage到cv::Mat
-(cv::Mat)CVMat;
-(cv::Mat)CVMat3;//无阿尔法通道
-(cv::Mat)CVGrayscaleMat;
@结束
//UIImage+OpenCV.mm
#导入“UIImage+OpenCV.h”
@实现UIImage(OpenCV)
-(cv::Mat)CVMat
{
CGColorSpaceRef colorSpace=CGImageGetColorSpace(self.CGImage);
CGFloat cols=self.size.width;
CGFloat行=self.size.height;
cv::Mat cvMat(行、列、cv_8UC4);//每个组件8位,4个通道
CGContextRef contextRef=CGBitmapContextCreate(cvMat.data,//指向数据的指针
cols,//位图的宽度
行,//位图的高度
8,//每个组件的位
cvMat.step[0],//每行字节数
colorSpace,//colorSpace
kCGImageAlphaNoneSkipLast|
kCGBitmapByteOrderDefault);//位图信息标志
CGContextDrawImage(contextRef,CGRectMake(0,0,cols,rows),self.CGImage);
CGContextRelease(contextRef);
返回cvMat;
}
-(cv::Mat)CVMat3
{
cv::Mat结果=[自CVMat];
cv::cvtColor(结果,结果,cv_RGBA2RGB);
返回结果;
}
-(cv::Mat)CVGrayscaleMat
{
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceGray();
CGFloat cols=self.size.width;
CGFloat行=self.size.height;
cv::Mat cvMat(行、列、cv_8UC1);//每个组件8位,1个通道
CGContextRef contextRef=CGBitmapContextCreate(cvMat.data,//指向数据的指针
cols,//位图的宽度
行,//位图的高度
8,//每个组件的位
cvMat.step[0],//每行字节数
colorSpace,//colorSpace
KCGIMAGEALPHONE|
kCGBitmapByteOrderDefault);//位图信息标志
CGContextDrawImage(contextRef,CGRectMake(0,0,cols,rows),self.CGImage);
CGContextRelease(contextRef);
CGCOLORSPACTERELEASE(色彩空间);
返回cvMat;
}
+(UIImage*)带有cvMat的图像:(常数cv::Mat&)cvMat
{
返回[[UIImage alloc]initWithCVMat:cvMat];
}
-(id)initWithCVMat:(常数cv::Mat&)cvMat
{
NSData*data=[NSData dataWithBytes:cvMat.data长度:cvMat.elemSize()*cvMat.total()];
CGCOLORSPACTEREF色彩空间;
if(cvMat.elemSize()==1){
colorSpace=CGColorSpaceCreateDeviceGray();
}否则{
colorSpace=CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider=CGDataProviderCreateWithCFData((_桥CFDataRef)数据);
//从cv::Mat创建CGImage
CGImageRef imageRef=CGImageCreate(cvMat.cols,//宽度
cvMat.rows,//高度
8,//每个组件的位
8*cvMat.elemSize(),//位/像素
cvMat.step[0],//bytesPerRow
colorSpace,//colorSpace
KCGIMAGEALPHONE | kCGBitmapByteOrderDefault,//位图信息
提供程序,//CGDataProviderRef
NULL,//解码
false,//应插入
kCGrenderingentDefault//intent
);
//从CGImage获取UIImage
self=[self initWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(提供程序);
CGCOLORSPACTERELEASE(色彩空间);
回归自我;
}
@结束
上面是我的代码
//Wrapper.h
#进口
@接口:NSObject
+(UIImage*)返回PIC:(UIImage*)图像;
@结束
//包装纸
#导入“CVWrapper.h”
#导入“UIImage+OpenCV.h”
@CVWrapper的实现
+(UIImage*)返回图片:(UIImage*)图片
{
UIImage*结果=零;
如果(图像)
{
cv::Mat matImage=[image CVMat];
cv::Mat greyMat;//它不工作
cv::cvtColor(matImage,greyMat,7);//它不工作。在imgproc.hpp COLOR的枚举中\u RGB2GRAY=7
结果=[UIImage imageWithCVMat:greyMat];
}
返回结果;
}
@结束
在ViewController中,我调用显示图像的函数。我试图理解一个基本概念。如何将图片转换为灰色?我该在哪里做呢?我不知道为什么你的代码不起作用,但你已经有了
cv::cvtColor()
函数,它应该可以工作。文科硕士
//Wrapper.h
#import <Foundation/Foundation.h>
@interface CVWrapper : NSObject
+(UIImage*) returnPic: (UIImage*)image;
@end
//Wrapper.mm
#import "CVWrapper.h"
#import "UIImage+OpenCV.h"
@implementation CVWrapper
+(UIImage*)returnPic:(UIImage *)image
{
UIImage *result = nil;
if (image)
{
cv::Mat matImage = [image CVMat];
cv::Mat greyMat; //It doesn't' work
cv::cvtColor(matImage, greyMat, 7); //It doesn't work. In enum of imgproc.hpp COLOR_RGB2GRAY=7
result = [UIImage imageWithCVMat:greyMat];
}
return result;
}
@end