OpenCV7-copyTo截取ROI

OpenCV7-copyTo截取ROI


copyTo截取感兴趣区域

有时候,我们只对一幅图像中的部分区域感兴趣,而原图像又十分大,如果带着非感兴趣区域一次处理,就会对程序的内存造成负担,因此我们希望从原始图像中截取部分图像后再进行处理。我们将这个区域称作感兴趣区域(Region of Interest,ROI)。

从原图中截取部分内容,可以用Rect数据结构标记,也可以用Range数据结构标记:

cpp 复制代码
typedef Rect2i Rect;
typedef Rect_<int> Rect2i;

template<typename _Tp> class Rect_
{
public:
    // ...
    _Tp x; //!< x coordinate of the top-left corner
    _Tp y; //!< y coordinate of the top-left corner
    _Tp width; //!< width of the rectangle
    _Tp height; //!< height of the rectangle
};
img(Rect(p.x, p.y, width, height))
cpp 复制代码
class CV_EXPORTS Range
{
public:
    Range();
    Range(int _start, int _end);
    int size() const;
    bool empty() const;
    static Range all();

    int start, end;
};
// 定义开始和结束范围,可以是行的开始和结束范围,也可以是列的开始和结束范围
img(Range(rows_start, rows_end), Range(cols_start, cols_end));

深拷贝函数copyTo:

cpp 复制代码
void cv::Mat::copyTo( OutputArray m ) const;

void cv::Mat::copyTo( OutputArray m, InputArray mask ) const;

void cv::copyTo(InputArray src, OutputArray dst, InputArray mask);
cpp 复制代码
#include <opencv2\opencv.hpp>
#include <opencv2/core/utils/logger.hpp> // debug no log
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	Mat img = imread("lena.png");
	Mat noobcv = imread("noobcv.jpg");
	if (img.empty() || noobcv.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat ROI1, ROI2, ROI2_copy, mask, img2, img_copy, img_copy2;
	resize(noobcv, mask, Size(200, 200));
	img2 = img;  //浅拷贝
	//深拷贝的两种方式
	img.copyTo(img_copy2);
	copyTo(img, img_copy, img);
	//两种在图中截取ROI区域的方式
	Rect rect(206, 206, 200, 200);  //定义ROI区域
	ROI1 = img(rect);  //截图
	ROI2 = img(Range(300, 500), Range(300, 500));  //第二种截图方式
	img(Range(300, 500), Range(300, 500)).copyTo(ROI2_copy);  //深拷贝
	mask.copyTo(ROI1);  //在图像中加入部分图像
	imshow("加入noobcv后图像", img);
	imshow("ROI对ROI2的影响", ROI2);
	imshow("深拷贝的ROI2_copy", ROI2_copy);
	circle(img, Point(300, 300), 20, Scalar(0, 0, 255), -1);  //绘制一个圆形
	imshow("浅拷贝的img2", img2);
	imshow("深拷贝的img_copy", img_copy);
	imshow("深拷贝的img_copy2", img_copy2);
	imshow("画圆对ROI1的影响", ROI1);

	waitKey(0);
	return 0;
}
相关推荐
同学小张2 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
翔云 OCR API5 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
爱学习的小邓同学6 小时前
C++ --- 多态
开发语言·c++
AndrewHZ7 小时前
【图像处理基石】如何在图像中提取出基本形状,比如圆形,椭圆,方形等等?
图像处理·python·算法·计算机视觉·cv·形状提取
音视频牛哥10 小时前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能
招摇的一半月亮12 小时前
P2242 公路维修问题
数据结构·c++·算法
f***019313 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
合方圆~小文13 小时前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椰萝Yerosius14 小时前
[题解]2024CCPC郑州站——Z-order Curve
c++·算法
audyxiao00115 小时前
期刊研究热点扫描|一文了解计算机视觉顶刊TIP的研究热点
人工智能·计算机视觉·transformer·图像分割·多模态