OpenCv程序员iOS开发

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

2017-10-26  本文已影响83人  无忌不悔

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

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

cv::imwrite(imageName, img);

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

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

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

经过一下午的问题排查,终寻求方法将原图像文件无差别写入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才能作为有效的参数,至于为什么这么转来转去,谁知道呢!

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

上一篇 下一篇

猜你喜欢

热点阅读