Как я могу сохранить cvMat в CoreData на iOS? - PullRequest
1 голос
/ 26 апреля 2011

Я использую CoreData в моем проекте. Я могу сохранить UIImage, используя класс UIImageToDataTransformer в моем проекте. Также я использую библиотеку opencv и мне нужно сохранить некоторую структуру cvMat (они являются структурами, верно?). Я прочитал несколько постов о трансформируемых, но до сих пор не могу понять, как сохранить его в coredata и получить его обратно.

У меня есть одна сущность под названием «Человек», и у нее есть атрибут, называемый 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]);
    }
}

он не работает должным образом и врезался в цикл. Где моя ошибка?

1 Ответ

1 голос
/ 27 апреля 2011

Можете ли вы получить указатель (и размер) необработанных байтов ваших данных cvMat?

Если это так, вы можете использовать метод класса dataWithBytes:length: для NSData в вашей реализации transformedValue: и метод bytes (экземпляр) в reverseTransformedValue:.

...