关于兴趣区域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就是源图像的兴趣区域。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在车道检测中,我们通常需要提取感兴趣区域(Region of Interest, ROI),以减小计算量并提高检测的准确性。下面是一个简单的例子,演示如何提取图像中的感兴趣区域。 首先,导入必要的库: ```python import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline ``` 然后,读取一张示例图片: ```python img = cv2.imread('example.jpg') ``` 接下来,我们需要定义感兴趣区域的坐标。例如,如果我们想提取图片底部的一部分,可以定义一个梯形区域,如下所示: ```python height, width = img.shape[:2] roi = np.array([[(0, height), (width/2-50, height/2+50), (width/2+50, height/2+50), (width, height)]], dtype=np.int32) ``` 这里使用了NumPy数组,定义了一个梯形区域,顶点分别为`(0, height)`、`(width/2-50, height/2+50)`、`(width/2+50, height/2+50)`和`(width, height)`。这里的`height`和`width`是图像的高度和宽度。 然后,我们需要创建一个与原图像大小相同的黑色图像,用于绘制感兴趣区域: ```python mask = np.zeros_like(img) cv2.fillPoly(mask, roi, (255, 255, 255)) ``` 这里使用了`cv2.fillPoly`函数,将感兴趣区域填充为白色。最后,我们可以通过按位与操作,提取感兴趣区域内的图像: ```python roi_img = cv2.bitwise_and(img, mask) ``` 现在,`roi_img`变量就是提取出的感兴趣区域。我们可以使用`plt.imshow`函数显示它: ```python plt.imshow(cv2.cvtColor(roi_img, cv2.COLOR_BGR2RGB)) ``` 完整代码如下: ```python import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread('example.jpg') height, width = img.shape[:2] roi = np.array([[(0, height), (width/2-50, height/2+50), (width/2+50, height/2+50), (width, height)]], dtype=np.int32) mask = np.zeros_like(img) cv2.fillPoly(mask, roi, (255, 255, 255)) roi_img = cv2.bitwise_and(img, mask) plt.imshow(cv2.cvtColor(roi_img, cv2.COLOR_BGR2RGB)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值