2011-04-26 36 views
1

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

我有一个名为“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循环。我的错误在哪里?

回答

1

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

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

+0

我可以得到一个指向cvMat和它的大小,但仍然不能在我的代码中使用它的类型。如果你的意思是这样的功能#进口 “ProjValTransformer.h” @implementation ProjValTransformer +(BOOL)allowsReverseTransformation {返回YES; } +(Class)transformedValueClass {return [NSData class]; }(id)transformedValue:(cvMat *)value { return [NSData dataWithBytes:value length:sizeof(value)]; } - (*与CvMat)reverseTransformedValue:(ID)值{ 回报cvCreateMat(value.row,<#int cols#>,<#int type#>)} @end 它,如果我尝试使用像CvMat中给出错误。 – Haqn 2011-04-26 20:40:33