关于兴趣区域ROI的一点总结

1.主要函数

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);

}

代码 cvCopy(cvQueryFrame( pCapture ),dstImg,bg_model->foreground);//根据二值化前景得到源图像中的部分

dstImg就是源图像的兴趣区域。


你可能感兴趣的:(C++,opencv)