ios - 如何在 iOS 的 Core Data 中保存 cv Mat?

标签 ios core-data opencv transformable

我在我的项目中使用 CoreData。我可以在我的项目中使用 UIImageToDataTransformer 类来保存 UIImage。此外,我正在使用 opencv 库,我需要保存一些 cvMat 结构(它们是结构,对吗?)。我已经阅读了一些关于 transformable 的文章,但仍然无法弄清楚如何将它保存在 coredata 中并将其取回。

我有一个名为“Human”的实体,它有一个名为 ProjVal 的属性,它的类型是可转换的,它包含 cvMat 的数据。

我的下一步应该是什么?

下面是 UIImage 的转换器类,但我如何转换 cvMat 的数据?感谢您的建议。

#import "UIImageToDataTransformer.h"
@implementation UIImageToDataTransformer

+ (BOOL)allowsReverseTransformation {
    return YES;
}

+ (Class)transformedValueClass {
    return [NSData class];
}

- (id)transformedValue:(id)value {
    return UIImagePNGRepresentation(value);
}

- (id)reverseTransformedValue:(id)value {
    return [[[UIImage alloc] initWithData:value] autorelease];
}
@end

编辑:将其类型用作二进制数据类型而不是可转换类型是否更好?我为我的实体使用自动创建的类。

我在保存时使用了这段代码

CvMat *mat = cvCreateMat(3, 3, CV_32FC1);
for (int i=0; i<9; i++) {
    mat->data.fl[i] = 1.0f;
}


NSData *projValData = [[NSData alloc] initWithBytes:&mat length:sizeof(mat)];
human.projVal = projValData;

在回读时:

CvMat *mat;
NSData *data =  [[humansArray objectAtIndex:0] projVal];
memcpy(&mat,[data bytes],[data length]);
if (mat) {
    NSLog(@"if mat works");
    for (int i=0; i<9; i++) {
        NSLog(@"%f",mat->data.fl[i]);
    }
}

它不能正常工作并在 for 循环中崩溃。我的错误在哪里?

最佳答案

你能得到一个指向你的 cvMat 数据的原始字节(和大小)的指针吗?

如果是这样,您可以在 transformedValue: 实现中使用 NSData 的 dataWithBytes:length: 类方法和 bytes(实例) reverseTransformedValue: 中的方法。

关于ios - 如何在 iOS 的 Core Data 中保存 cv Mat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795118/

相关文章:

c++ - 如何在 OpenCV C++ 中压缩 TIFF 格式的图像?

ios - 尝试使用 preformSelector 并出现错误

ios - Swift:如何在垂直堆栈 View 中水平居中元素

core-data - CoreData可选的多对多关系永远不会为零?

ios - 关闭和打开应用程序后核心数据约束工作错误(Swift)

c++ - 在 openCV 中编写可变帧率视频

python-3.x - 如何减慢使用 cv2 捕获的视频?

ios - Rubymotion MapKit 路径叠加

ios - 从 Swift 中的当前日期获取下周二和周四

iphone - 核心数据对象失效