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.