从iOS的相机光度(Luminosity from iOS camera)

2019-07-19 01:16发布

我试图让一个应用程序,我要计算相机这样的应用程序的亮度: 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’的表述”

非常感谢 ! =)

Answer 1:

而不是在输入视频帧做每个像素的昂贵的CPU结合的处理,让我提出的另一种方法。 我的开源GPUImage框架有内置的发光度提取,使用基于GPU的处理从摄像机给现场光度读数。

这是比较容易进行此设置。 你只需要分配一个GPUImageVideoCamera实例来表示相机,分配GPUImageLuminosity过滤器,并添加后者为前者的目标。 如果你想显示摄像头输入到屏幕上,创建一个GPUImageView实例,并补充说,作为另一个目标的GPUImageVideoCamera。

您的光度提取将使用回调块,因为他们计算出返回亮度值。 该块被设定为利用像下面的代码:

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

我描述了这个光度提取的内部运作这个答案 ,如果你好奇。 此提取器运行在〜6毫秒用于视频的在iPhone 4 640×480帧。

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



Answer 2:

为什么你将相机图像到NSArray *dayArray ? 五代线后,你从数组中删除,但治疗对象作为NSString 。 一个NSString没有rgbaPixels 。 你复制粘贴的例子具有对应于在一天中的不同时间拍摄的照片的文件名的数组。 然后,它会打开这些图像文件,并进行光度分析。

在你的情况,也没有文件的读取。 这两种外for循环,即在dayi将不得不离开。 你已经得到访问Image ,通过所提供UIImagePickerController 。 加入原则上存取像素的子视图,你可以在之后unsigned char *pixels = [Image rgbaPixels]; 其中, Image是您得到了图像UIImagePickerController

然而,这可能不是你想要做什么。 我想,你的目标是相当展现UIImagePickerController在拍摄模式,然后连续测量光度。 为此,你可以把Image变成一个成员变量,然后从一个计时器回调多次访问其像素。



Answer 3:

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

https://github.com/maxmuermann/pxl

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



文章来源: Luminosity from iOS camera