Aprende a instalar y usar la biblioteca OpenCVSharp para acceder a la cámara web en su aplicación WinForms.

Cómo tomar fotos instantáneas con la cámara web con C# usando la biblioteca OpenCVSharp en WinForms

Si está trabajando en alguna aplicación que funciona con una base de datos o algo relacionado con el almacenamiento de datos, probablemente necesitará almacenar una imagen de algo, una persona o un producto. El usuario no siempre tendrá la foto como un archivo, en cambio, puede querer tomar una foto inmediatamente y preferiblemente dentro de la misma aplicación que está usando. Es posible tomar fotografías dentro de una aplicación WinForms con la herramienta adecuada. La forma más sencilla de lograrlo es a través de la biblioteca OpenCVSharp, que le permitirá mostrar el video de la cámara web dentro de un elemento Picture Box.

En este artículo, le explicaremos cómo usar la biblioteca OpenCVSharp para tomar instantáneas de su cámara web dentro de una aplicación WinForms fácilmente.

1. Instale OpenCVSharp

OpenCVSharp es un contenedor multiplataforma de OpenCV para .NET Framework. OpenCV (Open Source Computer Vision Library) es una biblioteca de software de visión artificial y aprendizaje automático de código abierto. OpenCV se creó para proporcionar una infraestructura común para aplicaciones de visión por computadora y para acelerar el uso de la percepción de la máquina en los productos comerciales. Al ser un producto con licencia BSD, OpenCV facilita que las empresas utilicen y modifiquen el código. Características de la envoltura:

  • OpenCvSharp se basa en el estilo nativo de la API OpenCV C / C ++ tanto como sea posible.
  • Muchas clases de OpenCvSharp implementan IDisposable. No es necesario administrar recursos inseguros.
  • OpenCvSharp no le impone el estilo de programación orientada a objetos. También puede llamar a funciones OpenCV de estilo nativo.
  • OpenCvSharp proporciona funciones para convertir de Mat / IplImage en Bitmap (GDI +) o WriteableBitmap (WPF).
  • OpenCvSharp puede funcionar en Mono . Puede ejecutarse en cualquier plataforma compatible con Mono (por ejemplo, Linux).   

Para comenzar con la instalación de esta biblioteca en su proyecto usando el administrador de paquetes NuGet. Abra su proyecto Winforms C # y abra el administrador de paquetes NuGet en el explorador de soluciones:

Vaya a la pestaña Examinar y busque  OpenCVSharp3 :

Open CV Sharp 3 Install NuGet Visual Studio

Simplemente haga clic en instalar para el primer paquete, a saber, OpenCVSharp3-AnyCpu de shimat. Para obtener más información sobre este contenedor, visite el repositorio oficial en Github aquí . Después de instalar la biblioteca, podrá obtener la imagen de la cámara web fácilmente.

2. Capturar una sola instantánea

Para nuestro enfoque, haremos algo bastante básico, permitiremos que el usuario obtenga una vista previa de la imagen recibida de la cámara y podrá tomar una instantánea de la imagen actual. Como primer paso, debe diseñar un formulario básico que contenga 3 elementos:

  • Un cuadro de imagen ( pictureBox1)
  • Un botón para iniciar la cámara ( button1)
  • Un botón para tomar la instantánea ( button2)

El formulario se verá así:

Snapshot OpenCVSharp C# Example

Además, si desea un diseño responsivo , por lo que el cuadro de imagen también cambia de tamaño cuando cambia el tamaño de la ventana, es posible que desee agregar también 2 paneles, colocando el primer panel en la misma posición que el cuadro de imagen pero con el cuadro de imagen dentro y en la parte inferior, un panel que contiene los 2 botones:

OpenCVSharp Snapshot Form Example

