В настоящее время у нас есть приложение, которое выполняет покадровую обработку видео с использованием C #.Пока все работало нормально.
Когда мы пытались добавить поддержку изображений, мы наткнулись на странную ошибку.Сначала мы используем наш код (первый блок кода) для генерации видео с одним кадром, а затем пытаемся прочитать его, как и все наши другие функции, которые работали для предыдущих видео.
НО мы не можем прочитать кадр из один кадр - и только один кадр mp4 - mp4, сгенерированный с использованием нашего кода ниже:
//(After checking if video is actually an image)
// Create Video
string VideoFileName = OFD.FileName; //Yes, OFD.FileName is valid
Mat FirstImage = CvInvoke.Imread(VideoFileName);
string ActuallyAnImage_Name = VideoFileName.Substring(0, VideoFileName.LastIndexOf("\\")) + "\\" + "ImageAsVideo.mp4"; //Create an mp4
VideoWriter w = new Emgu.CV.VideoWriter(ActuallyAnImage_Name, VideoWriter.Fourcc('H', '2', '6', '4'), 30.0, FirstImage.Size, true);
w.Write(FirstImage);
w.Dispose();
VideoFileName = ActuallyAnImage_Name;
Console.WriteLine("In OFD: VideoFileName = " + VideoFileName); //everything is correct.
VC = new VideoCapture(VideoFileName); //VC is a global variable of type `Emgu.CV.VideoCapture`
Ничто не так с приведенным выше кодом, и он правильно генерируетоднокадровое видео mp4, которое можно открыть даже с помощью проигрывателя Windows Movie Player.
Проблема связана с тем, что происходит, когда мы пытаемся прочитать это однокадровое видео , используя нашу нижеприведенную функцию:
private Mat GetMat(int someFrameNumber) {
Mat m = new Mat();
try {
VC.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, someFrameNumber);
VC.Read(m);
Mat resized = new Mat();
//Note: pictureBox_display is the pictureBox where we display our video on the C# application
Console.WriteLine(m.Size + " " + pictureBox_display.Size + " FNO: " + someFrameNumber + " VideoFile:" + VideoFileName);
/* CONSOLE OUTPUT
When it works: {Width=720, Height=576} {Width=600, Height=480} FNO: 0 VideoFile:<correct path>
When it doesn't work: {Width=0, Height=0} {Width=600, Height=480} FNO: 0 VideoFile:<correct path>
*/
CvInvoke.ResizeForFrame(m, resized, pictureBox_display.Size);
return resized;
}
catch {
System.Windows.Forms.MessageBox.Show("ERROR: Cannot read video frame");
return m;
}
}
Магически, весь кодовый блок работает нормально, когда мы используем один и тот же первый блок кода для генерации видео с более чем одним кадром .Когда видео имеет 2 (или более) кадра, оно прекрасно работает.
Но когда оно имеет только один кадр , код великолепно терпит неудачу с Exception thrown: 'Emgu.CV.Util.CvException' in Emgu.CV.World.dll
Вещи, которые мы пробовали, которые не работали:
- Использование
QueryFrame
- Загрузка видео, содержащего только один кадр, и попытка чтенияэто
Кто-нибудь может помочь с этой странной проблемой?