逐步积累openCV基本操作

27 篇文章 3 订阅
1,Opencv中的ROI介绍

ROI(Region of Interest)是指图像中的一个矩形区域,可能你后续的程序需要单独处理这一个小区域,如图所示



如上图所示,就是ROI的一个例子,如果你对图像设置了ROI,那么,Opencv的大多数函数只在该ROI区域内运算(只处理该ROI区域),如果没设ROI的话,就会出来整幅图像。
ROI非常有用,例如我们想把图像中的人脸扣出来,进行人脸识别。需要注意的时候,ROI一定在图像内部,而不能超出图像的范围。


对图像设定ROI的函数是:


cvSetImageROI(IplImage* src,CvRect rect);
src表示的是源图像,rect只的是ROI区域。


如果要取消ROI区域,那么使用函数:


cvResetImageROI(IplImage* src);
这个函数,就把src上的ROI区域取消掉。


下面举几个例子:


例子1:
从一幅大图像中,取出一小块图像并保存这一个小块图像。
代码如下:
/* 读取大图像 */
IplImage *img1 = cvLoadImage("elvita.jpg", 1);

/* 设置图像的ROI区域
   注意ROI区域不要越界,必须在大图像的内部 */
cvSetImageROI(img1, cvRect(10, 15, 150, 250));

/* 为小图像分配内存空间
   cvGetSize(img1)返回的是一个CvSize结构体,意思就是返回了图像img1的宽度和高度,由于
img已经设置了ROI,所以cvGetSize函数对ROI区域有效,所以,返回的是ROI区域的宽度和高度 */
IplImage *img2 = cvCreateImage(cvGetSize(img1),
                               img1->depth,
                               img1->nChannels);

/* 把img1的ROI区域拷贝到img2*/
cvCopy(img1, img2, NULL);

/* 取消img1上的ROI区域 */
cvResetImageROI(img1);




例子2:
两幅不同大小的图像相加
/* 加载图像
   注意,这两幅图像有不同的宽度和高度 */
IplImage *img1 = cvLoadImage("elvita.jpg", 1);  /* 大图像  */
IplImage *img2 = cvLoadImage("fifi.jpg", 1);    /* 较小的图像*/

/* 定义ROI区域的坐标*/
CvRect rect = cvRect(25, 25, img2->width, img2->height);

/* 对图像img1设置ROI1区域 */
cvSetImageROI(img1, rect);

/* 两幅图像相加
   注意,通过对img1设置ROI区域后,两幅图像,其实有相同的宽度和高度了。 */
cvAdd(img1, img2, img1, NULL);

/* 取消感兴趣区域,即ROI区域*/
cvResetImageROI(img1);




例子3:在一个特定区域进行模板匹配 ( 关于模板匹配的完整代码下载 )
IplImage *src = cvLoadImage("myphoto.jpg", 1);
IplImage *template = cvLoadImage("eye.jpg", 1);

CvRect rect = cvRect(25, 25, 120, 120);

//设置ROI区域
cvSetImageROI(src, rect);

IplImage *result = cvCreateImage(cvSize(rect.width  - tpl->width  + 1,
                                     rect.height - tpl->height + 1),
                              IPL_DEPTH_32F, 1);

/* 进行模板匹配 */
cvMatchTemplate(src, template, result, CV_TM_SQDIFF);

/* 查找最匹配的坐标 */
CvPoint    minlocation, maxlocation;
double    minvalue, maxvalue;
cvMinMaxLoc(result, &minvalue, &maxvalue, &minlocation, &maxlocation, 0);

/* 在源图像上画出矩形*/
cvRectangle(src,
            cvPoint(minlocation.x, minlocationc.y),
            cvPoint(minlocation.x + template->width, minlocationc.y + template->height),
            CV_RGB(255, 0, 0), 1, 0, 0 );

cvResetImageROI(src);


在上面的例子中,先定义ROI区域,再进行模板匹配,这样会加快匹配的速度,因为,只在ROI区域进行模板匹配运算。


例子4:ROI区域像素值的访问
可以想把ROI区域拷贝到一幅新的图像中,然后再访问其像素值


/* 假设已经有了一幅 8-bit 3通道图像*/


/* ROI的坐标*/
CvRect rect = cvRect(10, 20, 50, 60);


/* ROI区域的子图像 */
IplImage* subimg;


/* 设置ROI区域 */
cvSetImageROI(img, rect);


//ROI区域拷贝
cvCopy(img, subimg, NULL);


//释放ROI区域
cvResetImageROI(img);


/* 然后,就可以对subimg进行访问,其实就是访问ROI区域 */


或者可以通过ROI的左边信息进行访问




/* ROI区域的坐标 */
CvRect rect = cvRect(10, 20, 50, 60);


//设置ROI区域
cvSetImageROI(img, rect);


/* 假设,把整个ROI区域赋值为0 */
for (i = rect.y; i < (rect.y + rect.height); i++) {
    for (j = rect.x; j < (rect.x + rect.width); j++) {
        ((uchar*)(img->imageData + i * img->widthStep))[j*3] = 0;
        ((uchar*)(img->imageData + i * img->widthStep))[j*3+1] = 0;
        ((uchar*)(img->imageData + i * img->widthStep))[j*3+2] = 0;
    }

}


用截取的部分图像创建新图像--关于cvGetSubRect,cvGetImage的用法  

2011-03-27 22:49:17|  分类: OpenCV|字号 订阅

  CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect)可以把截取图像中需要的区域存入矩阵。把IplImage *传给arr,IplImage *指向所要截取的图像;把CvMat *传给submat(CvMat *只需为头指针就可以 不需要分配数据存储空间);rect是要截取的区域;返回指向所存矩阵。
例如:


  CvMat *pMat = cvCreateMatHeader(100, 100, CV_8UC1);  //创建一个100*100的矩阵头
  CvRect rect = cvRect(0, 0, 100, 100);  //要截取的区域,与创建的矩阵大小一样
  cvGetSubRect(pImg, pMat, rect);  //pImg为指向图像的指针,pMat指向存储所接图像的矩阵,返回值和pMat相等
也可以简化为:
  CvMat *pMat = cvGetSubRect(pImg, cvCreateMatHeader(100, 100, CV_8UC1), cvRect(0, 0, 100, 100));

  IplImage* cvGetImage( const CvArr* arr, IplImage* image_header )可以把刚才存入矩阵的数据转存为图像。把CvMat *传给arr;image_header 只需为图像头就行,不用分配数据存储空间 ;返回所存图像的指针。
例如:
  IplImage *pSubImg = cvCreateImageHeader(cvSize(100, 100), 8, 1);  //创建一个100*100的图像头
  cvGetImage(pMat, pSubImg); //pMat为存储数据的矩阵,pSubImg指向图像,返回值与pSubImg相等
也可以简化为:
  IplImage *pSubImg = cvGetImage(pMat, cvCreateImageHeader(cvSize(100, 100), 8, 1));

截取子图最后简化为:
  IplImage *pSubImg = cvGetImage(cvGetSubRect(pImg, cvCreateMatHeader(100, 100, CV_8UC1), cvRect(0, 0, 100, 100)), cvCreateImageHeader(cvSize(100, 100), 8, 1));  //好乱...读明白这句费劲儿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值