网络摄像头 - 摄像头预览旋转错误

jov*_*a85 10 c# wpf webcam directshow image-rotation

我想请你帮忙解决一下WebCamera问题.我使用过Nuget的图书馆; WebEye.Controls.Wpf.WebCameraControl(版本1.0.0).该URL为https://www.nuget.org/packages/WebEye.Controls.Wpf.WebCameraControl/

文章和说明可在以下网址获得:http://www.codeproject.com/Articles/330177/Yet-another-Web-Camera-control

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

我尝试解决问题无济于事.

  • 通过Webcamera RenderTransform或LayoutTransform属性旋转视频窗口周围的控件 - 控件旋转但视频图像无法正确旋转.
  • 试图在WebCamera内容属性中旋转VideoWindow - 我从GitHub获取源代码并设置VideoWindow可供访问.重新完成库并使用它通过其RenderTransform属性旋转VideoWindow.https://github.com/jacobbo/WebEye/tree/master/WebCameraControl

无论我做什么,相机预览总是-90度.

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

webcontrol在XAML中.

<wpf:WebCameraControl x:Name="webCameraControl" 
                              MouseDoubleClick="webCameraControl_MouseDoubleClick" 
                              StylusButtonUp="webCameraControl_StylusButtonUp" 
                              MouseUp="webCameraControl_MouseUp" 
                              TouchUp="webCameraControl_TouchUp" 
                              GotMouseCapture="webCameraControl_GotMouseCapture" 
                              />
Run Code Online (Sandbox Code Playgroud)

这就是我初始化WebCamera的方式.加载UserControl后,它将自动连接到平板电脑上的网络摄像头.请参见startViewing()函数.

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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

当应用程序检测到显示屏幕中的更改时,我试图强制控件正确旋转它.请参见DisplaySettingsChanged事件.

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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只旋转了WebCam控件,而不是视频图像.

我查看了亚历山大的文章中没有任何喜悦的评论:http://www.codeproject.com/Articles/330177/Yet-another-Web-Camera-control

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

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

景观

肖像

Lup*_*viu 7

如果您不是C#的陌生人,我建议您使用EMGUCV nuget并创建自己的预览应用程序.它并不那么难,你可以使用MVVM将框架绑定到View,使其比使用控件后面的代码更好.

PS:这不是答案,但它是解决您的问题的方法.我不能发表评论,因为我没有50分:(

祝你今天愉快.

  • 绑定帧是一个非常糟糕的想法,特别是当新帧到达高FPS时.WPF绑定引擎无法管理它,也没有为此类任务创建. (2认同)
  • @LupuSilviu,绑定引擎无法保证稳定的FPS,因为它是由一个`Dispatcher`驱动的,它根据优先级对任务进行排序.如果您的解决方案适用于您的特定情况,我很高兴,但如果您尝试在您的应用程序中运行并行任务(它消耗CPU并使用`Dispatcher`),您将永远无法获得平滑的视频"但它宁愿冻结和毛刺. (2认同)