我试图制作一个应用程序,我必须像这个应用程序一样计算相机的亮度: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;
非常感谢! =)
答案 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
?五行之后,您将其从该数组中删除,但将该对象视为NSString
。 NSString
没有rgbaPixels
。您复制粘贴的示例包含一系列文件名,这些文件名对应于一天中不同时间拍摄的照片。然后打开这些图像文件并执行亮度分析。
在您的情况下,没有要阅读的文件。两个外for
个循环,即day
和i
都必须消失。您已经可以访问Image
提供的UIImagePickerController
。在添加子视图后,您原则上可以访问像unsigned char *pixels = [Image rgbaPixels];
中的像素,其中Image
是您从UIImagePickerController
获得的图像。
但是,这可能不是您想要做的。我想你的目标是在捕捉模式下显示UIImagePickerController
,然后连续测量光度。为此,您可以将Image
转换为成员变量,然后从计时器回调中重复访问其像素。
答案 2 :(得分:0)