Ovládání webové kamery   otázka

VB.NET, I/O operace, Grafika

Dobrý den,

pracuji ve Visual Studiu 2010 ve VB.Net a snažím se přijít na způsob jak fotit pomocí webové kamery, to by sám o sobě nebyl takový problém ale v tomto konkrétním případě jsou hodně důležitá nastavení šumu a expozice, případně další parametry jedině potěší.

Chápu, že to může být kameru od kamery různé, momentálně to testuji na nějaké verzi Logitec Quickcam kamery, vyzkoušel sem různé dll knihovny, skripty pomocí systémových knihoven ale zatím nic neumožňovalo tato nastavení. Byl bych rád, kdyby se problém podařilo vyřešit nějak obecněji nebo aspoň dostatečně jednoduše modifikovatelný pro jiná zařízení.

Za jakoukoliv radu, která pomůže vyřešit můj problém předem děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na webu se dají nalézt stovky příkladů. To ovládání jasu atd. je pro každou kameru stejné, používá se k tomu stejné API.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mohu vás požádat, aby jste mne na nějaký hodnotný příklad odkázal?

Před tím, než se ptám vždy hledám, vyzkoušel jsem toho opravdu hodně, i hodně přečetl, spousta příkladů byla na C/#/++, některé nebyly kompatibilní s 2010kou apod.

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Například zde:

http://www.codeproject.com/Articles/1851...

Buď jste nehledal, nebo neumíte používat Google.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Opravdu jsem hledal a google používat umím, jako ostatně většina informatiků, konkrétně tento příklad jsem neobjevil ale něco velice podobného, což jsem vyloučil z použitelných možností hlavně kvůli komplexnosti a jelikož nebylo při prvotním zkoumání patrné, zda to umí vyřešit nastavení expozice a šumu - přecijen několik hodin se učit nějaké komplexní řešení a nakonec zjistit že to třeba neumí, to co jsem po tom původně chtěl by bylo značně kontraproduktivní.

Pokud mi tedy říkáte, že to tato nastavení kamery podporuje, tak si to prostuduji, to už nebude problém. Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemůžete čekat, že práce s digitalizačním zařízením pomocí DirectShow bude hello world na deset řádků...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano to chápu, proto jsem doufal, že bude možnost to vyřešit pomocí nějaké té knihovny. Snažím se porozumět struktuře ale vzhledem k tomu, že není prakticky nic v češtině a angličtina je na této úrovni programování úplně nový jazyk samo o sobě :) tak mi to dělá trochu problémy. Nechápejte to tak, že bych anglicky neuměl ale číst běžný text a snažit se porozumět složitější struktuře programování je přeci jen rozdíl.

Inu k věci - kdyby bylo možné nějak mne ještě správně nasměrovat na něco co mi pomůže ovládat samotné nastavení kamery, byl bych velice vděčný.

Zatím se mi povedlo implementovat directshow do mé aplikace, což vzhledem k tomu příkladu asi nebudete považovat za veliký úspěch ale řešil sem ještě nějaké změny velikosti a pozicování výstupu. Teď ještě okrajově zjišťuji jak tomu nastavit konkrétní zařízení, když je jich připojených více ale abych byl upřímný, tak takto zmatenou strukturu jsem ještě neviděl. Visual Basic jsem si pro programování vybral také kvůli tomu, že takovéto hrozivé struktury byly v Cčku. (Chápu, že složité kódy existují všude)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Omlouvám se, ale nechápu proč jste vůči mne tak ofenzivní, obzvláště toho lituji jelikož se zdá, že jste jeden z mála aktivních členů komunity. Jen jsem se snažil několika lidem ze svého okolí usnadnit práci, chápu, že tu nejste od toho aby jste každému vysvětloval něco, co se vám jeví jako základy ale vzhledem k tomu, že jsem se ptal na konkrétní věc, čekal jsem přeci jen trochu konkrétnější odpověď :). Každopádně po přečtení nějakých těch článků a snaze pochopit systém, jakým se to používá již chápu, že bez další pomoci na tento problém nestačím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady budete muset pracovat přímo s DirectX, kde i jinak hezký .NET kód bude vypadat nehezky. Někdo se na něco podobného ptal na Stack Overflow:

http://stackoverflow.com/questions/32973...

Očividně tam existuje nějaké rozhraní IAMCameraControl, které umožňuje pohrát si s expozicí.

http://msdn.microsoft.com/en-us/library/...

Toto rozhraní ale stejně nepodporuje nastavení šumu a ne každý výrobce ho podporuje, někdy Vám nezbyde, než se poprat s konkrétními situacemi konkrétních výrobců a modelů a nad tím už žádnou abstrakci nenajdete, pokud jsou tak tvrdohlaví, že se nepodorují DX, nebudou zcela jistě podporovat ani nic jiného v tomto duchu.

