Каков хороший способ хранения более 100 000 целых (представляющих дельта-данные изображения)? - PullRequest
2 голосов
/ 12 марта 2011

Я искал на форуме и видел некоторые возможные частичные решения этого вопроса, но я хотел бы помочь собрать все это вместе.

Я получаю кадры с камеры и выполняю обработку изображений наразница между текущим и предыдущим кадром.В дополнение к значениям RGB с камеры я также вычисляю оттенок и насыщенность для каждого пикселя, каждый из которых также является целым числом.Итак, мои 2 вопроса:

  1. Каков наилучший способ сохранить все эти значения из каждого вызова didOutputSampleBuffer?Из того, что я читал, кажется, что при таком количестве значений накладные расходы от NSNumber будут заметны, поэтому наименьшее количество памяти будет потрачено при использовании классического массива в стиле c с длиной 144 x 192 x 5 (R, G, B, H, S) = 138 240.Имеет ли это смысл?

  2. Как поместить этот массив в область действия моего метода didOutputSampleBuffer, поскольку я инициализирую массив при запуске приложения, а не в методе didOutputSampleBuffer.Кто-то на форуме упомянул, что я могу обернуть массив в NSMutableData, а затем просто сохранить его как свойство?

Спасибо за совет, Дон

Ответы [ 3 ]

1 голос
/ 12 марта 2011

Учитывая, что размер изображения не изменится, вы сможете создать буфер для хранения этих компонентов в виде чередующихся байтов или нескольких буферов для каждой цветовой плоскости компонента. Вы можете сделать это вручную, используя malloc() и free(), чтобы создать этот буфер и уничтожить его, когда закончите.

Если вы предпочитаете использовать подсчет ссылок, вы можете заключить эти байты в экземпляр NSData, что не приведет к дополнительным затратам на обработку. В качестве свойств можно использовать указатель на обработанные байты буфера или экземпляр NSData.

Обратите внимание, что вы, вероятно, захотите использовать unsigned char типы для каждого компонента, потому что вы получаете только отдельные байты для каждого из компонентов цвета. Зачем тратить память с ненужной точностью?

0 голосов
/ 12 марта 2011
  1. Да, это хороший способ хранения данных.В качестве альтернативы вы можете использовать массив структур ac (см. Мой пример).
  2. Вы можете использовать глобальную переменную или свойство, содержащее либо объект NSMutableData, либо указатель на массив.Поскольку вам нужен доступ к данным в виде целых чисел, а не необработанных данных, сохранение указателя на данные, вероятно, будет проще, чем объект NSData.

Пример:

// header file
struct PixelData {
    int r, g, b, h, s;
};
@interface TheClass : TheSuperclass {
    struct PixelData *dataPointer;
}
@property struct PixelData *dataPointer;
@end

// implementation file
@implementation TheClass
@synthesize dataPointer;
- (void)didOutputSampleBuffer { // Yes, I know this isn't the full name.
    // parse data
    // store data for pixel at index i:
    struct PixelData *dp = self.dataPointer;
    dp[i].r = r;
    dp[i].g = g;
    dp[i].b = b;
    dp[i].h = h;
    dp[i].s = s;
}
@end
0 голосов
/ 12 марта 2011

Когда я сталкивался с подобной проблемой, я просто сделал массив стилей c иваром для объекта.

Таким образом, я могу добавить к нему дополнительные свойства, такие как метаданные и т. Д.

@interface MyObject : NSObject {

    int *arrayOfInts;
}

@property (readwrite) int *arrayOfInts;

@end

В этом случае вам все равно придется явно управлять памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...