我搜索了论坛并看到了这个问题的一些可能的部分解决方案,但我想帮助将它们放在一起。
我从摄像机获取帧并对当前帧和前一帧之间的差异进行图像处理。除了来自相机的RGB值之外,我还计算每个像素的色调和饱和度,每个像素也是一个int。所以我的两个问题是:
每次调用didOutputSampleBuffer
时,存储所有这些值的最佳方法是什么?从我一直在阅读,似乎有这么多的值,NSNumber的开销将是显着的,所以最少的内存将花费使用经典的c风格的int数组,长度为144 x 192 x 5(R,G ,B,H,S)= 138,240。这有意义吗?
如何将此数组放在didOutputSampleBuffer方法的范围内,因为我在应用程序启动时初始化数组,而不是在didOutputSampleBuffer方法中。有人在论坛上提到我可以将数组包装在NSMutableData中,然后我可以将它存储为属性吗?
感谢您的建议, 唐
答案 0 :(得分:1)
鉴于图像的大小不会改变,您应该能够创建一个缓冲区,将这些组件存储为交错字节或每个颜色组件平面的几个缓冲区。您可以通过手动使用malloc()
和free()
来创建此缓冲区并在完成后将其销毁。
如果您更喜欢使用引用计数,则可以将这些字节包装在NSData实例中,这不会给您的处理增加太多开销。可以将指向已处理缓冲区字节的指针或NSData实例用作属性。
请注意,您可能希望为每个组件使用unsigned char
类型,因为您只返回每个颜色组件的单个字节。为什么浪费内存会有不必要的精确度?
答案 1 :(得分:0)
当我处理类似的问题时,我只是简单地将c样式数组放在一个对象上。
这样我就可以像元数据一样附加其他属性。
@interface MyObject : NSObject {
int *arrayOfInts;
}
@property (readwrite) int *arrayOfInts;
@end
在这种情况下,你仍然必须明确管理内存。
答案 2 :(得分:0)
示例:
// 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