Jinak pokud je o webkameru v C#, tento článek jsem našel dávno, ale nikdy jsem se nedostal k tomu si s tím pohrát. Možná se Vám bude hodit: http://www.codeproject.com/Articles/2859...

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Velice děkuji za odpověď, prozkoumám, vypadá to, že se mám aspoň čeho chytnout :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkouším použít ten IAMCameraControl, zdá se, že je to přesně to co potřebuji ale ta struktura samotného DirectShow je mi opravdu velkou záhadou, snažím se nějak dostat ke source toho zarizeni abych ho mohl požít třeba po stisku tlačítka, tak se zdá, že se tomu program brání ... definoval jsem si promennou srcCam, do ktere se z funkce FindCaptureDevice() snazim ulozit source a pouzit ho s mym kodem

Dim iamcc As IAMCameraControl = srcCam
        MsgBox(iamcc.Get(CameraControlProperty.Exposure, 60, CameraControlFlags.Auto))

doufam ze se jsem zvolil správný objekt, ale po spuštění to píše "COM object that has been separated from its underlying RCW cannot be used.", ještě jsem se s podobnou chybou nesetkal a nejsem si jist, zda jsem se vydal správným směrem, tak se radši ptám opět zde, všem co mi odpoví děkuji za trpělivost.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jen bych ještě rád ujasnil, že vím, že problém je kvůli používání více vláken (to mi bylo jasne už po přečteni toho tutorialu na directshow a ze znění té chyby) ale, nikdy jsem je nepoužíval, tak bych rád nějaké kvalitní vysvětlení, jak by se to dalo spravit :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady pravděpodobně nejde o vlákna, ale o to, jak funguje .NET - COM interoperabilita. Zde:

http://stackoverflow.com/a/2089449

Je k tomu možná relevantní povídání. Přiznám se, že já sám moc tomu, jak to funguje za oponou .NETu nerozumím, ale jak se tam dočtete, má to co dělat s tím, jak funguje garbage collecting a destruktory v COM vs. finalizéry v .NETu. Jestli uvažuji správně, někde Vám už CLR samo uvolnilo instanci toho COM interop wrapperu. Řešení mě napadá jediné: Používejte Using - End Using na všech třídách, které implementují IDisposable a místo instancí, které žijí po dlouhou dobu a přistupuje se k nim opakovaně, kde to jde, vždy objekt znovu vytvořte, použijte a hned zahoďte poté, co jej přestanete potřebovat.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Aha, děkuji, to mne nenapadlo ale jak to tak popisujete dává to smysl, asi to není úplně optimalizované, ale zkopíroval jsem z FindCaptureDevice funkce, vše co se zdálo podstatné pro to abych měl source k dispozici, můj kód nyní vypadá na tlačítku nějak takto

Dim hr As Integer = 0
        Dim classEnum As IEnumMoniker = Nothing
        Dim moniker As IMoniker() = New IMoniker(0) {}
        Dim source As Object = Nothing
        Dim devEnum As ICreateDevEnum = CType(New CreateDevEnum, ICreateDevEnum)
        hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, classEnum, 0)
        Debug.WriteLine("Create an enumerator for the video capture devices : " & DsError.GetErrorText(hr))
        DsError.ThrowExceptionForHR(hr)
        Marshal.ReleaseComObject(devEnum)
        If classEnum Is Nothing Then
            Throw New ApplicationException("No video capture device was detected.\r\n\r\n" & _
                           "This sample requires a video capture device, such as a USB WebCam,\r\n" & _
                           "to be installed and working properly.  The sample will now close.")
        End If
        If classEnum.Next(moniker.Length, moniker, IntPtr.Zero) = 0 Then
            Dim iid As Guid = GetType(IBaseFilter).GUID
            moniker(0).BindToObject(Nothing, Nothing, iid, source)
        Else
            Throw New ApplicationException("Unable to access video capture device!")
        End If
        Marshal.ReleaseComObject(moniker(0))
        Marshal.ReleaseComObject(classEnum)

        'POKUS
        Dim iamcc As IAMCameraControl = source
        MsgBox(iamcc.Get(CameraControlProperty.Exposure, 60, CameraControlFlags.Auto))

        Dim camExposure = InputBox("Zadejte expozici:", "Expozice", "")
        iamcc.Set(CameraControlProperty.Exposure, 60, CameraControlFlags.Auto)
        '--------------

