Яркость с камеры 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' не найден (тип возврата по умолчанию равен 'id')" и "Несовместимые типы указателей, инициализирующие 'unsigned char *' с выражением типа 'id'"

Большое спасибо ! знак равно


person user1833903    schedule 30.01.2013    source источник


Ответы (3)


Вместо того, чтобы выполнять дорогостоящую обработку каждого пикселя во входном видеокадре, связанную с процессором, позвольте мне предложить альтернативный подход. В мой фреймворк GPUImage с открытым исходным кодом встроен экстрактор яркости, который использует обработку на основе GPU для показания освещенности с видеокамеры.

Это относительно легко настроить. Вам просто нужно выделить экземпляр GPUImageVideoCamera для представления камеры, выделить фильтр GPUImageLuminosity и добавить последний в качестве цели для первого. Если вы хотите отображать изображение с камеры на экране, создайте экземпляр GPUImageView и добавьте его в качестве еще одной цели для вашей GPUImageVideoCamera.

Ваш экстрактор яркости будет использовать блок обратного вызова для возврата значений яркости по мере их расчета. Этот блок настраивается с помощью следующего кода:

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

Я описываю внутреннюю работу этого извлечения яркости в этом ответе, если вы мне любопытно. Этот экстрактор работает примерно за 6 мс для кадра видео 640x480 на iPhone 4.

Одна вещь, которую вы быстро обнаружите, это то, что средняя яркость камеры iPhone почти всегда составляет около 50%, когда включена автоматическая экспозиция. Это означает, что вам нужно дополнить свои измерения яркости значениями экспозиции из метаданных камеры, чтобы получить какое-либо значимое измерение яркости.

person Brad Larson    schedule 30.01.2013
comment
Большое спасибо, я постараюсь поработать над вашим проектом и ответить! знак равно - person user1833903; 31.01.2013
comment
Просто чтобы знать, в конце концов, когда вы говорите в своем файле Read me: вам также нужно будет найти заголовки фреймворка, поэтому в настройках сборки вашего проекта установите для путей поиска заголовков относительный путь от вашего приложения к подкаталогу framework/ в исходном каталоге GPUImage. Сделайте этот путь поиска заголовка рекурсивным. Это означает, что мне просто нужно перейти к настройкам сборки моего проекта и найти путь поиска заголовка и добавить GPUImage.h к этому нет? Потому что, когда я сделал следующий шаг, #import GPUImage.h, мне сказали, что файл не найден, все предыдущие шаги выполнены правильно :/ - person user1833903; 31.01.2013
comment
@user1833903 user1833903 - я сделал скриншоты этого для другой среды с открытым исходным кодом здесь: stackoverflow.com/questions/10260291/ , но применяется та же концепция. Вам нужно добавить путь поиска заголовков, прежде чем вы сможете заставить включения работать правильно. Это все в настройках сборки, как показано в связанном ответе. - person Brad Larson; 31.01.2013
comment
Пытаюсь часами работать по вашей ссылке, но просто проблема с путем поиска в шапке. Я пытаюсь много раз, но действительно не знаю, как добавить структуру в путь поиска заголовка. Не могли бы вы просто сказать мне, что именно я должен вставить, или написать мне по почте? (могу написать свой е-мейл, если хотите) - person user1833903; 31.01.2013
comment
@user1833903 user1833903 - Я не знаю, насколько более подробно я могу получить, чем скриншоты и пошаговое руководство, на которые я ссылался в ответе выше. Вам необходимо указать относительный путь от вашего проекта приложения до того места, где вы установили код фреймворка GPUImage. Используйте ../ для указания перехода на один уровень каталога вверх, а затем установите флажок для выполнения рекурсивного поиска в каталоге, когда вы полностью заполните относительный путь фреймворка. Вы должны быть точны с этим, так как даже один отсутствующий символ может привести к тому, что он не найдет заголовки фреймворка. - person Brad Larson; 01.02.2013
comment
Вот чего я не понимаю, потому что я поставил .../GPUImage/framework в рекурсивном режиме, но никакой проверки не появляется. Я действительно не знаю, почему, и это последнее дело для интеграции фреймворка:/ - person user1833903; 01.02.2013
comment
@user1833903 user1833903 - Вероятно, вы имеете в виду ../GPUImage/framework (две точки вместо трех в начале). Установлен ли GPUImage в том же каталоге, где находится каталог вашего проекта, и в каталоге с именем GPUImage? Вот на что указывает этот путь. Вы также можете просмотреть примеры приложений в каталоге examples, чтобы узнать, как я настроил это для этих тестовых приложений. - person Brad Larson; 01.02.2013
comment
Наконец-то я нашел, как добавить проект! Непонимание, потому что я француз и не совсем понял значение путей заголовков: s Я посылаю вам новости, я попробую вашу структуру! знак равно - person user1833903; 02.02.2013

Почему вы помещаете изображение с камеры в NSArray *dayArray? Пять строк спустя вы удаляете его из этого массива, но обрабатываете объект как NSString. NSString не имеет rgbaPixels. Пример, который вы скопировали, имеет массив имен файлов, соответствующих изображениям, сделанным в разное время дня. Затем он открывает эти файлы изображений и выполняет анализ яркости.

В вашем случае нет файла для чтения. Оба внешних for шлейфа, т.е. на day и i, должны будут уйти. Вы уже получили доступ к Image, предоставленному через UIImagePickerController. Сразу после добавления подпредставления вы, в принципе, можете получить доступ к пикселям, как в unsigned char *pixels = [Image rgbaPixels];, где Image — это изображение, которое вы получили из UIImagePickerController.

Однако это может быть не то, что вы хотите сделать. Я предполагаю, что ваша цель скорее показать UIImagePickerController в режиме захвата, а затем непрерывно измерять светимость. С этой целью вы можете превратить Image в переменную-член, а затем многократно обращаться к ее пикселям из обратного вызова таймера.

person s.bandara    schedule 30.01.2013
comment
Однако это может быть не то, что вы хотите сделать. Я предполагаю, что ваша цель состоит в том, чтобы показать UIImagePickerController в режиме захвата, а затем непрерывно измерять яркость. Это именно то, что я хочу сделать, непрерывно отображать яркость в режиме захвата. С этой целью вы можете превратить Image в переменную-член, а затем многократно обращаться к его пикселям из обратного вызова таймера. Что бы вы сказали ? Мне очень жаль, но я действительно не понимаю, как это сделать :с - person user1833903; 30.01.2013
comment
Я думаю, вам было бы гораздо лучше потратить некоторое время на изучение Cocoa Touch и шаблонов программирования в целом. Вы разместили свой вопрос после того, как скопировали и вставили пример кода полностью вне контекста. Прежде чем двигаться дальше, возможно, вам действительно стоит попрактиковаться в чтении и написании кода. Идите медленно и убедитесь, что вы понимаете каждую строчку! - person s.bandara; 30.01.2013
comment
Я не понимаю, почему вы это говорите, я понимаю, какао, у меня уже есть два готовых к продаже приложения в магазине Apple, использующих некоторые вещи, такие как камера и т. д., но у меня проблема с получением яркости с помощью камеры, как в пример/учебник, который я публикую позади. Я не знаю, как изменить обработку изображения камерой. Это все... - person user1833903; 31.01.2013

Вы можете импортировать следующий класс из GIT, чтобы решить эту проблему.

https://github.com/maxmuermann/pxl

Добавьте в проект файлы UIImage+Pixels.h и .m. Теперь попробуй побежать.

person Gagan_iOS    schedule 09.06.2015