voidcvSetImageROI(IplImage* image,CvRect rect);
voidcvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
对于cvSetImageROI中参数只能是rect矩形,不太灵活,可以用于手动标注或者自动标注矩形区域。(做个视频标注工具中可以用用)
对于cvCopy就很灵活了。依照参数mask来获得兴趣区域。
一般情况下,我们都是根据源图像或源视频,提取其中感兴趣或重要的区域进行研究。这时就能用到cvCopy。
特别是做前景提取的时候,提取出的前景图像往往都是二值化的。但我们希望要处理的是源图像中的包含颜色等信息的兴趣区域图像。
这时就可以用cvCopy。
举例如下,由高斯背景建模获得前景图,再由前景获得源图像的区域:
#include "stdafx.h" #include <cv.h> #include <cvaux.h> #include <highgui.h> CvGaussBGStatModelParams param = { 150, /* int win_size, Learning rate; alpha = 1/CV_GBG_WINDOW_SIZE. Defaults to 200. */ 5, /* int n_gauss, = K = number of Gaussians in mixture. Defaults to 5. Ranges from 3~5 */ 0.6, /* double bg_threshold, Threshold sum of weights for background test. Defaults to 0.7. */ 2.5, /* double std_threshold, lambda=2.5 is 99%. Defaults to 2.5. Shouldn't be changed!! */ 15.f, /* double minArea. Defaults to 15.f. */ 0.05, /* double weight_init. Defaults to 0.05. */ 900, /* double variance_init, CV_BGFG_MOG_SIGMA_INIT. Defaults to 30*30. the mean is 0. */ /* the method is an adaptive method, so after win_size frames, the result will just be fine. */ }, *params = ¶m; int main() { CvCapture* pCapture = cvCaptureFromCAM( 0 );// CvBGStatModel* bg_model =cvCreateGaussianBGModel(cvQueryFrame( pCapture ), params);// cvNamedWindow("video"); cvNamedWindow( "foreground"); cvNamedWindow("colorROI"); IplImage *dstImg = cvCreateImage(cvGetSize(cvQueryFrame( pCapture )),IPL_DEPTH_8U,3);// while( ( cvWaitKey(1)) != 27) { cvUpdateBGStatModel( cvQueryFrame( pCapture ), bg_model ); //更新高斯背景模型 bg_model->foreground->origin = 1;//使图像正常显示,不然会倒立 cvCopy(cvQueryFrame( pCapture ),dstImg,bg_model->foreground);//根据二值化前景得到源图像中的部分 dstImg->origin = 1;//使图像正常显示,不然会倒立 cvShowImage("video",cvQueryFrame( pCapture ));// cvShowImage("foreground", bg_model->foreground );// cvShowImage("colorROI",dstImg);// } cvReleaseCapture( &pCapture ); cvDestroyWindow( "foreground" ); cvReleaseImage(&dstImg); }
dstImg就是源图像的兴趣区域。