设置图像的感兴趣区域(ROI)

本文介绍了一个使用C/C++及OpenCV库进行图像处理的例子,重点在于如何定义并操作图像中的感兴趣区域(ROI)。通过具体的代码展示了如何加载图像、设置ROI、复制图像及其ROI,并最终展示处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新函数用红色显示,程序为:
#include <highgui.h>
#include <cv.h>
#include <iostream.h>
void main()
{
IplImage * src=cvLoadImage("baboon.jpg",-1);
IplImage * dst;
CvRect roi_rect_src;
CvRect roi_rect_dst;
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
cvMoveWindow("src",200,200);    //设置窗口输出位置
cvShowImage("src",src);
cvWaitKey(0);

//基于给定的矩形设置感兴趣区域ROI
roi_rect_src.x=125;
roi_rect_src.y=300;
roi_rect_src.width=240;
roi_rect_src.height=200;
cvSetImageROI(src,roi_rect_src);
cout<<"输出源图像的ROI区域:"<<endl;
cout<<(src->roi->xOffset)<<" "<<(src->roi->yOffset)<<endl;
cout<<(src->roi->width)<<" "<<(src->roi->height)<<endl;
cvShowImage("src",src);//这时候只显示ROI区域
cvWaitKey(0);

dst=cvCloneImage(src);//完整复制包括头,ROI和数据
roi_rect_dst=cvGetImageROI(dst);//获得ROI区域
cout<<"输出目标图像的ROI区域:"<<endl;
cout<<roi_rect_dst.x<<" "<<roi_rect_dst.y<<endl;
cout<<roi_rect_dst.width<<" "<<roi_rect_dst.height<<endl;
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
cvMoveWindow("dst",600,200);
cvShowImage("dst",dst);
cvWaitKey(0);
cvResetImageROI(dst);//释放图像的ROI
cvShowImage("dst",dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
}
==========================================
这只狒狒也是标准测试图,它的名字叫baboon,在图像处理中有很高的地位。
程序中将它的鼻子作为ROI。

### 如何使用 OpenCV 设置和操作图像 ROI 区域 #### 使用切片操作定义 ROI 在 OpenCV 中,可以通过简单的切片操作来定义感兴趣区域 (ROI),这允许直接访问图像中的特定部分。下面是一个具体的例子: ```python import cv2 # 读取图像 image = cv2.imread('image.jpg') # 定义一个矩形ROI x, y, w, h = 100, 50, 200, 150 roi = image[y:y+h, x:x+w] # 显示ROI cv2.imshow('ROI', roi) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码展示了如何利用坐标参数 `x`, `y` 和宽度高度 `w`, `h` 来指定感兴趣的子图,并将其作为新的变量保存下来[^1]。 #### 在原图像中标记 ROI 区域 为了更直观地查看所选的 ROI,在原始图片上画出边界框是一种常见做法。这里展示了一个实例: ```python import cv2 image = cv2.imread('1.bmp') roi_rect = (140, 85, 360, 390) x, y, w, h = roi_rect cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('ROI Image', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此段脚本会在给定位置绘制绿色边界的矩形框以突出显示选定的 ROI 部分[^2]。 #### 动态选择和绘制 ROI 对于更加灵活的应用场景,比如用户交互式的选取 ROI,则可以采用 `cv2.selectROI()` 方法让用户手动圈定目标范围。该功能特别适用于实时视频流处理或需要精确控制的情况[^3]。 #### 复制与裁剪 ROI 区域 当涉及到对某个特定区域内像素的操作时,可以直接对该区域进行复制或者进一步加工。例如,提取并独立处理某一部分的内容: ```cpp // 对于旧版 C API 的情况 cvSetImageROI(IplImage* src,CvRect rect); IplImage *subimg=cvCreateSubImage(src); // 取消当前设置ROI cvResetImageROI(IplImage* src); ``` 需要注意的是上述代码片段属于较早版本的接口调用方式;而在 Python 版本中推荐的做法仍然是基于 NumPy 数组索引来完成相同的功能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值