【问题标题】:Luminosity from iOS cameraiOS 相机的亮度
【发布时间】:2013-01-14 16:00:02
【问题描述】:

我正在尝试制作一个应用程序,我必须像这个应用程序一样计算相机的亮度: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 *' 的不兼容指针类型"

非常感谢! =)

【问题讨论】:

    标签: ios objective-c brightness luminance


    【解决方案1】:

    我建议不要对输入视频帧中的每个像素进行昂贵的 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 毫秒内运行。

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

    【讨论】:

    • 非常感谢,我会努力处理您的项目并回答! =)
    • 只是要知道,最后,当您在“自述”文件中说:“您还需要找到框架头文件,因此在项目的构建设置中将头文件搜索路径设置为从您的应用程序到 GPUImage 源目录中 framework/ 子目录的相对路径。使此标头搜索路径递归。”,这意味着我只需转到我的项目构建设置并搜索“标头搜索路径”,然后添加“ GPUImage.h”到这个没有?因为当我进行下一步#import“GPUImage.h”时,它告诉我“找不到文件”,所有上一步都正确完成:/
    • @user1833903 - 我在这里为另一个开源框架截取了这个截图:stackoverflow.com/questions/10260291/…,但同样的概念也适用。您需要先添加标题搜索路径,然后才能使包含正常工作。这一切都在构建设置中,就像我在链接的答案中显示的那样。
    • 我尝试在您的链接上工作几个小时,但只是标题搜索路径有问题。我尝试了很多时间,但真的不知道如何将框架添加到标题搜索路径中。你能准确地告诉我我必须放入什么,或者邮寄给我吗? (如果你愿意,我可以留下我的电子邮件)
    • @user1833903 - 我不知道我能比我在上面的答案中链接的屏幕截图和演练更明确多少。您需要设置从应用程序项目到安装 GPUImage 框架代码的位置的相对路径。使用 ../ 表示向上一级目录,然后在您完全填写完框架相对路径后选中进行递归目录搜索的框。您需要对此保持精确,因为即使缺少一个字符也可能导致它找不到框架标题。
    【解决方案2】:

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

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

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

    【讨论】:

    • “但是,这可能不是您想要做的。我想您的目标是在捕获模式下显示 UIImagePickerController,然后连续测量亮度。”这正是我想要做的,在捕捉模式下连续显示亮度。 “为此,您可以将 Image 转换为成员变量,然后通过计时器回调重复访问其像素。”你打算说什么 ?很抱歉,但我真的不明白该怎么做:s
    • 我认为你最好花点时间学习 Cocoa Touch 和一般的编程模式。您在完全脱离上下文复制和粘贴一些示例代码后发布了您的问题。在继续之前,也许您应该真正练习一下阅读和编写代码的技能。慢慢来,确保你理解每一行!
    • 我不明白你为什么这么说,我了解可可,我已经有两个应用程序准备在苹果商店出售,使用一些东西,如相机等,但我有一个问题相机的亮度,就像我在后面发布的示例/教程中一样。我不知道如何改变相机的图像处理。就是这样……
    【解决方案3】:

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

    https://github.com/maxmuermann/pxl

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多