Я пытаюсь написать видео, используя opencv. Для меня важно сделать это именно -, поэтому это должен быть кодек без потерь. Я работаю с OpenCV 2.4.1 в Ubuntu 12.04
. Раньше я использовал код fourcc 0. Это дало мне точный результат, который я хотел, и я смог восстановить изображения идеально.
Я не уверен, что произошло, но после недавнего обновления (примерно 20 июля 2012 года )что-то пошло не так, и я больше не могу записывать файлы с этим кодом Fourcc. Я действительно не помню, что это было, но это могло быть связано с обновлением, удалением некоторых программ из моего центра программного обеспечения и некоторыми другими вещами, которые я делал во время генеральной уборки...
Когда я проверяю старый файл с помощью mediainfo(http://www.fourcc.org/identifier/)Я вижу следующий результат:
Complete name : oldsample.avi
Format : AVI
Format/Info : Audio Video Interleave
Format profile : OpenDML
File size : 1.07 GiB
Duration : 41s 467ms
Overall bit rate : 221 Mbps
Writing application : Lavf53.5.0
Video
ID : 0
Format : RGB
Codec ID : 0x00000000
Codec ID/Info : Basic Windows bitmap format. 1, 4 and 8 bpp versions are palettised. 16, 24 and 32bpp contain raw RGB samples
Duration : 41s 467ms
Bit rate : 221 Mbps
Width : 640 pixels
Height : 4294966 816 pixels
Display aspect ratio : 0.000
Frame rate : 30.000 fps
Bit depth : 8 bits
Stream size : 1.07 GiB (100%)
Теперь я вижу, что когда я пишу с использованием кодека 0 fourcc, программа фактически использует кодек i420 по умолчанию. Вот вывод одного из файлов, которые я сейчас пытаюсь записать:
Complete name : newsample.avi
Format : AVI
Format/Info : Audio Video Interleave
File size : 73.0 MiB
Duration : 5s 533ms
Overall bit rate : 111 Mbps
Writing application : Lavf54.6.100
Video
ID : 0
Format : YUV
Codec ID : I420
Codec ID/Info : 8 bit Y plane followed by 8 bit 2x2 subsampled U and V planes.
Duration : 5s 533ms
Bit rate : 111 Mbps
Width : 640 pixels
Height : 480 pixels
Display aspect ratio : 4:3
Frame rate : 30.000 fps
Compression mode : Lossless
Bits/(Pixel*Frame) : 12.000
Stream size : 72.9 MiB (100%)
Этот формат и другие форматы, которые я пытаюсь использовать (, такие как huffyuv HFYU ), не работают для меня, потому что я получаю такие эффектыhttp://imgur.com/a/0OC4y-вы видите яркие артефакты, возникающие из-за того, что, как я предполагаю, является либо сжатием с потерями, либо субдискретизацией цветности в случае HFYU, который должен быть без потерь. То, что вы видите, это красный канал из одного из моих видео.Эффект восприятия незначителен, когда вы смотрите на все 3 канала одновременно, но очень важно, чтобы я точно реконструировал изображения.
Кроме того, хотя я могу воспроизводить свои старые файлы в медиаплеерах, таких как vlc, я внезапно обнаруживаю, что они полностью несовместимы с opencv. Когда я пытаюсь открыть старые файлы с помощью видеозахвата, шаг открытия работает нормально, но попытка выполнить операцию чтения приводит к segfault. Кроме того, когда я пытаюсь писать с помощью:
CV_FOURCC(0,0,0,0)
0
По какой-то причине Opencv по умолчанию использует I420.
Затем я попытался использовать некоторые альтернативные кодеки. 'DIB' кажется тем, что должно работать для меня, и на веб-сайте opencv(http://opencv.willowgarage.com/wiki/VideoCodecs)он указан как «рекомендуемый» кодек. Однако попытка использовать это приводит к следующему сообщению:
OpenCV-2.4.1/modules/highgui/src/cap_gstreamer.cpp:483: error: (-210) Gstreamer Opencv backend doesn't support this codec acutally. in function CvVideoWriter_GStreamer::open
Aborted (core dumped)
Я проверил источник opencv для этого кодека и наткнулся на следующее:
cd OpenCV-2.4.1/modules
grep -i -r "CV_FOURCC"./*
...
./highgui/src/cap_qt.cpp: /*if( fourcc == CV_FOURCC( 'D', 'I', 'B', ' ' ))
./highgui/include/opencv2/highgui/highgui_c.h:#define CV_FOURCC_DEFAULT CV_FOURCC('I', 'Y', 'U', 'V') /* Use default codec for specified filename (Linux only) */
Я попытался установить qt4 и перенастроить с флагом WITH _QT, но это ничего не изменило. Я также пытался раскомментировать эту часть кода и переустановить opencv, но это тоже не сработало.
Моя конечная цель состоит в том, чтобы любой способ эффективного хранения и извлечения видеопотока с 16 битами на каждый пиксель (вроде 32float работал бы нормально, и тогда он не должен был бы быть идеальным ). Прямо сейчас я распаковываю 16 бит в красный и зеленый каналы, поэтому мне нужно, чтобы это было идеально -, так как ошибка 1 в красном канале умножается на 256 в конечном результате. Я не добился успеха ни с одним из доступных мне кодов Fourcc.