Pregunta

Estoy haciendo un programa en C # para conectarme a una cámara web y manipular algunas imágenes con ella. Tengo una aplicación que funciona que utiliza win32 api (avicap32.dll) para conectarse a la cámara web y enviarle mensajes que la envían al portapapeles. El problema es que, aunque es accesible desde Paint, leerlo desde el programa da como resultado punteros nulos.

Este es el código que uso 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 uso para copiar la imagen al 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);

Hay un error al verificar que he eliminado del código para acortarlo.

Gracias de antemano :)

¿Fue útil?

Solución

Recientemente comencé a hacer algunos pasatiempos en esta área.

Nos decidimos por utilizar la OpenCV con el código contenedor de opencvdotnet . Admite la captura de fotogramas desde una cámara web:

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

Y si está haciendo manipulación de imágenes, los algoritmos de procesamiento de imágenes de OpenCV se han incluido dentro del ensamblaje 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 de 64 bits, o '' mklink OpenCV 'c: \ archivos de programa (x86) \ OpenCV` " del directorio correcto o de lo contrario no se instalará opencvdotnet).

Otros consejos

En realidad, hay dos formas de obtener datos de la cámara en su aplicación, DirectShow y WIA. Microsoft recomienda que utilice WIA , y la interfaz para WIA es bastante simple para envolver tu cerebro Creé y publiqué una biblioteca de escritorio WIA de código abierto basada en el trabajo Lo hice hace un rato.

Ahora el problema con WIA en algunos casos es que es demasiado simple. Por ejemplo, si desea ajustar las propiedades de la cámara (como la velocidad de fotogramas, la resolución, etc.), entonces 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 pronto).

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

Echa un vistazo a este artículo: http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

Es demasiado simple que instalar y usar OpenCVNetWrapper.

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

Captura de OpenCV, captura de EMGU y todas las demás bibliotecas de captura que he probado
todos tienen el mismo problema: no puede ir más allá de 640x480 programáticamente
(sin abrir la ventana de fuente de video de Windows).

Sugiero usar esto (que funciona):
https://github.com/ofTheo/videoInput

Esto también se preguntó en Cómo obtener imágenes de cámara web en C # ? y puede que le resulte útil lo siguiente (perdón por el envío de spam, pero esto realmente ayuda a responder la pregunta):

Acabo de lanzar el código fuente completo de mi aplicación de Windows CamTimer (escrito en .NET / C #). Descargue / vea el código completo (con ejemplos de cámara web en funcionamiento) en https://github.com/johanssonrobotics/CamTimer

¡Feliz codificación!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top