OpenCV imread()在iOS上不返回任何图像数据
我正试图使用OpenCV的OpenCV imread()在iOS上不返回任何图像数据,ios,opencv,Ios,Opencv,我正试图使用OpenCV的imread()函数在cv::Mat中加载JPEG图像,但在iOS上失败(同样的代码在OS X上工作)。返回的矩阵已分配且有效,但为空(即不包含数据) 函数imread()和imwrite()是否在iOS下工作?iOS定义了自己的文件系统,我不相信imread()和imwrite()与之接口。您需要使用本机功能来加载和保存图像,但一旦获得指向图像数据的指针,就可以将其包装在cv::Mat中,然后在opencv中处理。为iOS编写您自己的cv_imread()、cv_im
imread()
函数在cv::Mat
中加载JPEG图像,但在iOS上失败(同样的代码在OS X上工作)。返回的矩阵已分配且有效,但为空(即不包含数据)
函数
imread()
和imwrite()
是否在iOS下工作?iOS定义了自己的文件系统,我不相信imread()和imwrite()与之接口。您需要使用本机功能来加载和保存图像,但一旦获得指向图像数据的指针,就可以将其包装在cv::Mat中,然后在opencv中处理。为iOS编写您自己的cv_imread()、cv_imwrite()函数应该不难。至少在您保存和加载正在运行的应用程序的文档目录时,它是有效的
//Creating Path to Documents-Directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"ocv%03d.BMP", picNum]];
const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];
const cv::string newPaths = (const cv::string)cPath;
//Save as Bitmap to Documents-Directory
cv::imwrite(newPaths, frame);
在从应用程序包加载图像时,这对我很有效
NSString *path = [[NSBundle mainBundle] pathForResource:@"pattern" ofType:@"bmp"];
const char * cpath = [path cStringUsingEncoding:NSUTF8StringEncoding];
Mat img_object = imread( cpath, CV_LOAD_IMAGE_GRAYSCALE );
不过,我只能让它与BMP一起使用,JPG和PNG在我的应用程序中暂时不起作用。这有一个本机函数
#import <opencv2/imgcodecs/ios.h>
// t and m are UIImage* instances.
// transparentImage and maskImage are destination Mat.
// true/false is alpha condition.
UIImageToMat(t, transparentImage, true);
UIImageToMat(m, maskImage, true);
#导入
//t和m是UIImage*实例。
//透明图像和maskImage是目的地图像。
//真/假是阿尔法条件。
UIImageToMat(t,透明图像,真);
UIImageToMat(m,maskImage,真);
尝试将压缩PNG文件-打包
设置更改为否
生成设置
png
压缩PNG文件更改为否
从PNG文件中删除文本元数据更改为否
谢谢你的提示。我得出了同样的结论,但我想确定这一点。你是吗?我使用本机iOS方法加载图像,效果很好。但在本例中,我试图在不同平台之间共享一些OpenCV代码……因此产生了一个问题。;-)我曾经尝试过在iOS上使用它们,但从未成功过。我从来没有看过imread()或imwrite()的内部,所以我不能说我确定没有办法让它们工作。如果他们这样做,我会感到震惊。希望有人能给你一个更明确的答案真的很有趣!我需要试试这个。谢谢。@MathieuGodart请随意接受这个答案,它会更好answer@Hammer你说得对。我想测试一下,但我现在没有时间…我想没有人能在5年内完成这项工作?谢谢!你真的需要将图像转换为.bmp,然后才能使用应用程序包中的imread读取它。这完全解决了我的问题!在我的项目中,jpg文件可以是
imread()
,但不能是png。更改这些设置后,可以读取png。