gpt4 book ai didi

iphone - AVFoundation 缓冲区与已保存图像的比较

转载 作者:行者123 更新时间:2023-12-03 20:00:12 27 4
gpt4 key购买 nike

我是一名长期读者,第一次在 StackOverflow 上发帖,必须说这对我来说是一个很好的知识来源。

我正在尝试了解 AVFoundation 框架。

我想要做的是保存相机看到的内容,然后检测何时发生变化

这是我将图像保存到 UIImage 的部分:

if (shouldSetBackgroundImage) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// Create a bitmap graphics context with the sample buffer data
CGContextRef context = CGBitmapContextCreate(rowBase, bufferWidth,
bufferHeight, 8, bytesPerRow,
colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
// Create a Quartz image from the pixel data in the bitmap graphics context
CGImageRef quartzImage = CGBitmapContextCreateImage(context);

// Free up the context and color space
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

// Create an image object from the Quartz image
UIImage * image = [UIImage imageWithCGImage:quartzImage];
[self setBackgroundImage:image];
NSLog(@"reference image actually set");

// Release the Quartz image
CGImageRelease(quartzImage);

//Signal that the image has been saved
shouldSetBackgroundImage = NO;

}

这是我检查相机看到的图像是否有任何变化的部分:

else {

CGImageRef cgImage = [backgroundImage CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
char* data = CFDataGetBytePtr(bitmapData);

if (data != NULL)
{
int64_t numDiffer = 0, pixelCount = 0;
NSMutableArray * pointsMutable = [NSMutableArray array];

for( int row = 0; row < bufferHeight; row += 8 ) {
for( int column = 0; column < bufferWidth; column += 8 ) {

//we get one pixel from each source (buffer and saved image)
unsigned char *pixel = rowBase + (row * bytesPerRow) + (column * BYTES_PER_PIXEL);
unsigned char *referencePixel = data + (row * bytesPerRow) + (column * BYTES_PER_PIXEL);

pixelCount++;

if ( !match(pixel, referencePixel, matchThreshold) ) {
numDiffer++;
[pointsMutable addObject:[NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH - (column/ (float) bufferHeight)* SCREEN_WIDTH - 4.0, (row/ (float) bufferWidth)* SCREEN_HEIGHT- 4.0)]];
}
}
}
numberOfPixelsThatDiffer = numDiffer;
points = [pointsMutable copy];
}

出于某种原因,这不起作用,这意味着 iPhone 检测到几乎所有内容都与保存的图像不同,即使我在匹配功能中设置了非常低的检测阈值...

你知道我做错了什么吗?

最佳答案

对于为什么您可能会看到几乎每个像素都不同,我可以想到三种可能性:色彩空间转换、像素位置映射不正确,或者您的阈值对于 iPhone 摄像头的实际移动过于敏感。前两个不太可能,所以我认为可能是第三个,但它们值得检查。

当您将像素放入 UIImage 中然后稍后提取它们时,可能会进行一些颜色校正。您可以尝试简单地将它们存储在缓冲区中的 native 状态,然后使用原始缓冲区作为比较点,而不是 UIImage 的支持数据。

此外,请检查以确保您的行/列算术适用于两个图像中的实际像素位置。也许生成一个差异图像(将两个图像相减的绝对差),然后使用简单的黑白划分区域作为相机的测试图像。

最有可能的情况是,仅仅通过人手握住图像的 Action ,整个图像就会移动超过一个像素。在简单的比较中,这些全帧图像偏移可能会导致几乎每个像素都不同。您可能需要调整阈值或进行更智能的运动估计,就像视频压缩例程中使用的那样。

最后,当谈到比较操作时,我建议查看 OpenGL ES 2.0 着色器来执行此操作。与在 CPU 上进行逐像素比较相比,您应该会看到巨大的加速(在我的基准测试中为 14-28 倍)。我在 this article 中展示了如何使用 GPU 进行基于颜色的阈值处理,其中有 this iPhone sample application使用 GLSL 着色器实时跟踪彩色对象。

关于iphone - AVFoundation 缓冲区与已保存图像的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com