2

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

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

  1. 从每次调用到存储所有这些值的最佳方法是什么didOutputSampleBuffer?从我一直在阅读的内容来看,似乎有这么多值,来自 NSNumber 的开销将是显而易见的,因此使用长度为 144 x 192 x 5(R,G) 的经典 c 样式整数数组将花费最少的内存,B,H,S) = 138,240。那有意义吗?

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

谢谢你的建议,唐

4

3 回答 3

1

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

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

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

于 2011-03-11T22:16:04.700 回答
0

当我处理类似的问题时,我只是将 c 样式数组作为对象上的 ivar。

这样我可以附加其他属性,如元数据等。

@interface MyObject : NSObject {

    int *arrayOfInts;
}

@property (readwrite) int *arrayOfInts;

@end

在这种情况下,您仍然必须显式管理内存。

于 2011-03-11T22:04:50.030 回答
0
  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
于 2011-03-11T22:11:41.140 回答