У меня следующая проблема: я создаю однородное видео серого цвета (для тестирования) с помощью 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 значение параметра?