noviembre 1, 2022

VARIOS – Prueba de cámara con Visual Studio

Written by

En esta publicación detallo los pasos para hacer funcionar una cámara conectada al PC con un programa hecho con Visual Studio, que muestre un vídeo en tiempo real y la tasa de imágenes por segundo o fps.

1 – Instalación de Visual Studio

Lo primero es ir al buscador y a la página de Visual Studio.

Página de descargas de Visual Studio

Seleccionamos la versión Community que es gratuita para uso no profesional.

Descarga de Visual Studio Community

Ahora pulsamos sobre el fichero descargado y, tras una confirmación de Windows para la instalación, aparece una ventana de información.

Al pulsar en Continuar, se descarga el verdadero instalador y configurador de Visual Studio.

Descarga del instalador de Visual Studio

Tras unos segundos aparece una ventana donde se pasa a seleccionar los componentes.

Ventana de selección de componentes a instalar

Visual Studio tiene muchas opciones y posibilidades. Para la prueba sólo se necesita la de Desarrollo en escitorio .NET. Al pulsar en instalar se procede a la descarga e instalación de lo seleccionado. Este proceso tarda varios minutos.

Tras unos minutos aparece la ventana indicando que Visual Studio se ha instalado.

Instalación de Visual Studio finalizada

2 – Crear un proyecto nuevo en Visual Studio

Se pulsa en el icono de Visual Studio para abrirlo, y nos aparece una ventana ‘splash’ de inicio.

Y al cabo de unos segundos aparece otra ventana para iniciar sesión o crear una cuenta.

Inicio de sesión en Visual Studio

Por el momento voy a omitir este paso, aunque si se piensa usar Visual Studio en varios dispositivos, tener una cuenta en la nube es una buena opción.

Luego pregunta por el estilo del entorno, que se selecciona al gusto.

Selección del estilo del entorno

Al pulsar en el botón ‘Iniciar Visual Studio’ se muestra un indicador de progreso durante unos segundos.

Esperando a iniciar Visual Studio

Y finalmente se muestra la ventana de inicio del entorno.

Ventana de inicio de Visual Studio

Ahora se pulsa en el botón ‘Crear un proyecto’ y nos lleva a seleccionar una plantilla para el proyecto, según el tipo que se quiera desarrollar.

Selección de una plantilla para el proyecto

Para este ejemplo se selecciona una aplicación de Windows Forms en C# y se pulsa en ‘Siguiente’. Esto lleva a la ventana de propiedades. Se escribe el nombre del proyecto que se quiera. (Si se va a copiar el código luego, nombrarlo WinFormApp1)

Propiedades del proyecto

Luego se pulsa en el botón ‘Siguiente’ y aparece la lista de framework disponibles.

Selección de la plataforma .NET

Finalmente se pulsa el botón ‘Crear’ y se abre la ventana del entorno de Visual Studio, listo para empezar el desarrollo.

Ventana del entorno de VS

3 – Crear un programa con ventana

El paso siguiente es llenar la aplicación. En este caso no es una aplicación simple como las de consola sino una con interfaz de ventana o Forms. Para empezar a conocer Visual Studio hay muchos tutoriales en Internet.

Se abre el cuadro de herramientas, a la izquierda y se muestran los controles disponibles. Colocamos arrastrando en el form un PictureBox.

Para mostrar la imagen de la cámara se usan las librerías AForge, de VS. Se accede al menú Proyecto->Administrar paquetes Nuget…

Y se selecciona la pestaña Examinar y se busca por AForge.

Se instalan las librerías AForge.Video y AForge.Video.DirectShow, pulsando sobre cada una de ellas. En el proceso hay que aceptar la instalación.

Hay que añadir el código. Se pulsa doble sobre el form para cambiar a la pestaña de código y se copia el siguiente:

using AForge.Video;
using AForge.Video.DirectShow;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        FilterInfoCollection filterInfoCollection;
        VideoCaptureDevice videoCaptureDevice;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);
            videoCaptureDevice.NewFrame += FinalFrame_NewFrame;
            videoCaptureDevice.Start();
        }

        //c# webcam capture picture
        private void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (videoCaptureDevice.IsRunning == true)
                videoCaptureDevice.Stop();
        }
    }
}

Y finalmente se pulsa el menú y tras unos minutos de compilación se abre la ventana del programa con la cámara.

4 – Añadir el dato de imágenes por segundo

Para mostrar el número de imágenes por segundo en el programa (fps) se necesita añadir un control label al form y modificar el programa para añadir el cálculo.

Control label añadido al form

Usamos las funciones de la librería System, que nos permite calcular tiempos. El programa queda ahora así:

using AForge.Video;
using AForge.Video.DirectShow;
using System;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        FilterInfoCollection filterInfoCollection;
        VideoCaptureDevice videoCaptureDevice;
        long antes, ahora, tiempo;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);
            videoCaptureDevice.NewFrame += FinalFrame_NewFrame;
            videoCaptureDevice.Start();
            antes= DateTime.Now.ToFileTime();
        }

        //c# webcam capture picture
        private void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
            ahora= DateTime.Now.ToFileTime();
            tiempo = ahora - antes;
            antes = ahora;
            double fpscam = 1e7 / tiempo;
            label1.Text = String.Format("{0:0.00}", fpscam);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (videoCaptureDevice.IsRunning == true)
                videoCaptureDevice.Stop();
        }
    }
}

A continuación está la imagen de prueba. En un ordenador portátil de prestaciones normales se consigue una tasa alrededor de 30 imágenes por segundo.

Imagen de prueba con fps

5 – Prueba con OpenCV

Se prueba ahora otra aplicación usando OpenCV. Se puede hacer descargando la librería e instalando para Windows, o en este caso, vamos a usar una librería predefinida Nuget para VS.

Se empieza creando un proyecto nuevo, de tipo aplicación de consola para C#.

Una vez que se ha creado, abrimos el menú Proyecto>Administrar paquetes NuGet…, y luego en la pestaña Examinar se busca el paquete OpenCvSharp4.Windows y se instala.

Cuando se haya instalado, se introduce el código de la aplicación con el vídeo y el dato de fps que aparece a continuación:

using OpenCvSharp;
using System;
using System.Security.Cryptography;

VideoCapture vc;
Mat frame;
HersheyFonts font = HersheyFonts.HersheySimplex;
long antes, ahora, tiempo;
double fpscam;

vc = new VideoCapture();
vc.Open(0);
frame = new Mat();
antes = DateTime.Now.ToFileTime();

for (;;)
   {
    vc.Read(frame);
    ahora = DateTime.Now.ToFileTime();
    tiempo = ahora - antes;
    antes = ahora;
    fpscam = 1e7 / tiempo;
    Cv2.PutText(frame, String.Format("{0:0.00}", fpscam), new OpenCvSharp.Point(10,100), font, 1, Scalar.Black, 2, LineTypes.Link8);
    Cv2.ImShow("video", frame);
    if (Cv2.WaitKey(1)=='s') break;
   }

vc.Release();
vc.Dispose();

Finalmente ésta es la prueba:

Aplicación de consola con OpenCV

Category : VARIOS

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Proudly powered by WordPress and Sweet Tech Theme