利用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);
}