2014-02-25 2 views
0

У меня есть (довольно дешевая) веб-камера, которая производит изображения, которые намного легче, чем должно быть. У камеры есть коррекция яркости - настройки очевидны при перемещении от света к темноте, но она постоянно далека от яркого.OpenCV darken overaturated webcam image

Я ищу способ уменьшить яркость без итерации по всему кадру (привязки OpenCV Python к малине Pi). Это существует? Или лучше, есть ли стандартный способ отправки подсказок на веб-камеру, чтобы уменьшить яркость?

import cv2 

# create video capture 
cap = cv2.VideoCapture(0) 
window = cv2.namedWindow("output", 1) 

while True: 

    # read the frames 
    _,frame = cap.read() 
    cv2.imshow("output",frame) 

    if cv2.waitKey(33)== 27: 
     break 

# Clean up everything before leaving 
cv2.destroyAllWindows() 
cap.release() 
+0

Несколько вопросов: 1) Можете ли вы обновить свой вопрос с помощью фрагмента, показывающего, где вы получаете изображение в своем приложении? Я хотел бы видеть точный источник данных, которые у вас есть. Также стандартная практика SO для публикации вашего кода. 2) У вас уже есть OpenCV (cv2), работающий на Raspberry Pi? Это означает, что у вас уже есть numpy. Если это так, то это должно быть легко. 3) Вы хотите просто уменьшить яркость или сделать что-то более сложное, как настроить гамму? – KobeJohn

+0

Код еще не запущен на Pi - в настоящее время я развиваюсь в другом месте, чтобы избежать общения. Маленькие шаги. И Pi, и рабочий стол запускают Arch, поэтому среда должна быть довольно схожей. Я не добавлял код, потому что он проявляется при любом захвате изображения. Не похоже, что фрагмент «grab image -> show image» добавит что-нибудь к вопросу. Что бы ни было лучше - я бы, наверное, попробовал оба! – KendallV

ответ

1

Стандартный способ настройки параметров веб-камеры - это метод VideoCapture set() (при условии, что ваша камера поддерживает интерфейс. Большинство из них делает мой опыт). Это позволяет избежать накладных расходов на производительность обработки самого изображения.

VideoCapture::set

CV_CAP_PROP_BRIGHTNESS или CV_CAP_PROP_SATURATION, казалось бы, что вы хотите.

+0

Это потрясающе. Я искал подробное объяснение того, что это делает (похоже, он сохраняет эффект после закрытия программы, то есть повторно запускает программу без установленной опции, и она все равно будет затемнить изображение). Я просто терплю неудачу в Google? – KendallV

+0

Я не слишком уверен, как это работает, но я думаю, что он просто вызывает стандартные функции в протоколе UVC (USB Video Class). Возможно, у вашей камеры есть некоторая энергонезависимая память, в которой хранятся предыдущие настройки, или, может быть, она может изменить настройки на уровне устройства USB (поэтому отключить/отладить устройство очистит его) –

+0

Я не мог найти в документации, но это берет поплавок ... ** 0.0 самый темный ** и ** 100.0 является самым легким ** из того, что я могу сказать. – luckyging3r

2

Я забыл, что малина Pi просто работает с обычной ОС. Какая удивительная машина. Спасибо за код, подтверждающий, что у вас есть обычный образ cv2.

Простое векторное масштабирование (без воспроизведения с каждым пикселем) должно быть простым. Ниже всего масштабируется каждый пиксель. Было бы легко добавить несколько строк для нормализации изображения, если оно имеет большое смещение.

import numpy 
#... 
scale = 0.5 # whatever scale you want 
frame_darker = (frame * scale).astype(numpy.uint8) 
#... 

Это похоже на то, что вы хотите?

+0

Да, это замечательная мелочь! Это, похоже, выполняет эту работу. Однако я соглашусь на подход к свойствам, поскольку, кажется, более «официальный» способ решения проблемы и перевода на другие языки лучше. Благодаря! – KendallV

+0

@ KendallV конечно, если вы можете сказать, что камера дает вам лучшие изображения, которые всегда являются лучшим выбором. Вы можете вернуться к этому и добавить небольшой анализ, если вы не можете добиться предсказуемого поведения с камеры. – KobeJohn