上一次介绍了多图像单窗口的使用,其中很重要甚至可以说是至关重要的一步就是cvSetimageROI函数以及其他函数配合使用的地方!代码如下(详细请参考“openCV入门----单窗口多图片显示”博客):
cvSetImageROI(DispImage, cvRect(x, y, (int)(w / scale), (int)(h / scale)));
// Resize the input image and copy the it to the Single Big Image
cvResize(img, DispImage);
// Reset the ROI in order to display the next image
cvResetImageROI(DispImage);
详细解释如下:
1>使用cvSetImageROI函数先将整个图像截取一部分作为你所感兴趣的矩形部分,也就是第N张图片所在的位置(其输入信息包括举行起始点坐标和长、宽),将这个区域赋给DispImage对象进行暂存;
2>使用cvResize函数将img对象按照DispImage(此时是你定义的感兴趣的区域)进行调整(包括图像和大小),使得两者相匹配。也就是说,此时img也就是ROI了,目标图片也就因此放置到了整张图像上去(注意:这里不是只调整大小,而且还调整了图像,两者相互匹配!!!!);
3>使用cvResetImageROI函数释放DispImage所暂存的ROI区域,方便下次继续操作。
以上就是详细地逻辑步骤!
那么我们可以来针对cvSetImageROI函数或者说是这一系列配套函数,做一个类似于图片截取的功能程序!
代码如下:
#include<iostream>
#include"cv.h"
#include"highgui.h"
#include"cxcore.h"
using namespace std;
/*
做一个类似于截图的程序
*/
int main()
{
// 隐藏 console 窗口
//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
//首先载入一幅图像
IplImage* img = cvLoadImage("8.png");
//提取出img原图中的ROI区域作为“截图”区域
cvSetImageROI(img, cvRect(10, 10, 200, 200));
//创建一张空的新图像来承载ROI区域图像
IplImage* dst = cvCreateImage(cvSize(200,200),8,3);
cvResize(img, dst);
//cvCopy(img, dst);
//取消ROI区域设置,恢复img
cvResetImageROI(img);
//显示图像
cvNamedWindow("scr", CV_WINDOW_AUTOSIZE);
cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
cvShowImage("scr", img);
cvShowImage("dst", dst);
cvWaitKey(5000);
system("pause");
cvDestroyWindow("scr");
cvDestroyWindow("dst");
cvReleaseImage(&img);
cvReleaseImage(&dst);
return 0;
}
结果:
上述代码的具体设计思路正如上文所述的三个步骤,这里不再赘述!
一个简单的截图效果就出来了!