Medir tiempo de ejecución y FPS

En ocaciones necesitamos conocer el tiempo que le toma a una función realizar su trabajo, para ello utilizaremos las funciones proporcionadas por OpenCV, estas son cv::getTickFrequency() y cv::getTickCount(), mas adelante veremos que hace cada una de ellas y como podemos usarlas para calcular los FPS cuando hacemos una aplicacion que funcione en tiempo real.

Medir tiempo de ejecución

Calculamos el tiempo de ejecución de una función de la siguiente manera:

double t = (double)getTickCount();
// ejecutar nuestra funcion ...
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "Tiempo en segundos: " << t << endl;

La función cv.getTickCount() devuelve el número de ciclos de reloj después de un evento de referencia hasta el momento en que se llama a esta función. Entonces, si lo llama antes y después de la ejecución de la función, obtiene la cantidad de ciclos de reloj utilizados para ejecutar una función.

La función cv.getTickFrequency() devuelve la frecuencia de los ciclos de reloj, o la cantidad de ciclos de reloj por segundo.

Obtener FPS en tiempo real

Usando los conocimientos aprendidos anteriormente vamos a crear una aplicacion que captura video de la webcam en tiempo real y la procesa con algoritmo básico, la idea es medir el tiempo y calcular los FPS (cuadros por segundo) promedio a los que se ejecuta nuestra aplicación.

Código de ejemplo:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void processFrame(cv::Mat& frame) {

	Mat gray, blur, blend;

	cvtColor(frame, gray, COLOR_BGR2GRAY);
	GaussianBlur(gray, blur, Size(21, 21), 0, 0);

	cvtColor(blur, frame, COLOR_GRAY2BGR);
}

void main() {

	VideoCapture capture;
	capture.open(0);

	int64 counter = 0;
	double elapsed = 0, fps = 0;
	int64 start = getTickCount();

	while (capture.isOpened()) {

		Mat frame;
		capture >> frame;

		if (!frame.empty()) {
			processFrame(frame);
		}

		int64 delta = getTickCount() - start;
		
		double freq = getTickFrequency();
		double elap = delta / freq;

		counter += 1;

		if (elap > 1) 
		{		
			fps = counter / elap;
			elapsed = elap / fps;
			counter = 0;
			start = getTickCount();
		}

		String text = cv::format("Elapsed time: %.3f s - FPS: %.2f", elapsed, fps);
		
		int baseline = 0;
		Size size = cv::getTextSize(text, FONT_HERSHEY_PLAIN, 1.0, 1, &baseline);
		
		cv::rectangle(frame, cv::Rect(5, 5, size.width + 10, size.height + 10), Scalar(0, 128, 128), FILLED, LINE_AA);
		cv::putText(frame, text, Point(10, size.height + 10), FONT_HERSHEY_PLAIN, 1.0, Scalar(255, 255, 255), 1, LINE_AA);

		cv::imshow("face", frame);

		if (waitKey(1) == 27) break;
	}

	capture.release();
}

La parte que mas nos interesa de este código es el siguiente fragmento:

		double freq = getTickFrequency();
		double elap = delta / freq;

		counter += 1;

		if (elap > 1) 
		{		
			fps = counter / elap;
			elapsed = elap / fps;
			counter = 0;
			start = getTickCount();
		}

Obtenemos el tiempo transcurrido como lo hicimos anteriormente, tambien agregamos un contador para calcular la cantidad de frames que han sido procesados luego de haber transcurrido 1 segundo, calculamos los FPS promedio y reiniciamos todo para el siguiente ciclo.

En el resto del códogo mostramos la información disponible.

enter image description here

Comentarios

  1. La medición del tiempo de ejecución y los FPS (cuadros por segundo) en aplicaciones y sistemas es esencial para garantizar un rendimiento óptimo y una experiencia de usuario fluida. La capacidad de monitorear y mejorar estos aspectos contribuye directamente a la eficiencia y la calidad de cualquier plataforma digital. La inclusión de servicios de ciberseguridad en la medición del tiempo de ejecución y los FPS demuestra un compromiso con la integridad y la seguridad del sistema. La optimización del rendimiento no solo se trata de velocidad, sino también de garantizar que las operaciones se realicen de manera segura y protegida contra posibles amenazas cibernéticas. Al integrar medidas de ciberseguridad, se fortalece la robustez de la aplicación y se protegen los datos y procesos críticos. Esto no solo beneficia la experiencia del usuario al garantizar un rendimiento fluido, sino que también ofrece tranquilidad al saber que se han implementado precauciones para mantener la seguridad de la información. En resumen, la combinación de medición de tiempo de ejecución, FPS y servicios de ciberseguridad no solo impulsa el rendimiento y la seguridad, sino que también crea una base sólida para proporcionar experiencias digitales de alta calidad y confiables.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Conectar SQL Server con Java

Histogramas OpenCV Python