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; }