Управление контрастом и яркостью видеопотока в OpenCV и Python - PullRequest
2 голосов
/ 03 апреля 2020

Я использую OpenCV3 и Python 3.7 для захвата потокового видео с моей веб-камеры и хочу контролировать яркость и контрастность. Я не могу управлять настройками камеры с помощью команд OpenCV cap.set(cv2.CAP_PROP_BRIGHTNESS, float) и cap.set(cv2.CAP_PROP_BRIGHTNESS, int), поэтому я хочу применять контраст и яркость после каждого кадра. Массив Numpy каждого захваченного изображения равен (480, 640, 3). Следующий код правильно отображает видеопоток без каких-либо попыток изменить яркость или контраст.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)    
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Я получаю размытый видеопоток, когда использую метод Numpy clip() для управления контрастом и яркостью, даже когда я установил contrast = 1.0 (без изменения контрастности) и brightness = 0 (без изменения яркости). Вот моя попытка контролировать контраст и яркость.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    contrast = 1.0
    brightness = 0
    frame = np.clip(contrast * frame + brightness, 0, 255)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Как я могу контролировать контраст и яркость видеопотока с помощью OpenCV?

1 Ответ

2 голосов
/ 04 апреля 2020

Я нашел решение, используя метод numpy.clip(), а @ fmw42 предоставил решение, используя метод cv2.normalize(). Мне нравится решение cv2.normalize() немного лучше, потому что оно нормализует значения пикселей до 0-255, а не обрезает их в 0 или 255. Оба решения представлены здесь.

Решение cv2.normalize():

  • Яркость - сдвиньте значения альфа и бета на одинаковую величину. Альфа может быть отрицательной, а бета может быть выше 255. (Если альфа> = 255, то изображение белое, а если бета <= 0, то изображение черное. </li>
  • Контрастность - Расширение или сокращение разрыва между альфа и бета.

Вот код:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Решение numpy.clip():

Это помогло мне решить проблема: Как быстро изменить яркость изображения с помощью python + OpenCV? . Мне нужно:

  1. Преобразовать красно-зеленый синий (RGB) в значение Hue-Saturation-Value (HSV) сначала («Значение» совпадает с «Яркостью»)
  2. «Срез» массива Numpy до значения «Значение» массива Numpy и настройку яркости и контраста на этом срезе
  3. Преобразование обратно из HSV в RGB.

Вот рабочее решение. Измените значения contrast и brightness. numpy.clip() гарантирует, что все значения пикселей остаются между 0 и 255 в каждом на каналах (R, G и B).

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    contrast = 1.25
    brightness = 50
    frame[:,:,2] = np.clip(contrast * frame[:,:,2] + brightness, 0, 255)
    frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...