什么是ROI?ROI就是region of interest
,就是你感兴趣的图像部分,在图像处理中,可能同时要处理多个ROI。
Opencv有ROI的API,但是只能同时处理一个(书本上说的,未验证)。
下面给出一个实例:
#include <cv.h>
#include <highgui.h> int main(int argc,char **argv)
{ /*
* CVAPI(IplImage*) cvLoadImage( const char* filename,
int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)); //dst(mask) = src(mask) + value
CVAPI(void) cvAddS( const CvArr* src, CvScalar value, CvArr* dst,
const CvArr* mask CV_DEFAULT(NULL)); */
IplImage *src = cvLoadImage(argv[1],1); cvNamedWindow("image input");
cvNamedWindow("image output");
cvShowImage("image input", src); cvSetImageROI(src,cvRect(100,100,100,100));
cvAddS(src, cvScalar(100), src);
cvResetImageROI(src);
cvShowImage("image output", src); cvWaitKey(); cvReleaseImage(&src);
cvDestroyWindow("image input");
cvDestroyWindow("image output"); return 0;
}
关键函数是 cvSetImageROI(src,cvRect(100,100,100,100));
这里在100,100像素点开始,设置了100,100的大小作为ROI。
效果如下:
可以看到右边出现了一个较蓝色的块。
cvAddS(src, cvScalar(100), src); 就是起的这个作用。
为什么是蓝色的呢?
让我们将cvAddS(src, cvScalar(100), src);换成这一行试试看:
cvAddS(src, CV_RGB(100,0,0), src);
蛤蛤,变红色了,再看一下它的定义:
#define CV_RGB(r,g,b) cvScalar((b),(g),(r),0)。
这样就明白了吧。只有蓝色的原因是只设置到了b=100,g和r都是0。.
还有一个重要的一点,一定要使用cvResetImageROI,不然图像一直会在这个牢笼中无法自拔,变成这个样子:
上面提到:
Opencv有ROI的API,但是只能同时处理一个
如果要批量处理的话,还是建议使用手动的方法吧(直接操作像素,你懂的)。