UIImage 转 OpenCV cvMat:
1 - (cv::Mat)cvMatWithImage:(UIImage *)image
2 {
3 CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
4 CGFloat cols = image.size.width;
5 CGFloat rows = image.size.height;
6
7 cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
8
9 CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
10 cols, // Width of bitmap
11 rows, // Height of bitmap
12 8, // Bits per component
13 cvMat.step[0], // Bytes per row
14 colorSpace, // Colorspace
15 kCGImageAlphaNoneSkipLast |
16 kCGBitmapByteOrderDefault); // Bitmap info flags
17
18 CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
19 CGContextRelease(contextRef);
20
21 return cvMat;
22 }
OpenCV cvMat 转 UIImage :
24 - (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat {
25 NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
26
27 CGColorSpaceRef colorSpace;
28 CGBitmapInfo bitmapInfo;
29
30 if (cvMat.elemSize() == 1) {
31 colorSpace = CGColorSpaceCreateDeviceGray();
32 bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
33 } else {
34 colorSpace = CGColorSpaceCreateDeviceRGB();
35 bitmapInfo = kCGBitmapByteOrder32Little | (
36 cvMat.elemSize() == 3? kCGImageAlphaNone : kCGImageAlphaNoneSkipFirst
37 );
38 }
39
40 CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
41
42 // Creating CGImage from cv::Mat
43 CGImageRef imageRef = CGImageCreate(
44 cvMat.cols, //width
45 cvMat.rows, //height
46 8, //bits per component
47 8 * cvMat.elemSize(), //bits per pixel
48 cvMat.step[0], //bytesPerRow
49 colorSpace, //colorspace
50 bitmapInfo, // bitmap info
51 provider, //CGDataProviderRef
52 NULL, //decode
53 false, //should interpolate
54 kCGRenderingIntentDefault //intent
55 );
56
57 // Getting UIImage from CGImage
58 UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
59 CGImageRelease(imageRef);
60 CGDataProviderRelease(provider);
61 CGColorSpaceRelease(colorSpace);
62
63 return finalImage;
64 }