Beispiel #1
0
                public BasicCamLoopState UpdateState(BasicCamLoopState state, ButtonCommands button)
                {
                    int i = (int)state;
                    int j = (int)button;

                    return(nextState[i, j]);
                }
Beispiel #2
0
                public BasicStreamController(OryxCamera oryxCamera)
                {
                    manager = oryxCamera.manager;
                    if (manager.output.nChannels != 1)
                    {
                        throw new Exception(message: "BasicStreamInfo accommodates only one output channel!");
                    }

                    messageQueue = oryxCamera.messageQueue;
                    Console.WriteLine("messageQueue: {0}", messageQueue);
                    managedCamera  = oryxCamera.managedCamera;
                    inputSize      = manager.input.inputChannel.imageSize;
                    streamQueue    = manager.output.streamQueue;
                    outputSize     = manager.output.outputChannels[0].imageSize;
                    enqueueRate    = manager.output.outputChannels[0].enqueueOrDequeueRate;
                    isResizeNeeded = !Equals(objA: manager.input.inputChannel.imageSize, objB: manager.output.outputChannels[0].imageSize);
                    handler        = new MessageHandler.BasicMessageHandler(style: MessageHandlerStyle.Basic);
                    state          = BasicCamLoopState.Waiting;
                }
Beispiel #3
0
                public void Run()
                {
                    Console.WriteLine("Run was called");
                    while (true)
                    {
                        if (state == BasicCamLoopState.Waiting)
                        {
                            isMessageDequeueSuccess = messageQueue.TryDequeue(out ButtonCommands message);
                            if (isMessageDequeueSuccess)
                            {
                                Console.WriteLine("message received on camera: {0}", message);
                                state = handler.UpdateState(state: state, button: message);

                                if (state == BasicCamLoopState.Streaming && !managedCamera.IsStreaming())
                                {
                                    ResetCounter();
                                    managedCamera.BeginAcquisition();
                                }
                                continue;
                            }

                            Thread.Sleep(100);
                            continue;
                        }

                        else if (state == BasicCamLoopState.Streaming)
                        {
                            try
                            {
                                using (IManagedImage rawImage = managedCamera.GetNextImage())
                                {
                                    imageCtr += 1;
                                    long frameID   = rawImage.ChunkData.FrameID;
                                    long timestamp = rawImage.ChunkData.Timestamp;

                                    if (imageCtr == 1)
                                    {
                                        currFrameMetaData = new FrameMetaData(streamCtr: imageCtr, frameID: frameID, timestamp: timestamp);
                                        continue;
                                    }

                                    prevFrameMetaData = currFrameMetaData;
                                    currFrameMetaData = new FrameMetaData(streamCtr: imageCtr, frameID: frameID, timestamp: timestamp);

                                    if (imageCtr % enqueueRate == 0)
                                    {
                                        Mat fullMat = new Mat(rows: inputSize.Height, cols: inputSize.Width,
                                                              type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1, data: rawImage.DataPtr, step: inputSize.Width);

                                        if (isResizeNeeded)
                                        {
                                            Mat resizedMat = new Mat(size: outputSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1);
                                            CvInvoke.Resize(src: fullMat, dst: resizedMat, dsize: outputSize, interpolation: Emgu.CV.CvEnum.Inter.Linear);
                                            Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: resizedMat, metaData: currFrameMetaData);
                                            streamQueue.Enqueue(item: output);
                                            fullMat.Dispose();
                                        }
                                        else
                                        {
                                            Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: fullMat, metaData: currFrameMetaData);
                                            streamQueue.Enqueue(item: output);
                                        }
                                    }
                                }
                            }
                            catch (SpinnakerException ex)
                            {
                                Console.WriteLine("Error in SimpleStreamingLoop: {0}", ex.Message);
                            }

                            isMessageDequeueSuccess = messageQueue.TryDequeue(out ButtonCommands message);
                            if (isMessageDequeueSuccess)
                            {
                                state = handler.UpdateState(state: state, button: message);
                            }
                        }

                        else if (state == BasicCamLoopState.Recording)
                        {
                            try
                            {
                                using (IManagedImage rawImage = managedCamera.GetNextImage())
                                {
                                    imageCtr += 1;
                                    long frameID   = rawImage.ChunkData.FrameID;
                                    long timestamp = rawImage.ChunkData.Timestamp;

                                    if (imageCtr == 1)
                                    {
                                        currFrameMetaData = new FrameMetaData(streamCtr: imageCtr, frameID: frameID, timestamp: timestamp);
                                        continue;
                                    }

                                    prevFrameMetaData = currFrameMetaData;
                                    currFrameMetaData = new FrameMetaData(streamCtr: imageCtr, frameID: frameID, timestamp: timestamp);

                                    if (imageCtr % enqueueRate == 0)
                                    {
                                        Mat fullMat = new Mat(rows: inputSize.Height, cols: inputSize.Width,
                                                              type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1, data: rawImage.DataPtr, step: inputSize.Width);

                                        if (isResizeNeeded)
                                        {
                                            Mat resizedMat = new Mat(size: outputSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1);
                                            CvInvoke.Resize(src: fullMat, dst: resizedMat, dsize: outputSize, interpolation: Emgu.CV.CvEnum.Inter.Linear);
                                            Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: resizedMat, metaData: currFrameMetaData);
                                            streamQueue.Enqueue(item: output);
                                            fullMat.Dispose();
                                        }
                                        else
                                        {
                                            Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: fullMat, metaData: currFrameMetaData);
                                            streamQueue.Enqueue(item: output);
                                        }
                                    }
                                }
                            }
                            catch (SpinnakerException ex)
                            {
                                Console.WriteLine("Error in SimpleStreamingLoop: {0}", ex.Message);
                            }

                            isMessageDequeueSuccess = messageQueue.TryDequeue(out ButtonCommands message);
                            if (isMessageDequeueSuccess)
                            {
                                state = handler.UpdateState(state: state, button: message);
                            }
                        }

                        else if (state == BasicCamLoopState.Exit)
                        {
                            return;
                        }
                    }
                }