2016-10-27 16 views
10

Я бы хотел, чтобы ваша помощь понравилась по проблеме 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

благодаря проекту ограничений, я разработал приложение WPF для планшета Linx (Windows 10), а не в качестве универсального приложения Windows. Я использовал библиотеку WebEye для подключения к веб-камере на планшете и сфотографироваться с ней. Он отлично работает, когда я держу планшет в ландшафте, но не тогда, когда я держу планшет в портретном режиме. В портретном режиме CameraPreview/VideoWindow автоматически поворачивается на -90 градусов.

Я пробовал решить проблему безрезультатно.

  • Поверните элемент управления, окружающий видеоокно, через свойство Web-камеры RenderTransform или LayoutTransform. Элемент управления вращается, но видеоизображение не вращается правильно.
  • Пробовал вращать VideoWindow внутри свойства содержимого WebCamera. Я получил исходный код из GitHub и установил VideoWindow для доступа. Скомпилировал библиотеку и использовал ее для поворота VideoWindow с помощью свойства RenderTransform. https://github.com/jacobbo/WebEye/tree/master/WebCameraControl

Независимо от того, что я делаю, предварительный просмотр камеры всегда равен -90 градусов.

Библиотека проста, и у нее нет многих свойств для управления видеоокном.

Веб-контроль находится в 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

+2

Поскольку эта библиотека кажется, основана на DIrecthShow, я хотел бы предложить вам прочитать [этот ответ] (HTTP : //stackoverflow.com/a/30196905/2846483). Короче говоря: нет простого способа сделать это. Вам либо нужно написать свой собственный механизм предварительного просмотра, либо создать собственный фильтр DirectShow, который сделает трюк и чтобы добавить его в граф захвата. – dymanoid

ответ

7

В случае, если вы не новичок в C#, я бы порекомендовал вам использовать EMGUCV NuGet и создать собственное приложение предварительного просмотра. Это не так сложно, и вы можете использовать MVVM для привязки фреймов к вашему представлению, что делает его лучше, чем использование кода, находящегося под вашим контролем.

PS: Это не ответ, но это решение вашей проблемы. Я не могу не оставлять комментарии, так как у меня нет 50 очков :(

имеет хороший день.

+2

Связанные фреймы - это ** очень ** плохая идея, особенно когда новые кадры прибывают на высокий FPS. Механизм привязки WPF не может справиться с этим, и он не был создан для таких задач. – dymanoid

+0

Well если это решение его проблемы, это * ответ * :) +1 – Cullub

+1

@dymanoid, это зависит от того, что fi цель. Если это только приложение для предварительного просмотра, достаточно показать 30-60 кадров в секунду. Но если это инструмент высокого уровня, наблюдения и обработки, тогда вы правы. Я использовал эту библиотеку nuget для создания aps, которые используют камеру, и отображают 30 кадров в секунду, и все в порядке. У меня нет проблем. –

 Смежные вопросы

  • Нет связанных вопросов^_^