1

我正在尝试制作一个应用程序,我必须像这个应用程序一样计算相机的亮度: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'(返回类型默认为'id')”和“使用'id'类型的表达式初始化'unsigned char *'的不兼容指针类型”

非常感谢 !=)

4

3 回答 3

14

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

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

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

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

如果你好奇的话,我会在这个答案中描述这种光度提取的内部工作原理。对于 iPhone 4 上的 640x480 帧视频,此提取器在约 6 毫秒内运行。

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

于 2013-01-30T20:19:40.017 回答
0

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

在您的情况下,没有要读取的文件。两个外for循环,即打开day并且i将不得不消失。您已经可以Image通过UIImagePickerController. 在添加子视图之后,您原则上可以访问像素,就像您从unsigned char *pixels = [Image rgbaPixels];哪里获得的图像一样。ImageUIImagePickerController

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

于 2013-01-30T18:27:52.753 回答
0

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

https://github.com/maxmuermann/pxl

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

于 2015-06-09T06:43:14.667 回答