利用OpenCV处理图片后,希望将处理后的图片和处理前的图片显示在一起,以方便看出两者之间的差别。
刚开始的想法是利用SetImageRoi和CvCopy函数,可是CvCopy函数必须要求源图片和目的图片的尺寸一致,即使设置了Roi,由于图片的尺寸不一致,运行的时候还是会导致尺寸不匹配的错误。
然后想到的是SetImageRoi和CvCloneImage函数,但是CvCloneImage函数运行后,会将目的图片的尺寸修改成和源图片的尺寸一致,即使设置了Roi也没有效果。
后来看到了CvRepeat这个函数,可以完成想要的功能。
- #include <cv.h>
- #include <cxcore.h>
- #include <cassert>
- using namespace std;
- void ImageMerge(IplImage* pImageA,IplImage* pImageB,IplImage*& pImageRes)
- {
- assert(pImageA != NULL && pImageB != NULL);
- assert(pImageA->depth == pImageB->depth && pImageA->nChannels == pImageB->nChannels);
- if (pImageRes != NULL)
- {
- cvReleaseImage(&pImageRes);
- pImageRes = NULL;
- }
- CvSize size;
- size.width = pImageA->width + pImageB->width + 10;
- size.height = (pImageA->height > pImageB->height) ? pImageA->height : pImageB->height;
- pImageRes = cvCreateImage(size,pImageA->depth,pImageA->nChannels);
- CvRect rect = cvRect(0,0,pImageA->width,pImageA->height);
- cvSetImageROI(pImageRes,rect);
- cvRepeat(pImageA,pImageRes);
- cvResetImageROI(pImageRes);
- rect = cvRect(pImageA->width + 10,0,pImageB->width,pImageB->height);
- cvSetImageROI(pImageRes,rect);
- cvRepeat(pImageB,pImageRes);
- cvResetImageROI(pImageRes);
- }