Using ROI in OpenCV?
Asked Answered
U

1

7

ROI can only be implemented with an rectangle. I however have a contour that I want to set as an ROI. Does anyone have an idea of how I would go about using a contour as an ROI rather than a rectangle?

Otherwise if not possible, how could I focus my actions only in pixels in a specific contour?

Thanks

PS: Sorry for all these OpenCV questions. Just really confused :$

Underhill answered 30/10, 2011 at 17:1 Comment(3)
You have a typo in the title. Also, most OpenCV functions have a mask parameter and only operate on the region of their inputs where the mask has a special value. What is it that you actually want to do?Jephum
I want to use histogram back projection on pixels in a predefined contour. So basically would I just create a black and white mask of that filled contour and then use it as a mask for the image I want to use histogram backprojection on?Underhill
if you wan't to get at pixels in a contour, as suggested before masking with contour (draw the contour - white on black then use it as a mask on the original image) is the obvious way to go .Suggestible
S
7

OpenCV supports only rectangular ROIs.

However, to make some processing for specific pixels, you can use some helper functions.

One of them is pointPolygonTest(), which tells you a given pixel belongs on not to a polygon.

So you can write something like

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

Also check this sample http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.html#point-polygon-test

Another (faster) option is the one sugested by @andeas-haferburg. Make a mask by painting your polygon in a new grayscale image:

drawPoly() 

(So that background is 0, and the polygon is 255), Then you can pass to some other functions, or use it by yourself:

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

The example above is just pseudo code, you have to make it work.

Subaudition answered 31/10, 2011 at 7:16 Comment(2)
@Underhill have you figure it out how to do it? I'm having similar problem.Torsk
@Underhill have you figured this out? I also want to know how to do this.Bricklayer

© 2022 - 2024 — McMap. All rights reserved.