2008-10-24 26 views
22

Estoy haciendo un programa en C# para conectarme a una cámara web y hacer algunas manipulaciones de imagen con ella. Tengo una aplicación que funciona que usa api win32 (avicap32.dll) para conectarse a la cámara web y enviarle mensajes que la envía al portapapeles. El problema es que, aunque es accesible desde la pintura, leerlo del programa da como resultado punteros nulos.Uso de la cámara web en C#

Este es el código que utilizo para conectar la cámara web:

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); 

Y esto es lo que yo uso para copiar la imagen en el portapapeles:

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); 

Theres comprobación de errores que no tengo eliminado del código para hacerlo más corto.

Gracias de antemano :)

Respuesta

17

Recientemente he comenzado a hacer algunos pasatiempos en esta área.

Nos decidimos por utilizar la biblioteca OpenCV con el contenedor opencvdotnet. Es compatible con la captura de los fotogramas de una cámara web:

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

Y si está haciendo la manipulación de imágenes, algoritmos de procesamiento de imágenes de OpenCV haber sido envuelto dentro del conjunto OpenCVDotNet.Algs.

Si decide seguir esta ruta, asegúrese de instalar OpenCV versión 1.0 (e instálelo en "c: \ archivos de programa \ opencv" si está en Vista 64-bit, o "mklink OpenCV 'c: \ program archivos (x86) \ OpenCV` "del directorio correcto o de lo contrario opencvdotnet no se instalará).

+0

¡Gracias! Fui por esta ruta, después de maldecir un poco a Microsoft sobre misteriosos errores, instalé Visual C++ 2005 Express y funciona de maravilla ahora :) Por qué el paquete redistribuible no funcionó es anyones guess ... –

+4

OpenCV.NET ya no se mantiene muy activo, pruebe Emgu CV si no tiene suerte con OpenCV.NET –

0

¿Usted ha intentado Clipboard.GetImage()? También puede probar los diversos métodos Clipboard.Contains *() para ver qué formato se almacenan los datos en el portapapeles.

+0

He intentado eso. También devuelve nulo –

6

En realidad, hay dos maneras de obtener datos de la cámara en su aplicación, DirectShow y WIA. Microsoft recomienda que use WIA, y la interfaz para WIA es bastante simple para envolver su cerebro. Creé y publiqué un código abierto WIA desktop library basado en el trabajo que hice hace un tiempo.

Ahora el problema con WIA en algunos casos es que es demasiado simple. Por ejemplo, si quiere ajustar las propiedades de la cámara (como velocidad de fotogramas, resolución, etc.), WIA se cae. Microsoft desaprobó DirectShow, pero realmente no nos dieron ningún reemplazo que tenga todas sus capacidades, y descubrí que continúa funcionando bien en todas las plataformas existentes (está muy arraigado, por lo que no puedo imaginar que el soporte se vaya en cualquier momento).

Hay una muy buena DirectShow library over at SourceForge. El único "problema" es que es realmente complejo y se debe al hecho de que DShow es tan malditamente complejo y confuso en primer lugar. Hay muchas cosas que puede hacer el envoltorio que no son fáciles de resolver, pero proporcionan muestras para muchos casos de uso común, como mostrar video o capturar un marco. Si desea agregar superposiciones o insertar otros filtros, puede hacerlo, pero tenga en cuenta que no es para nada sencillo.

+0

En realidad, DirectShow es hoy en día el camino a seguir con Windows Vista y 7, y está lejos de ser desaprobado con las nuevas características que aún se agregan en las versiones más recientes de Windows. – Jonas

0

captura de OpenCV, captura EMGU y todas las demás bibliotecas de captura que he intentado
todos tienen el mismo problema: No se puede ir más alto que programáticamente 640x480
(sin abrir la ventana de origen ventanas de vídeo).

sugiere emplear este (que funciona):
https://github.com/ofTheo/videoInput

0

Esto también se le pidió en How to get web cam images in C#? y usted podría encontrar la siguiente utilidad (Lo siento por el correo basura, pero esto realmente ayuda a responder a la pregunta):

Acabo de lanzar el código fuente completo de mi aplicación para Windows CamTimer (escrito en .NET/C#). Descargar/ver el código completo (con ejemplos de Webcam en funcionamiento) en https://github.com/johanssonrobotics/CamTimer

Happy coding!