El pictureBox1 tendrá que tener el conjunto de propiedades Muelle de relleno, para tomar el mismo tamaño de la panel1 que lo contiene. El ancla de las panel1necesidades debe establecerse en "Arriba, Abajo, Izquierda, Derecha". El ancla del panel2 debe establecerse en "Inferior, Izquierda, Derecha" y los botones dentro del panel, tendrán la propiedad del muelle configurada a su lado, por ejemplo, el button1muelle se configurará a la izquierda y el button2muelle se configurará a la derecha. Puede establecer las propiedades mencionadas a través del cuadro Propiedades de Visual Studio o con código durante la inicialización de los componentes. La idea es básicamente iniciar la cámara cuando el usuario hace clic en Iniciar y tomar la instantánea.

La lógica del código funciona así: incluye el espacio de nombres de la biblioteca OpenCvSharp y sus extensiones. En la clase de su formulario, declare 5 variables sin inicialización de los siguientes tipos:

  • Captura de video
  • Estera
  • Mapa de bits
  • Hilo
  • Booleano

Estas variables se utilizarán para almacenar la instancia del registrador y algunas banderas para saber si el registrador está activo o no. Cree 2 métodos, a saber, CaptureCamera y CaptureCameraCallback. El proceso de devolución de llamada se ejecuta en otro hilo para que su aplicación no se congele durante su ejecución. En el botón de inicio / parada, verifique con la bandera si debe iniciar la instancia o si debe detenerse. En el botón de captura de instantánea, simplemente acceda a la propiedad Imagen del cuadro de imagen, que se actualiza constantemente y guárdelo en un mapa de bits, luego guarde el mapa de bits con su formato preferido y listo: 

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Windows.Forms;

// Importante: incluya la biblioteca opencvsharp en su código
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace Sandbox
{
    public partial class Form1 : Form
    {
        // Crear variables accesibles a nivel de clase
        VideoCapture capture;
        Mat frame;
        Bitmap image;
        private Thread camera;
        bool isCameraRunning = false;


        // Declarar métodos requeridos
        private void CaptureCamera()
        {
            camera = new Thread(new ThreadStart(CaptureCameraCallback));
            camera.Start();
        }

        private void CaptureCameraCallback()
        {

            frame = new Mat();
            capture = new VideoCapture(0);
            capture.Open(0);

            if (capture.IsOpened())
            {
                while (isCameraRunning)
                {

                    capture.Read(frame);
                    image = BitmapConverter.ToBitmap(frame);
                    if (pictureBox1.Image != null)
                    {
                        pictureBox1.Image.Dispose();
                    }
                    pictureBox1.Image = image;
                }
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
             
        }

        // Cuando el usuario hace clic en el botón de inicio / parada, inicie o suelte la cámara y configure las banderas
        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text.Equals("Start"))
            {
                CaptureCamera();
                button1.Text = "Stop";
                isCameraRunning = true;
            }
            else
            {
                capture.Release();
                button1.Text = "Start";
                isCameraRunning = false;
            }
        }

        // Cuando el usuario hace clic en tomar instantánea, la imagen que se muestra en el cuadro de imagen se guardará en su computadora
        private void button2_Click(object sender, EventArgs e)
        {
            if (isCameraRunning)
            {
                // Tome una instantánea de la imagen actual generada por OpenCV en el cuadro de imagen
                Bitmap snapshot = new Bitmap(pictureBox1.Image);

                // Guardar en algún directorio
                // en este ejemplo, generaremos un nombre de archivo aleatorio, por ejemplo 47059681-95ed-4e95-9b50-320092a3d652.png
                // snapshot.Save(@"C:\Users\sdkca\Desktop\mysnapshot.png", ImageFormat.Png);
                snapshot.Save(string.Format(@"C:\Users\sdkca\Desktop\{0}.png", Guid.NewGuid()), ImageFormat.Png);
            }
            else
            {
                Console.WriteLine("¡No se pueden tomar fotografías si la cámara no está capturando imágenes!");
            }
        }
    }
}

En nuestro ejemplo, almacenamos la captura de pantalla generada en el directorio de escritorio de nuestra máquina, por lo que deberá cambiarla a una ubicación conocida de su PC.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores