コード例 #1
0
ファイル: ThreadManager.cs プロジェクト: blobology/FetchRig6
        public static void MergeStreamsThreadInit(MergeStreamsManager manager)
        {
            int  imageCtr = 0;
            bool isMessageDequeueSuccess;
            int  nQueues = manager.input.nInputQueues;

            bool[]          isInputDequeueSuccess = new bool[nQueues];
            StreamLoopState state = StreamLoopState.Waiting;

            Tuple <Mat, FrameMetaData>[][] input;

            while (true)
            {
                UpdateLoopState();
                if (state == StreamLoopState.Waiting)
                {
                    Thread.Sleep(100); continue;
                }
                else if (state == StreamLoopState.Exit)
                {
                    return;
                }

                input = new Tuple <Mat, FrameMetaData> [nQueues][];
                for (int i = 0; i < nQueues; i++)
                {
                    while (true)
                    {
                        isInputDequeueSuccess[i] = manager.input.streamQueues[i].TryDequeue(out input[i]);
                        if (isInputDequeueSuccess[i])
                        {
                            isInputDequeueSuccess[i] = false;
                            break;
                        }
                        else
                        {
                            UpdateLoopState();
                            if (state == StreamLoopState.Streaming)
                            {
                                continue;
                            }
                            else if (state == StreamLoopState.Waiting)
                            {
                                Thread.Sleep(100);
                            }
                            else if (state == StreamLoopState.Exit)
                            {
                                return;
                            }
                        }
                    }
                }

                ProcessInput();
                continue;

                void ProcessInput()
                {
                    imageCtr += 1;

                    if (imageCtr % manager.output.outputChannels[0].enqueueOrDequeueRate != 0)
                    {
                        input[0][0].Item1.Dispose();
                        input[1][0].Item1.Dispose();
                        return;
                    }

                    Mat outputMat = new Mat(size: manager.output.outputChannels[0].imageSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1);

                    CvInvoke.VConcat(src1: input[0][0].Item1, src2: input[1][0].Item1, dst: outputMat);
                    FrameMetaData outputMeta = input[0][0].Item2;

                    Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: outputMat, metaData: outputMeta);
                    manager.output.displayQueue.Enqueue(item: output);
                }

                void UpdateLoopState()
                {
                    isMessageDequeueSuccess = manager.messageQueue.TryDequeue(out ButtonCommands message);
                    if (isMessageDequeueSuccess)
                    {
                        if (message == ButtonCommands.BeginStreaming)
                        {
                            Console.WriteLine("BeginStreaming command received in MergeStreamsThread");
                            state = StreamLoopState.Streaming;
                        }
                        else if (message == ButtonCommands.EndStreaming)
                        {
                            Console.WriteLine("EndStreaming command received in MergeStreamsThread");
                            state = StreamLoopState.Waiting;
                        }
                        else if (message == ButtonCommands.Exit)
                        {
                            state = StreamLoopState.Exit;
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: ThreadManager.cs プロジェクト: blobology/FetchRig6
        public static void SingleStreamThreadInit(int idx, SingleStreamManager manager)
        {
            int             imageCtr        = 0;
            bool            isResizeNeeded  = false;
            Mat             background      = new Mat(size: manager.output.outputChannels[0].imageSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1);
            bool            resetBackground = true;
            bool            saveThisImage   = false;
            bool            isMessageDequeueSuccess;
            bool            isInputDequeueSuccess;
            StreamLoopState state = StreamLoopState.Waiting;

            while (true)
            {
                isInputDequeueSuccess = manager.input.streamQueue.TryDequeue(out Tuple <Mat, FrameMetaData>[] input);
                if (isInputDequeueSuccess)
                {
                    ProcessInput();
                }

                UpdateLoopState();
                if (state == StreamLoopState.Streaming)
                {
                    continue;
                }
                else if (state == StreamLoopState.Waiting)
                {
                    Thread.Sleep(100);
                }
                else if (state == StreamLoopState.Exit)
                {
                    return;
                }

                void ProcessInput()
                {
                    imageCtr += 1;
                    if (imageCtr % manager.input.inputChannels[0].enqueueOrDequeueRate != 0)
                    {
                        input[0].Item1.Dispose();
                        return;
                    }

                    if (isResizeNeeded)
                    {
                        // TODO: Implement resize operation
                    }

                    if (saveThisImage)
                    {
                        Console.WriteLine("SaveThisImage message received on SingleStreamThread");
                        saveThisImage = false;
                    }

                    if (resetBackground)
                    {
                        Console.WriteLine("ResetBackground message received on SingleStreamThread");
                        input[0].Item1.CopyTo(background);
                        resetBackground = false;
                        Console.WriteLine("resetBackground = false");
                    }

                    if (imageCtr % manager.output.outputChannels[0].enqueueOrDequeueRate != 0)
                    {
                        input[0].Item1.Dispose();
                        return;
                    }
                    else
                    {
                        manager.output.streamQueue.Enqueue(item: input);
                    }
                }

                void UpdateLoopState()
                {
                    isMessageDequeueSuccess = manager.messageQueue.TryDequeue(out ButtonCommands message);
                    if (isMessageDequeueSuccess)
                    {
                        if (message == ButtonCommands.BeginStreaming)
                        {
                            Console.WriteLine("BeginStreaming command received in SingleStreamThread");
                            state = StreamLoopState.Streaming;
                        }
                        else if (message == ButtonCommands.ResetBackgroundImage)
                        {
                            resetBackground = true;
                        }
                        else if (message == ButtonCommands.SaveThisImage)
                        {
                            saveThisImage = true;
                        }
                        else if (message == ButtonCommands.EndStreaming)
                        {
                            state = StreamLoopState.Waiting;
                        }
                        else if (message == ButtonCommands.Exit)
                        {
                            state = StreamLoopState.Exit;
                        }
                    }
                }
            }
        }