už mne trápí jen jediná věc a to, že -2147023728, což to vypisuje asi nebude signalizace správného kódu, jednak se to číslo nepodobá ničemu v čem by se dala zadat expozice a jednak při pokusu ji přepsat pomocé toho inputboxu mne to opět vyhodí po znovuzmíčknutí tlačítka stejnou zápornou hodnotu, napadá mne, zda není nějaký problém způsobený deklarací všeho co jsem pojmul z toho FindCaptureDevice ale na druhou stranu, jsem si relativně jist, že si zařízení svá nastavení pamatuje a deklarace by neměla nic resetovat ale pokud se pletu tak mne opravte.

Omlouvám se, že stále otravuji, v této oblasti jsem relativně nováčkem ale pokouším se učit :)

Pokud vás napadá, čím by mohlo být způsobeno toto, byl bych vám vděčný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proměnnou camExposure vůbec nepoužíváte (v iamcc.Set) a doporučuji ji nadefinovat jako Double, takhle se Vám to políčko naplní jako Object nebo String, podle toho, co InputBox vrací, to si nepamatuji.

-2147023728 je zcela jistě kód chybové hlášky a součástí toho API zcela jistě existuje funkce jako GetLastError nebo GetError(errorCode), která vrátí human-readable popis chyby, který Vám řekne více. Tyhle kódy se nedají ani pořádně googlit, protože jsou to nějaké bitové masky a často tak pro různá API, aplikaci či dokonce platformy může jeden chybový kód znamenat různé věci, je to opravdu velmi závislé na kontextu. Zkuste nějak vypátrat, kde by se mohla nacházet ta funkce pro získání HR popisu chyby a můžeme se pohnout dále. Já Vám s tímto už bohužel nepomohu, protože se v těch API nevyznám a nemohu si dovolit obětovat tolik času, ale snad to najdete.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Opět děkuji, že je to kód chyby by mne nenapadlo, koukám je tam hodně nestandartních věcí při práci mimo .Net :D ... jaj máte pravdu, za to nenaplnění se omlouvám, to je opravdu trapná chyba, člověk byl nějak rozhozený tím chybovým číslem a věnoval menší pozornost tomu co píše, na ten error se podívám, aspoň už je mi jasné, proč tak divně pracují s chybami ale už se na to vyspím, cítím, že bych tam dnes vnesl více chyb než užitku, snad už se mi to podaří dořešit bez mnoha dalších otázek

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ta chyba je "The specified property ID is not supported for the specified property set" - hledal jsem pres den nejake reseni ale jediný záznam co jsem o tom našel byl v nějaké google group diskuzi o Ccku, doufal jsem, že už to dořeším sám ale asi se budu opět muset zeptat schopnějšího programátora /\ :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vaše kamera s největší pravděpodobností nezveřenuje API pro nastavení expozice, které by mohl DirectX využít. Ověřit si to můžete na jiné kameře (nejlépe od jiného výrobce), ale nic s tím bohužel neuděláte. Jedině pokud by se Vám podařilo nějakým způsobem přijít na to, jak programovat přímo danou kameru. Možná u ní bude nativní DLL knihovna, ze které byste mohl vyexportovat signatury veřejných funkcí a pak na to napsat managed wrapper a volat ty funkce, pokud budou dostatečně výmluvné na to, aby se Vám podařilo zjistit, co slouží k nastavení expozice a šumu. Pokud má k sobě kamera nějaký software od výrobce, který tohle umožňuje nastavit, tato nativní DLL tam bude jistě, pokud ne, jistota bohužel rapidně klesá. Píšete, že se snažíte usnadnit práci několika lidem, proto uvažuji, že jsou kamery nainstalované a v provozy a nepřichází v úvahu nahrazovat je jinými zařízeními. Pokud platí toho a neexistence veřejného API ovladače kamery (ta DLL knihovna), pak jste narazil na bohužel nerealizovatelný úkol.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To mne vlastně napadlo hned ze začátku, knihoven ten software má povícero ale žádná nevypadala právě moc slibně :) ... Ta kamera je trochu specificky upravená takže změna nebude úplně možná a chtěl jsem to udělat tak aby to podporovalo i CCD kameru, kterou rovněž používáme. Zajímalo by mne, jak to třeba řeší skype, který má toto nastavení snad pro všechny kamery tak nějaké rozumné řešení být musí ale soudím, že vzhledem k tomu, že skype je česky a okno nastavení kamery anglicky, že je to okno nastavení buď přímo nějak toho zařízení kamery nebo systémové, otázkou je zda by se dalo nějak zavolat. I když je mi jasné, že výrobce skypu má přecijen rozsáhlejší znalosti i možnosti :) ... Každopádně děkuji za vyčerpávající odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback