Beispiel #1
0
        private void Form2_Load(object sender, EventArgs e)
        {
            YUVio imgReader = null;

            try
            {
                imgReader = new YUVio(fpath, width, height, colorFormat);
            }
            catch (Exception e2)
            {
                //エラーメッセージ取得後終了
                receiveText = e2.Message;
                this.Close();
                return;
            }

            if (!frameLock)
            {
                Bitmaps = new Bitmap[imgReader.MaxFrameCount];

                imgReadTask     = YUVReadTask(imgReader, Bitmaps);
                timer.Interval  = (int)(1000 / fps);
                timer.Elapsed  += new ElapsedEventHandler(timer_Tick);
                timer.AutoReset = true;
                timer.Start();
            }
            else
            {
                Mat matImages = new Mat();
                matImages         = YUV2Mat.YUV2MatBGR(imgReader.ReadImage(), 1, 0);
                pictureBox1.Image = matImages.ToBitmap();
            }
        }
Beispiel #2
0
        /// <summary>
        /// YUV動画をMat配列に格納するためのTask
        /// </summary>
        /// <param name="imgReader">Mat配列に格納したいYUVioインスタンス</param>
        /// <param name="matImgs">変換された結果を入れる配列</param>
        /// <returns></returns>
        private async Task YUVReadTask(YUVio imgReader, Bitmap[] Bitmaps)
        {
            if (_tokenSource == null)
            {
                _tokenSource = new CancellationTokenSource();
            }
            var token = _tokenSource.Token;

            // ワーカースレッドが生成される
            Task task = Task.Factory.StartNew(() =>
            {
                Object locker = new Object();
                Parallel.For(0, imgReader.MaxFrameCount, i =>
                {
                    int procIndex;
                    YUV img;
                    Mat mat;
                    lock (locker)
                    {
                        //排他制御をかけて、YUVをファイルから読み出す
                        img       = imgReader.ReadImage();
                        procIndex = imgReader.ReadFrameCount;
                    }
                    //変換を行い配列に格納
                    mat = YUV2Mat.YUV2MatBGR(img, 1, 1);
                    Bitmaps[procIndex] = mat.ToBitmap();
                });
            }, token).ContinueWith(t =>
            {
                // TODO:あとしまつ
                _tokenSource.Dispose();
                _tokenSource = null;
                if (t.IsCanceled)
                {
                    throw new TaskCanceledException();
                }
            });

            // 処理が完了するのを非同期的に待機
            await task;
        }