Top Ad unit 728 × 90

Recientes

recent

Curso OpenCV 3.0 y C++ con Visual Studio 2013 (12-15) - Región de Interés ROI Circular en OpenCv y C++

Buen día Amigos de IncanatoIT, continuando ahora si con mi proyecto de investigación en Opencv y C++, estoy procesando vídeos de colonoscopía y todos estos vídeos tienen algo en común, solo muestran información importante en la parte central del vídeo, es decir toda la información de los exámenes de colonoscopía se muestran en un círculo central y la parte restante es totalmente negro (Información que no será importante).

Lo que tengo que hacer entonces es programar un algoritmo que me permita aislar esta parte negra de los frames de la secuencia de vídeo (que no será necesario procesar) para así crear nuevos frames quedándome solamente con el círculo de la parte central, y procesar después estos nuevos frames con otros algoritmos...esto está un poco fácil por ahora.



Estuve investigando de que manera aislar el círculo central (información que debo procesar después) de la parte negra (información nada importante) de los frames de la secuencia de vídeo.
Sabemos que OpenCV permite gestionar Regiones Rectangulares de interés (ROI), pero no las regiones circulares o elípticas. 
Así que para recortar una región circular o elíptica de interés, hay un truco sencillo mediante la aplicación de una máscara binaria (elíptica o circular) en la imagen.

Aquí voy a mostrar un ejemplo del uso de máscara binaria para extraer región elíptica o circular para poder seleccionar la parte de interés en los frames de la secuencia de vídeos de colonoscopía referentes a mi proyecto de Investigación.

Si bien el código lo tengo que implementar en un vídeo, mostraré primero el ejemplo para hacerlo con una imagen desde archivo.

Código:Región de Interés ROI Circular en OpenCv 3.0 y C++

// CursoOpenCV2410.cpp: Juan Carlos Arcila Díaz.

#include "stdafx.h"
#include "opencv2\opencv.hpp"

using namespace cv;
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 //Creamos un objeto de la clase Mat para almacenar la imagen
 Mat imagen;
 //Declaramos el radio
 double radio;
 //Leemos la imagen de archivo
 imagen = imread("D:\\pruebaopencv\\pruebas\\aminta.png", cv::IMREAD_COLOR);

 //El radio será igual a la altura de la imagen divido entre 2
 radio = imagen.rows / 2;
 //Obtengo el punto central del círculo a implementar
 Point centro(imagen.cols / 2, imagen.rows / 2);
 //Dibujamos el círculo
 circle(imagen, centro, radio, cv::Scalar(255, 255));
  
 //Obtenemos un rectángulo que contendrá al círculo
 Rect r(centro.x - radio, centro.y - radio, radio * 2, radio * 2);

 // Obtenemos la imagen ROI
 Mat roi(imagen, r);

 // Implementamos una máscara negra con las mismas características
 Mat mask(roi.size(), roi.type(), Scalar::all(0));

 // Rellenamos el círculo con color blanco
 circle(mask, Point(radio, radio), radio, Scalar::all(255), -1);

 // combinamos roi & mask:
 Mat resultado = roi & mask;

 //Mostramos la nueva Imagen
 imshow("Ventana", resultado);
 waitKey(0);
 //Guardamos la nueva imagen en Disco
 imwrite("D:\\pruebaopencv\\plotImg2.jpg", resultado);
}


Resultado:

Pero aún tenemos la imagen con fondo negro, aunque ya ya no es el mismo fondo (hemos logrado separar las dos partes distinguibles).

Saludos Imperio, un abrazo a la distancia!
Curso OpenCV 3.0 y C++ con Visual Studio 2013 (12-15) - Región de Interés ROI Circular en OpenCv y C++ Reviewed by Juan Carlos Arcila Díaz on 7:54 Rating: 5

No hay comentarios:

All Rights Reserved by www.IncanatoIT.com - Desarrollando Software © 2014 - 2015
Powered By Blogger, Designed by Sweetheme

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

IncanatoIt.com. Con la tecnología de Blogger.