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.
Seleccionamos la versión Community que es gratuita para uso no profesional.
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.
Tras unos segundos aparece una ventana donde se pasa a seleccionar los componentes.
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.
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.
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.
Al pulsar en el botón ‘Iniciar Visual Studio’ se muestra un indicador de progreso durante unos segundos.
Y finalmente se muestra la ventana de inicio del entorno.
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.
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)
Luego se pulsa en el botón ‘Siguiente’ y aparece la lista de framework disponibles.
Finalmente se pulsa el botón ‘Crear’ y se abre la ventana del entorno de Visual Studio, listo para empezar el desarrollo.
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.
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.
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:
Deja una respuesta