10ROI

ROI

感兴趣区域,可以在一张图片上标志一块区域,对这块区域进行特殊处理。比如:把A图的头部设为感兴趣区域,再将同等大小的图覆盖在该感兴趣区域。实现贴图的效果。

 

核心函数:

cvSetImageROI(img,rect);      

在图img上设置大小rect的感兴趣区域。

cvCopy(sub_img,img,0);

将图sub_img覆盖在图img上。

cvResetImageROI(img);

刷新图img

源代码:
// ROI.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include "stdio.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <Windows.h>
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage * img=cvLoadImage("1.jpg",1);
    IplImage * sub_img=cvLoadImage("2.jpg",1);
    
    CvRect rect={10,10,sub_img->width,sub_img->height};
    //10 ,10为贴图的原点,后两参数为贴图的大小。
    //rect.x=10,rect.x=10,rect.width=sub_img->width,rect.height=sub_img->height;
    //与上句效果等同

cvSetImageROI(img,rect);
    cvCopy(sub_img,img,0);
    cvResetImageROI(img);

    cvShowImage("图像粘贴",img);
    cvWaitKey(0);
    system("pause");
    return 0;
}

 

另外:

在上一例中,讲解了通道分离。

在此,也可以利用通道色彩来进行贴图。

把A图上的像素点的(B,G,R)依次赋值给B图的像素点。

 

源代码:
// ROI.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include "stdio.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <Windows.h>
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage * img=cvLoadImage("1.jpg",1);
    IplImage * sub_img=cvLoadImage("2.jpg",1);
    
    CvRect rect={10,10,sub_img->width,sub_img->height};

    for(int y=0;y<sub_img->height;++y)
    {
        unsigned char * str1=(unsigned char *)(img->imageData+img->widthStep*y);
        unsigned char * str2=(unsigned char *)(sub_img->imageData+sub_img->widthStep*y);
        for(int x=0;x<sub_img->width;++x)
        {
            str1[3*(x+rect.x)+0]=str2[3*x+0];
            str1[3*(x+rect.x)+1]=str2[3*x+1];
            str1[3*(x+rect.x)+2]=str2[3*x+2];
        }
    }
    cvShowImage("图像粘贴",img);
    cvWaitKey(0);
    system("pause");
    return 0;
}

 

posted @ 2017-09-03 21:34  gd_沐辰  阅读(190)  评论(0编辑  收藏  举报