天天看點

opencv 将兩張圖檔顯示到一幅圖檔中

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

}