前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV Mat与UIImage之间的转换

OpenCV Mat与UIImage之间的转换

作者头像
一棹烟波
发布2019-05-25 15:57:58
1.4K0
发布2019-05-25 15:57:58
举报
文章被收录于专栏:一棹烟波一棹烟波

  UIImage 转 OpenCV cvMat:

代码语言:javascript
复制
 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 : 

代码语言:javascript
复制
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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档