كيفية صنع فيلم مع 30 لقطة ج # ، opencvsharp

أريد صنع فيلم بـ 30 إطارًا.

خذ دقيقة واحدة مع كام وشاهد الفيديو ، مدة الفيديو 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");
            }
        }
    }
0

1 إجابة

لن أستخدم جهاز توقيت لهذا ، لأنه حتى لو تم استدعاؤه 30 مرة في الثانية على وجه التحديد ، فلن يكون هناك وقت متبقي لالتقاط الصور والاستهلاك/العرض.

كنت أقوم بتطبيق الاختناق بنفسي

    async void GrabImages(CancellationToken ct, int FPS)
    {
        var sw = new Stopwatch();
        sw.Start();

        var imageSlotInMS = 1000.0/FPS;

        for (ulong grabbed = 0; !ct.IsCancellationRequested;)
        {
            var expectedTimePosInMS = grabbed * imageSlotInMS;

            var time2WaitInMS = expectedTimePosInMS - sw.Elapsed.TotalMilliseconds;
            if (time2WaitInMS > 0)
                await Task.Delay((int)time2WaitInMS);

            var image = await GrabImage();
            DisplayImage(image);
            grabbed++;
        }

        sw.Stop();
    }

في أسوأ الأحوال ، سوف تشغل على الأقل أقصى ما يمكن من FPS ، إذا كان أداء النظام لا يسمح بذلك.

ميزة أخرى لهذا النهج هو أنه يمكنك تنفيذ التقاط الصور على مؤشر ترابط مختلف والذي سيحرر مؤشر ترابط (UI) الأساسي من هذا الواجب ويجعله أكثر سلاسة.

0
وأضاف