Domanda

Sto realizzando un programma in C # per connettermi a una webcam e manipolarne l'immagine. Ho un'applicazione funzionante che utilizza Win32 API (avicap32.dll) per connettersi alla webcam e inviare messaggi ad essa che lo invia negli Appunti. Il problema è che, sebbene accessibile da paint, leggerlo dal programma si traduce in puntatori null.

Questo è il codice che uso per connettere la webcam:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

E questo è quello che uso per copiare l'immagine negli appunti:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

C'è qualche errore nel controllo che ho rimosso dal codice per renderlo più breve.

Grazie in anticipo :)

È stato utile?

Soluzione

Di recente ho iniziato a fare hobby in quest'area.

Abbiamo deciso di utilizzare la OpenCV con il codice opencvdotnet wrapper. Supporta l'acquisizione di fotogrammi da una webcam:

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

E se stai manipolando l'immagine, gli algoritmi di elaborazione delle immagini di OpenCV sono stati racchiusi nell'assieme OpenCVDotNet.Algs.

Se decidi di seguire questa strada assicurati di installare OpenCV versione 1.0 (e installalo su " c: \ program files \ opencv " se sei su Vista 64-bit o " mklink OpenCV 'c: \ file di programma (x86) \ OpenCV` " dalla directory corretta altrimenti opencvdotnet non verrà installato).

Altri suggerimenti

Esistono davvero due modi per ottenere i dati della videocamera nell'applicazione, DirectShow e WIA. Microsoft consiglia di utilizzare WIA e l'interfaccia per WIA è abbastanza semplice per avvolgere il cervello. Ho creato e pubblicato una libreria desktop WIA open source basata sul lavoro L'ho fatto un po 'di tempo fa.

Ora il problema con WIA in alcuni casi è che è troppo semplice. Ad esempio, se si desidera regolare le proprietà della fotocamera (come frequenza dei fotogrammi, risoluzione, ecc.), WIA cade. Microsoft ha deprecato DirectShow, ma in realtà non ci hanno fornito alcun sostituto che abbia tutte le sue capacità e ho scoperto che continua a funzionare bene su tutte le piattaforme esistenti (è molto radicato, quindi non riesco a immaginare che il supporto vada via presto).

Esiste un'ottima libreria DirectShow su SourceForge . L'unico "problema" con esso è davvero complesso e ciò deriva dal fatto che DShow è così dannatamente complesso e confuso in primo luogo. Ci sono molte cose che il wrapper può fare e che non sono facili da elaborare, ma forniscono esempi per molti casi d'uso comuni come la visualizzazione di video o l'acquisizione di un fotogramma. Se vuoi aggiungere overlay o inserire altri filtri, puoi farlo, ma tieni presente che non è affatto semplice.

Dai un'occhiata a questo articolo: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

È molto più semplice dell'installazione e dell'utilizzo di OpenCVNetWrapper.

Hai provato Clipboard.GetImage ()? Puoi anche provare i vari metodi Clipboard.Contains * () per vedere in quale formato sono archiviati i dati negli appunti.

Acquisizione OpenCV, acquisizione EMGU e tutte le altre librerie di acquisizione che ho provato
tutti hanno lo stesso problema: non si può andare più in alto di 640x480 programmaticamente
(senza aprire la finestra della sorgente video di Windows).

Suggerisco di usare questo (che funziona):
https://github.com/ofTheo/videoInput

Questo è stato anche chiesto in Come ottenere immagini di webcam in C # ? e potresti trovare utile quanto segue (Ci scusiamo per lo spamming, ma questo aiuta davvero a rispondere alla domanda):

Ho appena rilasciato il codice sorgente completo della mia app Windows CamTimer (scritto in .NET / C #). Scarica / visualizza il codice completo (con esempi di webcam funzionanti) all'indirizzo https://github.com/johanssonrobotics/CamTimer

Buona codifica!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top