Невозможно прочитать кадр из однокадрового видео с помощью EmguCV C #, но можно читать из других видео с более чем одним кадром - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время у нас есть приложение, которое выполняет покадровую обработку видео с использованием 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
  • Загрузка видео, содержащего только один кадр, и попытка чтенияэто

Кто-нибудь может помочь с этой странной проблемой?

...