2016-10-27 58 views
10

मैं आपकी सहायता चाहूंगा कृपया वेबकैमरा समस्या पर। मैंने 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 टैबलेट के लिए एक WPF आवेदन (Windows 10) विकसित की है। मैंने टैबलेट पर वेबकैम से कनेक्ट करने और इसके साथ चित्र लेने के लिए वेबई लाइब्रेरी का उपयोग किया। जब मैं टैबलेट को परिदृश्य में रखता हूं तो यह ठीक काम करता है, लेकिन जब मैं पोर्ट्रेट मोड में टैबलेट नहीं रखता हूं। पोर्ट्रेट मोड में, कैमराप्रवाह/वीडियोविंडो स्वचालित रूप से -90 डिग्री घुमाता है।

मैंने समस्या का समाधान करने का प्रयास नहीं किया।

  • वेब कैमरारा रेंडरट्रांसफॉर्म या लेआउटट्रांसफॉर्म प्रॉपर्टी के माध्यम से वीडियो विंडो के आस-पास के नियंत्रण को घुमाएं - नियंत्रण घुमाता है लेकिन वीडियो छवि सही ढंग से घूमती नहीं है।
  • वेबकैमरा सामग्री संपत्ति के अंदर वीडियोविंडो को घुमाने की कोशिश की - मुझे गिटहब से स्रोत कोड मिला और वीडियोविंडो को एक्सेस के लिए उपलब्ध कराया गया। लाइब्रेरी को दोबारा लगाया और वीडियोविंडो को अपनी रेंडरट्रांसफॉर्म प्रॉपर्टी के माध्यम से घुमाने के लिए इसका इस्तेमाल किया। https://github.com/jacobbo/WebEye/tree/master/WebCameraControl

कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, कैमरा पूर्वावलोकन हमेशा -90 डिग्री होता है।

लाइब्रेरी सरल है और इसमें वीडियो विंडो में हेरफेर करने के लिए कई गुण नहीं हैं।

वेबcontrol 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) 
    { 

    } 
} 

अब तक मैंने केवल वेबकैम नियंत्रण को घुमाया है, न कि वीडियो छवि। http://www.codeproject.com/Articles/330177/Yet-another-Web-Camera-control

मैं कैसे कैमरा पूर्वावलोकन सही ढंग से बारी बारी से कर सकते हैं:

मैं में कोई खुशी से सिकंदर के लेख में टिप्पणियों के माध्यम से देखा? क्या आप कृपया सलाह दे सकते हैं कि मैं गलत कहां जा रहा हूं?

मैंने अपनी समस्या का वर्णन करने के लिए दो छवियां संलग्न की हैं।

LandScape

Portrait

+2

के बाद से इस पुस्तकालय DIrecthShow के आधार पर किया जा रहा है, मैं तुम्हें [इस उत्तर] (पढ़ने के लिए http सुझाव है : //stackoverflow.com/a/30196905/2846483)। संक्षेप में: ऐसा करने के लिए कोई आसान तरीका नहीं है। आपको या तो अपना खुद का पूर्वावलोकन इंजन लिखना होगा, या आपको अपना खुद का डायरेक्टशो फ़िल्टर बनाना होगा जो चाल करता है और इसे कैप्चर ग्राफ़ में जोड़ने के लिए। – dymanoid

उत्तर

7

मामले में आप सी # के लिए एक अजनबी नहीं हैं, मैं तुम्हें EmguCV nuget का उपयोग करें और अपने खुद के पूर्वावलोकन आवेदन बनाने की सिफारिश करेंगे। यह मुश्किल नहीं है, और आप अपने दृश्य में फ्रेम को बांधने के लिए एमवीवीएम का उपयोग कर सकते हैं, जिससे इसे आपके नियंत्रण के पीछे कोड का उपयोग करने से बेहतर बना दिया जा सकता है।

पीएस: यह कोई जवाब नहीं है, लेकिन यह आपकी समस्या का समाधान है। मैं अभी तक टिप्पणी पोस्ट नहीं कर सकते नहीं, जैसा कि मैंने 50 अंक :(

आपका दिन शुभ हो नहीं है।

+2

बाध्यकारी फ्रेम एक ** बहुत ** बुरा विचार है, खासकर जब नए फ्रेम उच्च FPS पर पहुंचते हैं। WPF बाध्यकारी इंजन इसे प्रबंधित नहीं कर सकता है, न ही इस तरह के कार्यों के लिए बनाया गया था। – dymanoid

+0

खैर अगर यह उसकी समस्या का समाधान है, तो यह * एक उत्तर है :) +1 – Cullub

+1

@dymanoid, यह इस बात पर निर्भर करता है कि फाई क्या है नल लक्ष्य है। यदि यह केवल एक पूर्वावलोकन अनुप्रयोग है तो यह 30-60 एफपीएस दिखाने के लिए पर्याप्त है। लेकिन अगर यह एक उच्च अंत, अवलोकन और प्रसंस्करण उपकरण है, तो आप सही हैं। मैंने कैमरे का उपयोग करने वाले एपी बनाने के लिए उस न्यूज लाइब्रेरी का उपयोग किया, और 30 एफपीएस प्रस्तुत किया, और यह ठीक है। मुझे कोई समस्या नहीं है। –

संबंधित मुद्दे