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

时间:2016-10-27 15:14:34

标签: c# wpf webcam directshow image-rotation

我希望您对WebCamera问题有所帮助。我使用过Nuget提供的图书馆; WebEye.Controls.Wpf.WebCameraControl(版本1.0.0)。网址为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" 
                              />

这是我初始化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);
            }
        }

当应用在“显示”屏幕中检测到更改时,我尝试强制控件正确旋转。请参阅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)
    {

    }
}

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

我查看了亚历山大的文章中的评论,并没有感到高兴:http://www.codeproject.com/Articles/330177/Yet-another-Web-Camera-control

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

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

LandScape

Portrait

1 个答案:

答案 0 :(得分:7)

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

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

度过愉快的一天。