存储100,000多个整数(表示图像增量数据)的好方法是什么?

时间:2011-03-11 21:46:24

标签: iphone camera pixels

我搜索了论坛并看到了这个问题的一些可能的部分解决方案,但我想帮助将它们放在一起。

我从摄像机获取帧并对当前帧和前一帧之间的差异进行图像处理。除了来自相机的RGB值之外,我还计算每个像素的色调和饱和度,每个像素也是一个int。所以我的两个问题是:

  1. 每次调用didOutputSampleBuffer时,存储所有这些值的最佳方法是什么?从我一直在阅读,似乎有这么多的值,NSNumber的开销将是显着的,所以最少的内存将花费使用经典的c风格的int数组,长度为144 x 192 x 5(R,G ,B,H,S)= 138,240。这有意义吗?

  2. 如何将此数组放在didOutputSampleBuffer方法的范围内,因为我在应用程序启动时初始化数组,而不是在didOutputSampleBuffer方法中。有人在论坛上提到我可以将数组包装在NSMutableData中,然后我可以将它存储为属性吗?

  3. 感谢您的建议, 唐

3 个答案:

答案 0 :(得分:1)

鉴于图像的大小不会改变,您应该能够创建一个缓冲区,将这些组件存储为交错字节或每个颜色组件平面的几个缓冲区。您可以通过手动使用malloc()free()来创建此缓冲区并在完成后将其销毁。

如果您更喜欢使用引用计数,则可以将这些字节包装在NSData实例中,这不会给您的处理增加太多开销。可以将指向已处理缓冲区字节的指针或NSData实例用作属性。

请注意,您可能希望为每个组件使用unsigned char类型,因为您只返回每个颜色组件的单个字节。为什么浪费内存会有不必要的精确度?

答案 1 :(得分:0)

当我处理类似的问题时,我只是简单地将c样式数组放在一个对象上。

这样我就可以像元数据一样附加其他属性。

@interface MyObject : NSObject {

    int *arrayOfInts;
}

@property (readwrite) int *arrayOfInts;

@end

在这种情况下,你仍然必须明确管理内存。

答案 2 :(得分:0)

  1. 是的,这是存储数据的好方法。或者,您可以使用c数组结构(请参阅我的示例)。
  2. 您可以使用全局变量或属性,包含NSMutableData对象或指向数组的指针。由于您希望以整数而不是原始数据的形式访问数据,因此将指针存储到数据可能比NSData对象更容易。
  3. 示例:

    // 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