来自iOS相机的亮度

use*_*903 1 objective-c brightness ios 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

以下是问题:

"找不到实例方法'-rgbaPixels'(返回类型默认为'id')"&"不兼容的指针类型初始化'unsigned char*',表达式为'id'"

非常感谢 !=)

Bra*_*son 14

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

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

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

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

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

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