做图像对比时难免想要将两幅图像平行显示在同一幅图像中或者竖直显示在同一副图像中。opencv提供了cvSetImageROI()函数可以很简单的实现这一功能,我只需先读取两幅图像,确定图像要缩放的倍数后,再确定图像是按列并排还是按行并排,计算图像要缩放到的尺寸,以及设计两幅图像之间,图像和边缘之间要放多少空隙或者不放,就ok了。
下面就实现来看看。我的两幅图像大小是一样的,这里两幅都是IplImage图像,读入时先转成灰度图再共同显示,显示时上下左右离边界,两幅图像之间均有10个像素的距离,显示后在图像上画横线对比:
原图左:
原图右:
程序如下:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void main()
{
IplImage *image1=cvLoadImage("1-CMOS0.bmp");
IplImage *image2=cvLoadImage("1-CMOS1.bmp");
int H=image1->height;
int W=image1->width;
//以下为彩色转灰度图
IplImage* Img1 = cvCreateImage( cvSize(W,H), IPL_DEPTH_8U, 1);
IplImage* Img2 = cvCreateImage( cvSize(W,H), IPL_DEPTH_8U, 1);
cvCvtColor( image1, Img1, CV_RGB2GRAY);
cvCvtColor( image2, Img2, CV_RGB2GRAY);
//以下为设计新的图像
IplImage* ShowImage; //这个就是要共同显示两幅图像的图像
float scale=1.2;//图像缩放倍数
int sizew=W/scale;
int sizeh=H/scale;
int r=2;//一行放r幅图像
int c=1;//一列放c幅图像
int spaceW=30;//图像之间,图像和边缘之间所有的间隙之和
int spaceH=20;
int x= spaceW/(r+1); //左图像左上角起始点坐标
int y= spaceH/(c+1);
ShowImage = cvCreateImage( cvSize(30 + sizew*r, 20 + sizeh*c), IPL_DEPTH_8U, 1 ); //赋给这个图像大小并设为单通道1。如之前无转为灰度图步骤则设置为3.
//左图放在左边
cvSetImageROI(ShowImage, cvRect(x, y, (int)( W/scale ), (int)( H/scale )));
cvResize(Img1, ShowImage);
cvResetImageROI(ShowImage);
//右图放在右边
int x1=x+(int)( W/scale )+spaceW/(r+1);//右图像的左上角起始位置
int y1=y;
cvSetImageROI(ShowImage, cvRect(x1, y1, (int)( W/scale ), (int)( H/scale )));
cvResize(Img2, ShowImage);
cvResetImageROI(ShowImage);
//画横线用来对比
for( int j = 10; j < H; j += 24 )
{
cvLine( ShowImage, cvPoint(0,j), cvPoint(30 + sizew*r,j), cvScalar(255,255,255),1); //1是粗细
}
cvShowImage("共同显示", ShowImage);
cvWaitKey();
cvReleaseImage( &ShowImage );
}
程序运行后显示结果如下:
上面是简单的两幅图像并行显示的情况,多幅图像同时显示时,只需合理设计要显示图像的大小以及各图像的排列方式即可。