C# 网络摄像头-摄像头预览旋转方向错误

C# 网络摄像头-摄像头预览旋转方向错误,c#,wpf,webcam,directshow,image-rotation,C#,Wpf,Webcam,Directshow,Image Rotation,我想请你帮我解决一个网络摄像机的问题。我使用了Nuget提供的一个库;WebEye.Controls.Wpf.WebCameraControl(版本1.0.0)。网址是 有关文章和说明,请访问: 由于项目限制,我为Linx平板电脑(Windows 10)开发了WPF应用程序,而不是作为通用Windows应用程序。我使用WebEye库连接到平板电脑上的网络摄像头并用它拍照。当我在横向模式下握住平板电脑时,它可以正常工作,但在纵向模式下握住平板电脑时则不行。在纵向模式下,CameraPreview/

我想请你帮我解决一个网络摄像机的问题。我使用了Nuget提供的一个库;WebEye.Controls.Wpf.WebCameraControl(版本1.0.0)。网址是

有关文章和说明,请访问:

由于项目限制,我为Linx平板电脑(Windows 10)开发了WPF应用程序,而不是作为通用Windows应用程序。我使用WebEye库连接到平板电脑上的网络摄像头并用它拍照。当我在横向模式下握住平板电脑时,它可以正常工作,但在纵向模式下握住平板电脑时则不行。在纵向模式下,CameraPreview/VideoWindow会自动旋转-90度

我试图解决这个问题,但没有结果

  • 通过Webcamera RenderTransform或LayoutTransform属性旋转视频窗口周围的控件–控件旋转,但视频图像旋转不正确
  • 尝试在WebCamera内容属性内旋转视频窗口-我从GitHub获得了源代码,并设置了可访问的视频窗口。重新编译库并使用它通过RenderTransform属性旋转视频窗口
无论我做什么,相机预览总是-90度

该库很简单,没有很多属性来操作视频窗口

网络控件使用XAML

<wpf:WebCameraControl x:Name="webCameraControl" 
                              MouseDoubleClick="webCameraControl_MouseDoubleClick" 
                              StylusButtonUp="webCameraControl_StylusButtonUp" 
                              MouseUp="webCameraControl_MouseUp" 
                              TouchUp="webCameraControl_TouchUp" 
                              GotMouseCapture="webCameraControl_GotMouseCapture" 
                              />
到目前为止,我只旋转了网络摄像头控件,没有旋转视频图像

我浏览了Alexander文章中的评论,对以下内容毫无兴趣:

如何正确旋转相机预览?你能告诉我哪里出了问题吗

我附上了两张图片来说明我的问题


如果您对C#并不陌生,我建议您使用EMGUCV nuget并创建自己的预览应用程序。这并不难,您可以使用MVVM将帧绑定到视图,这比在控件后面使用代码要好

附言:这不是一个答案,但它是你问题的解决方案。我还不能发表评论,因为我没有50分:(


祝您愉快。

由于此库似乎基于DirectShow,我建议您阅读。简而言之,没有简单的方法可以做到这一点。您要么编写自己的预览引擎,要么创建自己的DirectShow筛选器来完成此操作并将其添加到捕获图中。绑定帧是一个非常糟糕的主意,尤其是当新帧到达高FPS时,会出现延迟。WPF绑定引擎无法处理这一点,也不是为此类任务创建的。如果这是对他的问题的解决方案,那么它就是一个答案:)+1@dymanoid,这取决于最终目标是什么。如果这只是一个预览应用程序,它就足以显示30-60 fps。但如果这是一个高端的观察和处理工具,那么你是对的。我使用nuget库创建了使用相机的AP,并以30 fps的速度渲染,它s ok。我没有问题。@LupuSilviu,绑定引擎不能保证稳定的FPS,因为它由
调度程序驱动,该调度程序根据任务的优先级对任务进行排序。我很高兴您的解决方案能够在您的特定情况下工作,但如果您尝试在应用程序中运行并行任务(这会消耗CPU并使用
调度程序
),您将永远无法获得平滑的“视频”,但它将冻结并出现故障。
private WebCameraId _cameraID = null;

private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            startViewing();
        }

private void startViewing()
        {
            List<WebCameraId> cams = (List<WebCameraId>)webCameraControl.GetVideoCaptureDevices();

            if (cams.Count > 0)
            {
                _cameraID = (WebCameraId)cams[0];

                webCameraControl.StartCapture(_cameraID);
            }
        }
public ucWebCam()
{
    InitializeComponent();

    Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;
}

private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
    try
    {
        double angle = 0;

        if (SystemParameters.PrimaryScreenWidth > SystemParameters.PrimaryScreenHeight)
        {
            angle = 0;
        }
        else
        {
            angle = -90;
        }

        webCameraControl.StopCapture();

        adjustWebcamAngle(angle);

        webCameraControl.StartCapture(_cameraID);

    }
    catch (Exception ex)
    {

    }
}

private void adjustWebcamAngle(double angle)
{

    try
    {
        // IGNORE portrait boolean flag
        bool portrait = false; 

        if (angle == 90 || angle == 180)
        {
            portrait = true;
        }

        // TRIED TO SET THE ANGLE OF THE CONTROL TO NO AVAIL
        RotateTransform rotTransform = new RotateTransform(angle);
        //rotTransform.Angle = angle;

        ScaleTransform scaleTransform = new ScaleTransform();
        //scaleTransform.ScaleX = (portrait) ? 0 : 1;
        //scaleTransform.ScaleY = (portrait) ? 0 : 1;

        TransformGroup tGroup = new TransformGroup();                
        //tGroup.Children.Add(scaleTransform);
        tGroup.Children.Add(rotTransform);

        // ROTATE CAMERA!
        webCameraControl.RenderTransform = tGroup;

    } catch (Exception ex)
    {

    }
}