Я ищу альтернативы для камер с линейным сканированием, которые будут использоваться в спортивном хронометраже, или, скорее, в той части, где нужно определить местоположение.Я обнаружил, что обычные промышленные камеры могут легко соответствовать скорости коммерческих решений камеры при> 1000 кадров в секунду.Для моих потребностей, как правило, точность синхронизации не важна, но относительное размещение спортсменов.Я подумал, что мог бы использовать для этой цели одну из самых дешевых промышленных камер Basler, IDS или любую другую индустриальную камеру.Конечно, существуют камеры с линейным сканированием, которые могут работать со скоростью, превышающей несколько тысяч кадров в секунду (или Гц), но есть возможность приобрести камеры с зонным сканированием, которые могут выполнять требуемые 1000-3000 кадров в секунду менее чем за 500 €.
Моим святым Граалем, конечно же, будут возможности композиции изображений FinishLynx (или любой другой системы линейного сканирования), близкие к реальному времени, в основном эта часть: https://youtu.be/7CWZvFcwSEk?t=23s
Весь процесс, о котором я думал в качестве альтернативыis:
- Используйте Basler Pylon Viewer (или другое программное обеспечение) для записи изображений шириной 2 пикселя с самой высокой скоростью чтения камеры.Для камеры, которой я сейчас пользуюсь, это означает, что ее нужно повернуть на бок, а высоту нужно уменьшить, поскольку это единственный способ, которым она будет читать 1920x2px frames @> 250fps
- Создайте программу или пакетный скрипт, который затем соединит эти 1920x2px кадры вместе, например, в одну секунду записи 1000 * 1920x2px кадров, что означает полученное изображение с разрешением 1920x2000px (по горизонтали x по вертикали).
- Наконец, используя ту же программу или другой способ, просто поверните изображение, чтобы оно отражало положение камеры, таким образом, получая изображение с разрешением 2000x1920px (снова по горизонтали x по вертикали)
- Откройте изображение в программе для анализа (в настоящее время ImageJ) для быстрого анализа результатов
Я не программист, но эточто я смог собрать, просто используя пакетные сценарии, с помощью stackoverflow, конечно.
- В настоящее время запись всего 1Например, 0 секунд на диск в виде потока raw / mjpeg (avi / mkv) можно выполнять в режиме реального времени.
- Запись отдельных кадров в формате TIFF или BMP или использование FFMPEG для их сохранения в формате PNG или JPG занимает ~20-60 секунд. Затем добавление и поворот занимает еще ~ 45-60 секунд . Все это должно быть достигнуто менее чем за 60 секунд для 10 секунд отснятого материала (1000-3000 кадров в секунду при 10 с = 10000-30000 кадров).), поэтому мне нужно что-то быстрее.
Мне удалось выяснить, как быть довольно эффективным с ImageMagick:
magick convert -limit file 16384 -limit memory 8GiB -interlace Plane -quality 85 -append +rotate 270 “%folder%\Basler*.Tiff” “%out%”
#%out% has a .jpg -filename that is dynamically made from folder name and number of frames.
Эта команда работает и заставляет меня10000 кадров, закодированных примерно за 30 секунд на i5-2520m (хотя большая часть обработки, по-видимому, использует только один поток, поскольку он работает с использованием 25% процессора).Это полученное изображение: https://i.imgur.com/OD4RqL7.jpg (19686x1928px)
Однако, поскольку запись в кадры TIFF с использованием Basler Pylon Viewer занимает намного больше времени, чем запись видеопотока MJPEG, я хотел бы использовать MJPEG(avi / mkv) файл в качестве источника для добавления.Я заметил, что FFMPEG имеет команду «image2pipe», которая должна иметь возможность напрямую передавать изображения в ImageMagick.Я не смог заставить это работать, хотя:
$ ffmpeg.exe -threads 4 -y -i "Basler acA1920-155uc (21644989)_20180930_043754312.avi" -f image2pipe - | convert - -interlace Plane -quality 85 -append +rotate 270 "%out%" >> log.txt
ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 7.2.0 (GCC)
configuration: –enable-gpl –enable-version3 –enable-sdl2 –enable-bzlib –enable-fontconfig –enable-gnutls –enable-iconv –enable-libass –enable-libbluray –enable-libfreetype –enable-libmp3lame –enable-libopenjpeg –enable-libopus –enable-libshine –enable-libsnappy –enable-libsoxr –enable-libtheora –enable-libtwolame –enable-libvpx –enable-libwavpack –enable-libwebp –enable-libx264 –enable-libx265 –enable-libxml2 –enable-libzimg –enable-lzma –enable-zlib –enable-gmp –enable-libvidstab –enable-libvorbis –enable-cuda –enable-cuvid –enable-d3d11va –enable-nvenc –enable-dxva2 –enable-avisynth –enable-libmfx
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Invalid Parameter - -interlace
[mjpeg @ 000000000046b0a0] EOI missing, emulating
Input #0, avi, from 'Basler acA1920-155uc (21644989)_20180930_043754312.avi’:
Duration: 00:00:50.02, start: 0.000000, bitrate: 1356 kb/s
Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 1920x2, 1318 kb/s, 200 fps, 200 tbr, 200 tbn, 200 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
Output #0, image2pipe, to ‘pipe:’:
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: mjpeg, yuvj422p(pc), 1920x2, q=2-31, 200 kb/s, 200 fps, 200 tbn, 200 tbc
Metadata:
encoder : Lavc57.107.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
av_interleaved_write_frame(): Invalid argument
Error writing trailer of pipe:: Invalid argument
frame= 1 fps=0.0 q=1.6 Lsize= 0kB time=00:00:00.01 bitrate= 358.4kbits/s speed=0.625x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
Conversion failed!
Если я подхожу немного выше для высоты, я больше не получаю ошибку «[mjpeg @ 000000000046b0a0] EOI отсутствует, эмулируя».Однако все это будет работать только с </ 2px высоким / широким кадром. </p>
edit: О да, я также могу использовать ffmpeg -i file.mpg -r 1/1 $filename%03d.bmp
или ffmpeg -i file.mpg $filename%03d.bmp
для извлечения всех кадров из потока MJPEG / RAW.Однако это дополнительный шаг, который я не хочу делать.(простое удаление папки с 30000 jpgs занимает 2 минуты в одиночку…)
Может кто-нибудь придумать рабочее решение для метода трубопровода или совершенно другой альтернативный способ обработки этого?