2011-10-30 22 views
7

ROI solo se puede implementar con un rectángulo. Sin embargo, tengo un contorno que quiero establecer como un ROI. ¿Alguien tiene una idea de cómo usaría un contorno como un ROI en lugar de un rectángulo?¿Usar ROI en OpenCV?

De lo contrario, si no fuera posible, ¿cómo podría enfocar mis acciones solo en píxeles en un contorno específico?

Gracias

PS: Lo siento por todas estas preguntas OpenCV. Realmente confuso: $

+0

Tiene un error tipográfico en el título. Además, la mayoría de las funciones de OpenCV tienen un parámetro de máscara y solo operan en la región de sus entradas donde la máscara tiene un valor especial. ¿Qué es lo que realmente quieres hacer? –

+1

Quiero utilizar la proyección de fondo del histograma en píxeles en un contorno predefinido. Entonces, básicamente, ¿solo crearía una máscara en blanco y negro de ese contorno relleno y luego lo usaría como máscara para la imagen en la que quiero usar la proyección de histograma? – user1017485

+0

si desea obtener píxeles en un contorno, como se sugirió antes de enmascarar con contorno (dibujar el contorno - blanco sobre negro y luego usarlo como una máscara en la imagen original) es el camino obvio a seguir. – AruniRC

Respuesta

7

OpenCV solo admite ROI rectangulares.

Sin embargo, para realizar algunos procesos de píxeles específicos, puede utilizar algunas funciones de ayuda.

Uno de ellos es pointPolygonTest(), que le indica que un píxel dado pertenece no a un polígono.

para que pueda escribir algo así como

for(i=0;i<height;i++) 
{ 
     for(j=0;j<width;j++) 
     { 
      if(pointPolygonTest(Point(i,j),myPolygon)) 
      { 
       // do some processing 
      } 
     } 
} 

También puedes ver esta muestra http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.html#point-polygon-test

Otra opción (más rápido) es el sugested por @ Andeas-haferburg. Hacer una máscara de pintura de su polígono en una nueva imagen en escala de grises:

drawPoly() 

(Para que el fondo es 0, y el polígono es 255), entonces puede pasar a otras funciones, o utilizarlo en solitario:

for(i=0;i<height;i++) 
{ 
     for(j=0;j<width;j++) 
     { 
      if(mask[j+w*i])) 
      { 
       // do some processing 
      } 
     } 
} 

El ejemplo anterior es solo un pseudo código, debe hacerlo funcionar.

+0

Gracias ayudó mucho – user1017485

+0

@ user1017485 ¿ha descubierto cómo hacerlo? Estoy teniendo un problema similar. – Mzk

+0

@ user1017485 ¿Ya te has dado cuenta? También quiero saber cómo hacer esto. – bearzk

Cuestiones relacionadas