iOS相机的亮度

我试图做一个应用程序,我必须像这个应用程序计算相机的亮度: 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); } } 

这里是问题:

“实例方法'-rgbaPixels'找不到(返回types默认为'id')”&“不兼容的指针types用'id'types的expression式初始化'unsigned char *'

非常感谢 ! =)

我不build议在inputvideo帧中对每个像素执行昂贵的CPU边界处理,而是build议一种替代方法。 我的开放源代码GPUImage框架内置了亮度提取器,它使用基于GPU的处理function为摄像机提供实时亮度读数。

设置这个比较容易。 您只需分配一个GPUImageVideoCamera实例来表示相机,分配一个GPUImageLuminosityfilter,并将后者添加为前者的目标。 如果要将相机馈送显示在屏幕上,请创build一个GPUImageView实例,并将其添加为GPUImageVideoCamera的另一个目标。

您的光度提取器将使用callback块来计算光度值。 这个块使用下面的代码来设置:

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

我在这个答案中描述了这个亮度提取的内部工作,如果你好奇的话。 这个提取器在iPhone 4上以640×480帧的video运行约6ms。

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

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

在你的情况下,没有文件可读。 外面for循环,即在dayi将不得不离开。 您已经可以访问通过UIImagePickerController提供的Image 。 在添加子视图之后,您原则上可以访问像素,如unsigned char *pixels = [Image rgbaPixels]; Image是你从UIImagePickerController获得的图像。

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

您可以从GIT下面的课程导入来解决这个问题。

https://github.com/maxmuermann/pxl

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