0

Raspberry Pi の .netcore 5 で MMALSharp を使用しようとしています。Pi カメラを使用して、ビデオ ストリームを同じものを示す 2 つの画像に分割し、各ストリームに画像オーバーレイを追加したいと考えています。オーバーレイは同じになります。これは、双眼鏡ヘッドセットで使用されます。これまでのところ、カメラ パイプラインは次のようにレイアウトされています。

camera->splitter->renderer1
               \_>renderer2

これにより、カメラからのプレビュー ビデオ フィードが、それを表示する 2 つのウィンドウに適切に分割されます。各レンダラーにオーバーレイを追加する方法について悩んでいます。背景が透明な圧縮されていない RGBA 形式の png 画像を使用しています。add_overlay() メソッドを使用してPythonのPiCameraクラスで使用したため、画像は良好であり、期待どおりに機能します。

これまでのところ、2 つのプレビュー ウィンドウを表示するコードは次のとおりです。

m_Camera = MMALCamera.Instance;
            m_Camera.ConfigureCameraSettings();

            int xOffset = ((config.WindowSettings.DesktopWidth - config.VideoSettings.ResolutionWidth) / 2) 
                - (config.VideoSettings.ResolutionWidth / 2) 
                - (config.WindowSettings.WindowSpacing / 2);

            int yOffset = (config.WindowSettings.DesktopHeight - config.VideoSettings.ResolutionHeight) / 2;

            var configLeft = new PreviewConfiguration
            {
                Layer = 2,
                NoAspect = false,
                FullScreen = false,                
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset,
                    yOffset,
                    config.VideoSettings.ResolutionWidth,
                    config.VideoSettings.ResolutionHeight),
                DisplayTransform = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYTRANSFORM_T.MMAL_DISPLAY_ROT0,
                DisplayMode = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYMODE_T.MMAL_DISPLAY_MODE_LETTERBOX
            };
            var configRight = new PreviewConfiguration
            {
                Layer = 2,
                NoAspect = false,
                FullScreen = false,                
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset + config.VideoSettings.ResolutionWidth + config.WindowSettings.WindowSpacing,
                    yOffset, 
                    config.VideoSettings.ResolutionWidth,
                    config.VideoSettings.ResolutionHeight),
                DisplayTransform = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYTRANSFORM_T.MMAL_DISPLAY_ROT0,
                DisplayMode = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYMODE_T.MMAL_DISPLAY_MODE_LETTERBOX
            };

            m_Splitter = new MMALSplitterComponent();
            m_LeftRender = new MMALVideoRenderer(configLeft);
            m_LeftRender.ConfigureRenderer();
            m_RightRender = new MMALVideoRenderer(configRight);
            m_RightRender.ConfigureRenderer();
            m_NullSink = new MMALNullSinkComponent();

            m_Camera.Camera.VideoPort.ConnectTo(m_NullSink);
            m_Camera.Camera.PreviewPort.ConnectTo(m_Splitter);
            m_Splitter.Outputs[0].ConnectTo(m_LeftRender);
            m_Splitter.Outputs[1].ConnectTo(m_RightRender);

            m_Splitter.EnableComponent();
            m_LeftRender.EnableComponent();
            m_RightRender.EnableComponent();
            m_NullSink.EnableComponent();

オーバーレイに関する MMALSharp wiki の例に従ってみました。次のコードを使用しても機能せず、セグメンテーション エラーが発生しました。どんな助けでも大歓迎です。

byte[] imageBytes = File.ReadAllBytes(overlayFilePath);
var previewOverlayConfigLeft = new PreviewOverlayConfiguration()
            {
                Layer = 3,
                FullScreen = false,
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset,
                    yOffset,
                    m_Config.VideoSettings.ResolutionWidth,
                    m_Config.VideoSettings.ResolutionHeight),
                Encoding = MMALSharp.Common.MMALEncoding.RGBA
            };
m_LeftOverlayRenderer = m_Camera.AddOverlay(m_LeftRender, previewOverlayConfigLeft, imageBytes);
            m_LeftOverlayRenderer.ConfigureRenderer();
            m_LeftOverlayRenderer.UpdateOverlay();
4

0 に答える 0