什么是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,但是只能同时处理一个
如果要批量处理的话,还是建议使用手动的方法吧(直接操作像素,你懂的)。