2017-07-19 149 views
2

我想将一个UIImage转换为cv :: Mat,这样我就可以在其上使用LineIterator OpenCV类。我在这里使用opencv文档提供的代码,特别是在该页面上找到的cvMatGrayFromUIImage。我在我写的函数中使用了这段代码,然后在我的swift文件中调用它。但是,当我尝试打印cv :: Mat图像时,数组中的数字不能准确反映输入图像的灰度。我把数组放到Matlab中,调用imagesc函数来查看它是否确实是灰度。在OpenCV中将UIImage转换为cv :: Mat问题

这里是我用我的OpenCVWrapper.mm

-(void) getPixelIntensity: (UIImage *)image 
{ 

    //Transform UIImage to cv::Mat 
    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); 

//Print image matrix 
cout << cvMat; 
} 

然后在我的Viewcontroller.swift代码

我这样调用

import UIKit 

class ViewController: UIViewController{ 

    //MARK: Properties 
    @IBOutlet weak var photoImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func getCoordinates(_ sender: UIButton) { 
let opencvwrapper = OpenCVWrapper() 
opencvwrapper.getPixelIntensity(photoImageView.image) 
     } 
} 

回答

3

OpenCV的功能提供了一些功能它允许你将UIImage转换为cv :: Mat,反之亦然。
导入你的包装头的库:

#import <opencv2/imgcodecs/ios.h> 


2.您现在可以使用此功能:

UIImageToMat(uiImage, imageMat); 
UIImage* img = MatToUIImage(imageMat);