Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何将图像转换为灰色_Opencv_Xcode4.5 - Fatal编程技术网

Opencv 如何将图像转换为灰色

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

我是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 *)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