デバイスのカメラからのピクセルデータを保存し、そのピクセルを前のビデオフレームと比較する必要があるアプリケーションを作成しています。
これが私に問題を与えている方法です:
-(UIImage *)detectMotion:(CGImageRef)imageRef
{
UIImage *newImage = nil;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
// this is the problem loop
for(int i = 0; i < width * height * 4; i += 4) {
int gray = 0.216 * rawData[i] + 0.715 * rawData[i + 1] + 0.0722 * rawData[i + 2];
rawData[i] = gray;
rawData[i + 1] = gray;
rawData[i + 2] = gray;
rawData[i + 3] = 255;
int grayDelta = abs(gray - prevFrameRawData[i / 4]);
int newColor = 0;
if (sqrt(grayDelta * grayDelta * 2) >= 60) {
newColor = 255;
}
rawData[i] = newColor;
rawData[i + 1] = newColor;
rawData[i + 2] = newColor;
rawData[i + 3] = 255;
prevFrameRawData[i / 4] = gray;
}
CGImageRef newCGImage = CGBitmapContextCreateImage(context);
newImage = [UIImage imageWithCGImage:newCGImage];
CGImageRelease(newCGImage);
CGContextRelease(context);
free(rawData);
}
注:prevFrameRawDataは、クラスのinitメソッドでmallocされてから、deallocメソッドで解放されます。
いくつかのテストを行った後、メモリブロックに値を割り当てないと、警告が表示されないことがわかりました。
次のような値を割り当てると思いました
rawData[i] = value
メモリ内のそのスポットを上書きするだけです。
この低レベルのcのものはすべて私にとって新しいものです、皆さんが助けてくれることを願っています。