c++ OpenCV 示例到 iOS 代码和 UIImage
Posted
技术标签:
【中文标题】c++ OpenCV 示例到 iOS 代码和 UIImage【英文标题】:c++ OpenCV example to iOS code and UIImage 【发布时间】:2013-12-26 23:01:07 【问题描述】:我有一个关于 OpenCV 的问题。 我有一个 C++ 示例,我想将此示例移植到我的 ios 项目中。 我已经解决了所有编译器问题。 我需要转换这个 c++ 代码:
char* filename;
Mat input_image;
//Check if user specify image to process
if(argc >= 2 )
filename= argv[1];
//load image in gray level
input_image=imread(filename,1);
else
printf("Use:\n\t%s image\n",argv[0]);
return 0;
我有一个 UIImage 我想获得相应的 Mat input_image。
对应的代码是什么//load image in gray level
input_image=imread(filename,1);?
我试过了,但我有一些问题,我认为这不是对应于imread(filename,1);
的正确代码
- (cv::Mat)cvMatFromUIImage:(UIImage *)image
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
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);
return cvMat;
【问题讨论】:
【参考方案1】:您在问题中添加的 iOS 代码对于将 UIImage 转换为 Mat(不使其灰度)完全正确......
input_image=imread(filename,1);
上面这行代码是用来从文件名加载图片的(就是图片的路径),1是用来做灰度的,
因此,从文件名加载图像,在 ios 中我们将其用作:
UIImage *image=[UIImage imagenamed:@"Hello.png"];
并将此图像传递给您的方法将完成您的工作,现在用于制作灰度 Mat,在您的代码中进行以下更改:
替换以下行:
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
cv::Mat cvMat(rows, cols, CV_8UC4);
有
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1);
并在末尾添加这一行
CGColorSpaceRelease(colorSpace);
【讨论】:
以上是关于c++ OpenCV 示例到 iOS 代码和 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
是否有使用 opencv 和 travis ci 的 c++ 示例项目?
简单的 C++ OpenCV imshow 示例因分段错误而崩溃