順便又復習了一下cvcopy如何進行圖像拼接(最近覺得打開多幅圖像分別看不如縮小掉放拼接到一幅圖像上對比來的好)
首先把拼接的目標圖像設置興趣區域ROI,比如我有一個total,要把a、b、c分別從左到右拼接到total上,那就分三次對total設置敢興趣區域ROI(注意不是對a、b、c設置),然后再用cvcopy復制過去,如果要加文字可以在復制之前預先把文字加到a、b、c上
然后就是圖像的腐蝕和膨脹,可以自定義一個kernel
代碼:
#include<cv.h>
#include<highgui.h>
int main(void)
{
cvNamedWindow("Compare");
IplImage *temp = cvLoadImage("zhiwen.jpg");
IplImage *src = cvCreateImage(CvSize(temp->width / 2, temp->height / 2), temp->depth, temp->nChannels);
cvResize(temp, src);
IplImage *total = cvCreateImage(CvSize(src->width * 3, src->height),src->depth,src->nChannels);
IplImage *erode = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
IplImage *dilate= cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
cvZero(erode);
cvZero(dilate);
IplConvKernel *kernel = cvCreateStructuringElementEx(3,3,2,2,CV_SHAPE_RECT);
cvErode(src, erode,kernel,1);
cvDilate(src, dilate,kernel,1);
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1, 1, 2, 2, CV_AA);
char *a = "Original", *b = "Erode",*c="Dilate";
//放置字體
cvPutText(src, a,CvPoint(0, 40),&font,CV_RGB(255,0,0));
cvPutText(erode, b, CvPoint(0, 40), &font, CV_RGB(255, 0, 0));
cvPutText(dilate, c, CvPoint(0, 40), &font, CV_RGB(250, 0, 0));
cvSetImageROI(total, cvRect(0, 0, src->width, src->height));//放入原圖像
cvCopy(src, total);
cvResetImageROI(total);//記得取消ROI
cvSetImageROI(total, cvRect(src->width, 0, src->width, src->height));//放入腐蝕結果
cvCopy(erode, total);
cvResetImageROI(total);
cvSetImageROI(total, CvRect(src->width * 2, 0, src->width, src->height));//放入膨脹結果
cvCopy(dilate, total);
cvResetImageROI(total);
cvShowImage("Compare", total);//對比圖
cvWaitKey(0);
cvSaveImage("result.png", total);
cvDestroyAllWindows();
cvReleaseImage(&temp);
cvReleaseImage(&src);
cvReleaseImage(&total);
cvReleaseImage(&dilate);
cvReleaseImage(&erode);
cvReleaseStructuringElement(&kernel);
return 0;
}
效果圖:

