网络摄像头 - 相机预览旋转错误的方式

Posted

技术标签:

【中文标题】网络摄像头 - 相机预览旋转错误的方式【英文标题】:Webcam - Camera Preview rotates wrong way 【发布时间】:2017-03-10 08:34:25 【问题描述】:

我希望您能就网络摄像头问题提供帮助。我使用了 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 Content 属性中旋转 VideoWindow - 我从 GitHub 获取源代码并将 VideoWindow 设置为可供访问。重新编译库并使用它通过其 RenderTransform 属性旋转 VideoWindow。 https://github.com/jacobbo/WebEye/tree/master/WebCameraControl

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

这个库很简单,它没有太多的属性来操作视频窗口。

Web 控件采用 XAML 格式。

<wpf:WebCameraControl x:Name="webCameraControl" 
                              MouseDoubleClick="webCameraControl_MouseDoubleClick" 
                              StylusButtonUp="webCameraControl_StylusButtonUp" 
                              MouseUp="webCameraControl_MouseUp" 
                              TouchUp="webCameraControl_TouchUp" 
                              GotMouseCapture="webCameraControl_GotMouseCapture" 
                              />

这就是我初始化网络摄像头的方式。加载 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 控件,而不是视频图像。

我不高兴地浏览了 Alexander 文章中的 cmets:http://www.codeproject.com/Articles/330177/Yet-another-Web-Camera-control

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

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

【问题讨论】:

由于这个库似乎是基于 DIrecthShow,我建议你阅读this answer。简而言之:没有简单的方法可以做到这一点。您要么必须编写自己的预览引擎,要么必须创建自己的 DirectShow 过滤器来解决问题并将其添加到捕获图中。 【参考方案1】:

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

PS:这不是答案,而是解决您的问题的方法。我还不能发布 cmets,因为我没有 50 分 :(

祝你有美好的一天。

【讨论】:

绑定帧是一个非常的坏主意,尤其是当新帧以高 FPS 到达时。 WPF 绑定引擎无法管理它,也不是为此类任务创建的。 好吧,如果这是他的问题的解决方案,它一个答案:) +1 @dymanoid,这取决于最终目标是什么。如果这只是一个预览应用程序,它s enough to show 30-60 fps. But if this is a high end, observation and processing tool, then you are right. I used that nuget library to create aps that use the camera, and render 30 fps, and its ok。我没有问题。 @LupuSilviu,绑定引擎不能保证稳定的 FPS,因为它是由 Dispatcher 驱动的,它根据任务的优先级对任务进行排序。如果您的解决方案适用于您的特定情况,我很高兴,但如果您尝试在应用程序中运行并行任务(这会消耗 CPU 并同时使用 Dispatcher),您将永远无法获得流畅的“视频” " 但它宁愿冻结和故障。

以上是关于网络摄像头 - 相机预览旋转错误的方式的主要内容,如果未能解决你的问题,请参考以下文章

Android相机旋转肖像模式图片

Android相机预览始终是侧面的

使用表面纹理的相机预览

如何让视频有camera

如何在电子应用程序中访问相机/网络摄像头?

Android CameraX 图像旋转