zoukankan      html  css  js  c++  java
  • OpenCV 使用ROI进行图像切割

    ROI(region of interest)——感兴趣区域。

    1.用途

    这个区域是图像分析所关注的重点。圈定这个区域,以便进行进一步的处理。而且,使用ROI指定

    想读入的目标,可以减少处理时间,增加精度,给图像处理带来不小的便利。

    2.定义ROI方法

    • 使用表示矩阵区域的Rect。

    它指定矩阵的左上角坐标(构造函数的前两个参数)和矩阵的长宽(构造函数的后两个参数)以定义一个矩阵区域。

    // 定义一个Mat类型并给定其设定的区域
    Mat imageROI;
    // 方法一
    imageROI = image(Rect(500, 250, logo.cols, logo.rows));
    • 指定感兴趣行或列的范围(Range)。

    Range是指从起索引到终止索引(不包括终止索引)的一连串连续序列。cRange可以用来定义Range。如果使用Range来定义ROI,那么前例中定义ROI的代码可以重写为:

    // 方法二
    imageROI = image( Range(250, 250+logoImage.rows), 
    Range(200, 200+logoImage.cols));

     3.切割具体步骤

    • 将要切割下的图像区域局部设置为ROI
    void cvSetImageROI(IplImage* image,CvRect rect);
    • 创建一个与切割图像大小相同的新图像
    IplImage* cvCreateImage( CvSize size, int depth, int channels );
        depth 图像元素的位深度,可以是下面的其中之一:
       
    IPL_DEPTH_8U 无符号8位整型
    IPL_DEPTH_8S 有符号8位整型
    IPL_DEPTH_16U 无符号16位整型
    IPL_DEPTH_16S 有符号16位整型
    IPL_DEPTH_32F 单精度浮点数
    IPL_DEPTH_64F 双精度浮点数

        channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的
    • 将原图像复制到新图像中
    void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL ); 

         操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。函数cvCopy从输入数组中复制选定的成分到输出数组:

        如果mask(I)!=0,则dst(I)=src(I)。

        如果输入输出数组中的一个是IplImage类型的话,其ROI和COI将被使用。输入输出数组必须是同样的类型、维数和大小。函数也可以用来复制散列数组(这种情况下不支持mask)。

    • 释放ROI区域
    cvResetIamgeROI(src);

    4.实例
      如何利用ROI将一幅图加到另一幅图的指定位置。

      通过一个图像掩码,直接将插入处的像素设置为插入图像的像素值,这样效果会很逼真。

      1 #include <opencv2/core/core.hpp>
      2 #include <opencv2/highgui/highgui.hpp>
      3 #include <iostream>
      4 
      5 using namespace cv;
      6 using namespace std;
      7 
      8 bool  ROI_AddImage();
      9 bool  LinearBlending();
     10 bool  ROI_LinearBlending();
     11 void   ShowHelpText();
     12 
     13 int main(   )
     14 {
     15     system("color 6F");
     16 
     17     if(ROI_AddImage( )&& LinearBlending( )&&ROI_LinearBlending( ))
     18     {
     19         cout<<endl<<"
    运行成功,得出了需要的图像";
     20     }
     21 
     22     waitKey(0);
     23     return 0;
     24 }
     25 
     26 
     27 
     28 
     29 //----------------------------------【ROI_AddImage( )函数】----------------------------------
     30 // 函数名:ROI_AddImage()
     31 //    描述:利用感兴趣区域ROI实现图像叠加
     32 //----------------------------------------------------------------------------------------------
     33 bool  ROI_AddImage()
     34 {
     35 
     36     // 【1】读入图像
     37     Mat srcImage1= imread("dota_pa.jpg");
     38     Mat logoImage= imread("dota_logo.jpg");
     39     if( !srcImage1.data ) { printf("读取srcImage1错误~! 
    "); return false; }
     40     if( !logoImage.data ) { printf("读取logoImage错误~! 
    "); return false; }
     41 
     42     // 【2】定义一个Mat类型并给其设定ROI区域
     43     Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows));
     44 
     45     // 【3】加载掩模(必须是灰度图)
     46     Mat mask= imread("dota_logo.jpg",0);
     47 
     48     //【4】将掩膜拷贝到ROI
     49     logoImage.copyTo(imageROI,mask);
     50 
     51     // 【5】显示结果
     52     namedWindow("<1>利用ROI实现图像叠加示例窗口");
     53     imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1);
     54 
     55     return true;
     56 }
     57 
     58 
     59 //---------------------------------【LinearBlending()函数】-------------------------------------
     60 // 函数名:LinearBlending()
     61 // 描述:利用cv::addWeighted()函数实现图像线性混合
     62 //--------------------------------------------------------------------------------------------
     63 bool  LinearBlending()
     64 {
     65     //【0】定义一些局部变量
     66     double alphaValue = 0.5; 
     67     double betaValue;
     68     Mat srcImage2, srcImage3, dstImage;
     69 
     70     // 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )
     71     srcImage2 = imread("mogu.jpg");
     72     srcImage3 = imread("rain.jpg");
     73 
     74     if( !srcImage2.data ) { printf("读取srcImage2错误! 
    "); return false; }
     75     if( !srcImage3.data ) { printf("读取srcImage3错误! 
    "); return false; }
     76 
     77     // 【2】进行图像混合加权操作
     78     betaValue = ( 1.0 - alphaValue );
     79     addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
     80 
     81     // 【3】显示原图窗口
     82     imshow( "<2>线性混合示例窗口【原图】", srcImage2 );
     83     imshow( "<3>线性混合示例窗口【效果图】", dstImage );
     84 
     85     return true;
     86 
     87 }
     88 
     89 //---------------------------------【ROI_LinearBlending()】-------------------------------------
     90 // 函数名:ROI_LinearBlending()
     91 // 描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义
     92 //              感兴趣区域ROI,实现自定义区域的线性混合
     93 //--------------------------------------------------------------------------------------------
     94 bool  ROI_LinearBlending()
     95 {
     96 
     97     //【1】读取图像
     98     Mat srcImage4= imread("dota_pa.jpg",1);
     99     Mat logoImage= imread("dota_logo.jpg");
    100 
    101     if( !srcImage4.data ) { printf("读取srcImage4错误~! 
    "); return false; }
    102     if( !logoImage.data ) { printf("读取logoImage错误~! 
    "); return false; }
    103 
    104     //【2】定义一个Mat类型并给其设定ROI区域
    105     Mat imageROI;
    106     //方法一
    107     imageROI= srcImage4(Rect(200,250,logoImage.cols,logoImage.rows));
    108     //方法二
    109     //imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
    110 
    111     //【3】将logo加到原图上
    112     addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI);
    113 
    114     //【4】显示结果
    115     imshow("<4>区域线性图像混合示例窗口",srcImage4);
    116 
    117     return true;
    118 }
  • 相关阅读:
    KVM源代码阅读--内核版本3.17.4
    最新的裸机联想笔记本装win7系统/SSD(固态硬盘)上安装win7系统/联想K4450A i7装win7系统
    Vmaware复制后的虚拟机不能上网问题解决
    KVM基于X86硬件辅助的虚拟化技术实现机制【转】
    KVM和QEMU简介
    笔记--[基于完全虚拟化的安全监控技术研究_张丽(2013)]
    win8预装系统环境下安装win7问题以及双操作系统安装解决
    VM 操作系统实例化(基于 KVM 的虚拟化研究及应用--崔泽永(2011))的论文笔记
    VMware vsphere Hypervisor、VMware vsphere和VMware Workstation小记
    虚拟化、(完)全虚拟化、半虚拟化和准虚拟化技术个人总结
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14338360.html
Copyright © 2011-2022 走看看