• OpenCV7-copyTo截取ROI


    OpenCV7-copyTo截取ROI


    copyTo截取感兴趣区域

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

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    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));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    深拷贝函数copyTo:

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #include 
    #include  // debug no log
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    密码学的基础:X.690和对应的BER CER DER编码
    【AI绘画】给我一句话,送你一幅画。
    如何为你的地图数据设置地图样式?
    PLsql 中好用的插件显示不出来
    智能时代的智能工具(gpt)国产化助手
    如何按照洁净区不同等级选择不同流量的粒子计数器设备?
    GaussDB数据库SQL系列-SQL与ETL浅谈
    Azides-PEG-PLGA 叠氮-聚乙二醇-聚乳酸-羟基乙酸共聚物 的参数信息
    把飞书云文档变成HTML邮件:问题挑战与解决历程
    渗透测试之XSS漏洞:记一次模拟注入攻击
  • 原文地址:https://blog.csdn.net/ArthurHai521/article/details/133772652