如何用30帧c#,opencvsharp制作一部电影

时间:2018-04-24 05:59:31

标签: c# opencv video camera opencvsharp

我想制作30帧的电影。

使用cam观看视频一分钟,视频长度仅为42秒。

测量时间后,输出为21帧。

如何制作30帧视频?

以下是运行时间的说明。

....

00:00:01.0339097
00:00:01.0788484
00:00:01.1256316
00:00:01.1741762
00:00:01.2210662
00:00:01.2660053
00:00:01.3138742
00:00:01.3605831
00:00:01.4084542
00:00:01.4543680
00:00:01.5004309
00:00:01.5492773
00:00:01.5951540
00:00:01.6420466
00:00:01.6899155
00:00:01.7348539
00:00:01.7827228
00:00:01.8282291
00:00:01.8760989
00:00:01.9239678
00:00:01.9718930
....

以下是源代码。

    private void StartTimer()
    {
        if (writer == null)
        {
            Utilitys.TStimeD = DateTime.Now;
            TStimeS = Utilitys.TStimeD.ToString("yyyyMMddHHmmss");
            aviPath = TStimeS + ".avi";
            writer = Cv.CreateVideoWriter(aviPath, "XVID", 30, new CvSize(640, 240));
        }
        timer1.Interval = 33;
        timer1.Enabled = true;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (_captureInProgress)
        {
            _image = _capture.QueryFrame();
            try { 

                writer.WriteFrame(_image);
                Console.WriteLine((DateTime.Now - Utilitys.TStimeD).ToString());
                //Cv.ReleaseImage(_image);
            }
            catch(System.AccessViolationException ex)
            {
                Console.WriteLine("System.AccessViolationException");
            }catch(System.ObjectDisposedException ex)
            {
                Console.Write("System.ObjectDisposedException");
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我不会使用计时器,因为即使它每秒被精确调用30次,也没有时间用于图像抓取和消耗/显示。

我会自己实施限制。

var input1 = [ "BMW","MAZDA","HONDA"];

$("#code").keyup(function(){
$("#car").val("");
var val = $(this).val();
console.log(val);
if(val == 1001)
$("#car").val(input1[0]);
if(val == 2351 )
$("#car").val(input1[1]);
if(val == 3331 )
$("#car").val(input1[2]);
});

在最坏的情况下,如果系统的性能不允许所需的FPS,您将至少以最大可能的FPS运行。

这种方法的另一个优点是你可以在不同的线程上执行图像抓取,这将使主(UI)线程从这个任务中释放出来并使其表现得更顺畅。