美文网首页OpenCv程序员iOS开发
OpenCV写入图像文件到iOS设备沙盒

OpenCV写入图像文件到iOS设备沙盒

作者: 无忌不悔 | 来源:发表于2017-10-26 19:22 被阅读83次

今天遇到一个OpenCV的坑,其本身不是OpenCV造成的,而是是伟大的苹果,以及其封闭的系统。这个坑使得存储图像文件的过程多费周章,曲折难解。

在OpenCV中,写入图像文件,只需要用imwrite函数:

cv::imwrite(imageName, img);

在Android系统中,在获取相册存储权限的条件下,以上方法即可很容易地将img对象中的图像文件存储到系统相册中,无需做过多处理。

然而,在iOS系统中,只传入imageNamecv::Matimg是无任何作用的,该方法执行成功,却不见效果。而将cv::Mat转化成UIImage类型,再存储到沙盒中的方式也不失为比较好的方法,但缺点是它会导致一些意想不到的问题。

在我的实践中,问题如下:

  • 图片所占存储空间变小(原图为3+MB,只做读取并转化成UIImage后仅500+K)
  • 颜色错误,原本红色的实木家具变成了棕色,浅黄色的地板变成了蓝色(不知其然,所用cv::Mat --> UIImage方法为OpenCV官方文档中方法)

经过一下午的问题排查,终寻求方法将原图像文件无差别写入iOS设备沙盒中,实现过程:

bool writeImage2Document(const char *imageName, cv::Mat img) {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/%s", imageName]];
    const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];
    
    const cv::String newPaths = (const cv::String)cPath;
    
    //Save as Bitmap to Documents-Directory
    cv::imwrite(newPaths, img);
    return true;
}

这里的路径经过三次转化,才得到imwrite函数在iOS系统中有用的参数,实在令人汗颜,其中NSMacOSRomanStringEncoding就是用MacOS的特殊编码方式对路径进行编码,再强转为cv::String才能作为有效的参数,至于为什么这么转来转去,谁知道呢!

今日记录于此,留与后人吐槽!

相关文章

  • OpenCV写入图像文件到iOS设备沙盒

    今天遇到一个OpenCV的坑,其本身不是OpenCV造成的,而是是伟大的苹果,以及其封闭的系统。这个坑使得存储图像...

  • iOS数据持久化方案

    在介绍存储方案之前有必要说下沙盒机制,详见:iOS中的沙盒目录 数据持久化,其实就是将数据写入到硬盘的方式,使得A...

  • ios开发纪要

    一、ios沙盒机制 应用间数据不能共享,不能访问其他沙盒内的数据,不能把数据写入到其他沙盒中,安全,app间访问使...

  • 学习笔记-应用的沙盒

    在iOS设备中,APP的数据存储采用了SandBox(沙盒)机制。 应用的沙盒 目录结构 每个iOS应用都有自己应...

  • 在应用和扩展间共享数据 - App Groups

    对 iOS 开发者来说,沙盒限制了我们在设备上随意读取和写入。但是对于应用和其对应的扩展来说,Apple 在 iO...

  • 沙盒

    沙盒 简单对象写入文件 NSFileManager 文件管理者 复杂对象写入沙盒

  • iOS-沙盒详尽

    write主要用于往磁盘目录下写入文件。本篇借write操作也详尽整理一下设备的沙盒目录记忆沙盒目录的操作方法。沙...

  • iOS 系统相关复习

    沙盒 iOS沙盒详细介绍iOS沙盒篇 沙盒机制介绍 iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个...

  • iOS 沙盒文件增删

    图片 写入 沙盒 删除沙盒里的文件 向沙盒里 写入文件夹,并向文件夹里 写入东西 得到沙盒文件夹 下的所有文件 来...

  • 数据存储(一)

    数据持久化的本质其实就是:将数据写入文件保存起来。 关于沙盒 出于安全方面的考虑,iOS系统的沙盒机制规定每个应用...

网友评论

  • 罗大满:谢谢分享。标题写错了:“OpenVC”^_^
    无忌不悔:@罗大满 谢谢提醒~
    无忌不悔:@罗大满 哈哈 傻了:smile:
  • 何赛雷:老哥,苹果是rgb,opencv是bgr,不会就多上网查查
    无忌不悔:@何赛雷 多谢赐教
  • 小沛2016:您好 我想请问一下 opencv 识别到图像了可以返回三维坐标吗

    我要做的功能是 识别图片 然后再图片上面添加3D模型 所以要用到三维坐标
    无忌不悔:@李境沛 应该是图片的生成方写入,或者是程序在初始化图片数据时写入
    小沛2016:@无忌不悔 三维坐标数据添加到图片的元数据里面 这里的三维坐标数据是程序还没运行就写在里面的吗
    无忌不悔:@李境沛 有一种做法是把三维坐标数据添加到图片的元数据里面,这样你就可以在得到图片数据的时候再读取元数据里面的三维坐标,不知道可不可行

本文标题:OpenCV写入图像文件到iOS设备沙盒

本文链接:https://www.haomeiwen.com/subject/mikuuxtx.html