У меня есть эта USB-камера. Я хочу снимать видео с высокой частотой кадров. Производитель заявляет, что камера способна делать 180 FSP при разрешении 640х480. Я проверил это, и камера действительно работает (оборудование в порядке; проверьте, включая USB и ПК).
Моя проблема в том, что я не могу успешно настроить камеру на необходимые настройки. Я использую EmguCV.
private void FrmMain_Load(object sender, EventArgs e)
{
// Initialize the VideoCapture object for webcam (default camera index)
capture = new VideoCapture(0);
// Check if the capture object is opened successfully
if (!capture.IsOpened)
{
MessageBox.Show("Failed to open webcam!");
return;
}
//manufacturer specs.
//1280x720 MJPG @90fps -> yes I get video @90 fps
//960x540 MJPG @90fps -> no video -- I read out FPS=1
//640x480 MJPG @180fps -> no video -- I read out FPS=1
//640x360 MJPG @180fps -> no video -- I read out FPS=1
//424x240 MJPG @180fps -> no video -- I read out FPS=1
//320x240 MJPG @180fps -> yes I get video BUT @30fps
//320x180 MJPG @180fps -> yes I get video BUT @30fps
//capture.Set(CapProp.FourCC, fourcc); // is equal to => 1196444237
var fourcc = Convert.ToDouble(VideoWriter.Fourcc('M', 'J', 'P', 'G'));
capture.Set(CapProp.FrameWidth, 640);
capture.Set(CapProp.FrameHeight, 360);
capture.Set(CapProp.Fps, Convert.ToDouble(180));
capture.Set(CapProp.FourCC, fourcc);
RtxbxShow.Text += $"Camera is ready!\n";
RtxbxShow.Text += $"Set in cam FPS: {capture.Get(CapProp.Fps)}\n";
RtxbxShow.Text += $"Set in cam Width: {capture.Get(CapProp.FrameWidth)}\n";
RtxbxShow.Text += $"Set in cam Height: {capture.Get(CapProp.FrameHeight)}\n";
}
Я установил свойства вот так, а затем сразу после этого зачитал свойства. В комментариях вы можете увидеть то, что я прочитал. Для моих желаемых настроек 640x480 при 180 кадрах в секунду. Я снова получаю FPS равный 1. Забавно, что настройка 90FPS работает. Но мне нужно 180 кадров в секунду, есть идеи?
Обновлено: Я мог считать настройки камеры с помощью ffmpeg. И я мог бы записать видео следующим образом: .\ffmpeg.exe -f dshow -video_size 640x480 -framerate 180 -i video="USB 2M GS camera" output.mp4
Я добавил capture.Set(CapProp.FourCC, VideoWriter.Fourcc('M', 'J', 'P', 'G')); Но это все еще не работает. Если я зачитаю FourCC, я получу «22» ???
изменить порядок вызовов set(). поставь fourcc первым или последним
не работает :(.
используйте ffmpeg, перечислите все режимы захвата. возможно, выбранная вами частота кадров не входит в число поддерживаемых частот. вам также следует проверить (с помощью ffmpeg), может ли что-то заставить работать этот режим захвата. если ffmpeg не может этого сделать, нет смысла подозревать opencv в ошибке.
Какая платформа? Должен быть способ явно выбрать конкретный бэкэнд VideoIO при создании/открытии экземпляра VideoCapture
. Возможности каждого бэкэнда могут существенно различаться.
@Dan Masek: Я все программирую в Windows. С помощью VisualStudio C#. На этот раз я использовал Winforms .NET 8.
РЕШЕНИЕ:
Я заставил его работать. Я изменил код из исходного сообщения в одну строку.
От:
capture = new VideoCapture(0);
К:
capture = new VideoCapture(0, VideoCapture.API.DShow);
Чтобы настроить захват на определенный сервер (DShow). Я все время оставлял его на автомате. Но это не помогло.
Дополнительную информацию смотрите здесь
Спасибо
вам также нужно установить MJPG