来自iOS相机的亮度

时间:2013-01-30 18:06:25

标签: ios objective-c brightness luminance

我试图制作一个应用程序,我必须像这个应用程序一样计算相机的亮度:http://itunes.apple.com/us/app/megaman-luxmeter/id455660266?mt=8

我找到了这份文件:http://b2cloud.com.au/tutorial/obtaining-luminosity-from-an-ios-camera

但我不知道如何直接适应相机而不是图像。这是我的代码:

    Image = [[UIImagePickerController alloc] init];
    Image.delegate = self;
    Image.sourceType = UIImagePickerControllerCameraCaptureModeVideo;
    Image.showsCameraControls = NO;
    [Image setWantsFullScreenLayout:YES];
    Image.view.bounds = CGRectMake (0, 0, 320, 480);
    [self.view addSubview:Image.view];

    NSArray* dayArray = [NSArray arrayWithObjects:Image,nil];
    for(NSString* day in dayArray)
    {
        for(int i=1;i<=2;i++)
        {
            UIImage* image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%d.png",day,i]];
            unsigned char* pixels = [image rgbaPixels];
            double totalLuminance = 0.0;
            for(int p=0;p<image.size.width*image.size.height*4;p+=4)
            {
                totalLuminance += pixels[p]*0.299 + pixels[p+1]*0.587 + pixels[p+2]*0.114;
            }
            totalLuminance /= (image.size.width*image.size.height);
            totalLuminance /= 255.0;
            NSLog(@"%@ (%d) = %f",day,i,totalLuminance);
        }
    }

以下是问题:

&#34;实例方法&#39; -rgbaPixels&#39;找不到(返回类型默认为&#39; id&#39;)&#34; &安培; &#34;不兼容的指针类型初始化&#39; unsigned char *&#39;表达类型为&#39; id&#39;&#34;

非常感谢! =)

3 个答案:

答案 0 :(得分:14)

让我建议一种替代方法,而不是对输入视频帧中的每个像素进行昂贵的CPU绑定处理。我的开源GPUImage框架内置了一个光度提取器,它使用基于GPU的处理来提供摄像机的实时亮度读数。

设置它相对容易。您只需分配一个GPUImageVideoCamera实例来表示相机,分配GPUImageLuminosity过滤器,并将后者添加为前者的目标。如果要将摄像头源显示到屏幕,请创建GPUImageView实例并将其添加为GPUImageVideoCamera的另一个目标。

您的光度提取器将使用回调块返回计算时的亮度值。使用以下代码设置此块:

[(GPUImageLuminosity *)filter setLuminosityProcessingFinishedBlock:^(CGFloat luminosity, CMTime frameTime) {
     // Do something with the luminosity
   }];

如果你很好奇,我会在this answer描述这种光度提取的内部运作。对于iPhone 4上的640x480视频帧,此提取器在~6 ms内运行。

你很快就会发现,当启用自动曝光时,iPhone相机的平均亮度几乎总是在50%左右。这意味着您需要使用相机元数据中的曝光值来补充光度测量,以获得任何有意义的亮度测量。

答案 1 :(得分:0)

为什么要将相机图像放入NSArray *dayArray?五行之后,您将其从该数组中删除,但将该对象视为NSStringNSString没有rgbaPixels。您复制粘贴的示例包含一系列文件名,这些文件名对应于一天中不同时间拍摄的照片。然后打开这些图像文件并执行亮度分析。

在您的情况下,没有要阅读的文件。两个外for个循环,即dayi都必须消失。您已经可以访问Image提供的UIImagePickerController。在添加子视图后,您原则上可以访问像unsigned char *pixels = [Image rgbaPixels];中的像素,其中Image是您从UIImagePickerController获得的图像。

但是,这可能不是您想要做的。我想你的目标是在捕捉模式下显示UIImagePickerController,然后连续测量光度。为此,您可以将Image转换为成员变量,然后从计时器回调中重复访问其像素。

答案 2 :(得分:0)

您可以从GIT导入以下类来解决此问题。

https://github.com/maxmuermann/pxl

添加UIImage + Pixels.h&amp; .m文件到项目中。现在尝试运行。