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

时间:2011-04-26 18:57:23

标签: ios core-data opencv transformable

我在我的项目中使用CoreData。我可以在我的项目中使用UIImageToDataTransformer类来保存UIImage。我也在使用opencv库,我需要保存一些cvMat结构(它们是结构,对吧?)。我已经阅读了一些关于可转换的帖子,但仍然无法弄清楚如何将它保存在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

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

我在保存时使用此代码

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循环中崩溃。我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

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

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