Кодирование OpenCV в H264, изменяющее исходные значения пикселей RGB для серых изображений - PullRequest
0 голосов
/ 13 января 2020

У меня следующая проблема: я создаю однородное видео серого цвета (для тестирования) с помощью OpenCV VideoWriter. Выходное видео будет воспроизводить постоянное изображение, где все пиксели должны иметь одинаковое значение x (25, 51, 76, ... и т. Д.). Когда я генерирую видео с помощью MJPG Encoder:

vw = cv2.VideoWriter('./videos/input/gray1.mp4',
        cv2.VideoWriter_fourcc(*'MJPG'),
        fps,(resolution[1],resolution[0]))

и читаю вывод, используя класс VideoCapture, все просто работает отлично. Я получил массив кадров со всеми значениями пикселей (25,51,76 и т. Д.). Однако, когда я генерирую видео, используя HEV1 (H.265) или также H264:

vw = cv2.VideoWriter('./videos/input/gray1.mp4',
        cv2.VideoWriter_fourcc(*'HEV1'),
        fps,(resolution[1],resolution[0]))

, я сталкиваюсь со следующей проблемой. Кадр, который я получил в формате BGR, соответствует следующей конфигурации:

  • Значение синего канала - это ожидаемое значение (x) минус 4 (25-4 = 21, 51-4 = 47, 76-4 = 72 и т. Д.)
  • Зеленый канал - это ожидаемое значение (x) минус 1 (25-1 = 24, 51-1 = 50 , 76-1 = 75).
  • красный канал - это ожидаемое значение (x) минус 3 (25-3 = 22, 51-3 = 48, 76-3 = 73 ).

Обратите внимание, что значение уменьшается с постоянным значением 4,1,3, независимо от значения пикселя (таким образом, существует постоянный эффект). То, что я мог бы объяснить, это функция, зависящая от значения пикселя, а не фиксированная. Что еще хуже, если я выберу генерацию видео с кадрами, состоящими из каждого цвета (значения пикселей [255 0 0], [0 255 0] и [0 0 255]), я получу соответствующие выходные значения ([251 0 0 ], [0 254 0] и [0 0 252]) Я думал, что это отношение было связано со значением Y в градациях серого, где:

Y = 76/256 * КРАСНЫЙ + 150/256 * ЗЕЛЕНЫЙ + 29 / 256 * СИНИЙ

Но эти коэффициенты не связаны с полученным результатом. Может быть, проблема заключается в чтении с VideoCapture?

РЕДАКТИРОВАТЬ: В случае, если я хочу иметь одинаковое выходное значение для пикселей (Ej: [10,10,10], экспериментально мне нужно создать img, где красный и синий канал имеет значение зеленого канала плюс 2:

value = 10
img = np.zeros((resolution[0],resolution[1],3),dtype=np.uint8)+value
    img[:,:,2]=img[:,:,2]+2
    img[:,:,1]=img[:,:,1]+0
    img[:,:,0]=img[:,:,0]+2

Кто-нибудь сталкивался с этой проблемой? Это связано с процессом кодирования или просто OpenCV обрабатывает изображение по-разному, предшествующее кодирование, в зависимости от четырех cc значение параметра?

...