画像の横方向への単純連結
C
#include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i, img_num; const char defaultfile[2][32] = {"../image/moon.png", "../image/sunset.png"}; int total_width=0, max_height=0; IplImage **src_img; IplImage *combined_img; CvRect roi = cvRect(0, 0, 0, 0); // (1)load all images specified on the command line img_num = argc > 1 ? argc-1 : 2; src_img = (IplImage**)cvAlloc(sizeof(IplImage*)*img_num); for(i=0; i<img_num; i++) { src_img[i] = cvLoadImage (argc-1?argv[i+1]:defaultfile[i], CV_LOAD_IMAGE_COLOR); if(src_img[i] == 0) return -1; total_width += src_img[i]->width; max_height = max_height < src_img[i]->height ? src_img[i]->height : max_height; } // (2)append images one after another combined_img = cvCreateImage(cvSize(total_width, max_height), IPL_DEPTH_8U, 3); cvZero(combined_img); for(i=0; i<img_num; i++) { roi.width = src_img[i]->width; roi.height = src_img[i]->height; cvSetImageROI(combined_img, roi); cvCopy(src_img[i], combined_img, NULL); roi.x += roi.width; } cvResetImageROI(combined_img); // (3)show the combined image, and quit when any key pressed cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE); cvShowImage ("Image", combined_img); cvWaitKey (0); cvDestroyWindow("Image"); cvReleaseImage(&combined_img); for(i=0; i<img_num; i++) { cvReleaseImage(&src_img[i]); } cvFree(&src_img); return 0; }
// (1)コマンドライン引数で指定された画像を全て読み込みます.
コマンドライン引数で指定された画像ファイルを読み込み,IplImage の配列に格納します.また同時に,画像の幅の合計値,高さの最大値を求めます.
// (2)画像を横方向に,単純に連結します.
ROI を利用したコピー(cvCopy)を用いて画像を横方向に連結します.連結の際は,最大の画像高さが利用されるので,高さの小さい画像の下方向には隙間ができます.また,結果画像の幅は,全ての画像の合計値となります.
// (3)連結後の画像を表示し,何かキーが押されると終了します.
結合された画像を表示し,何かキーが押された場合プログラムを終了します.
C++
#include <cv.h> #include <highgui.h> using namespace cv; int main (int argc, char **argv) { int img_num = argc > 1 ? argc-1 : 2; const char defaultfile[2][32] = {"../image/moon.png", "../image/sunset.png"}; int total_width=0, max_height=0; // (1)load all images specified on the command line vector<Mat> src_img; for(int i=0; i<img_num; i++) { src_img.push_back(imread(argc-1?argv[i+1]:defaultfile[i])); Mat last = src_img.back(); if(!last.data) return -1; total_width += last.cols; max_height = max_height < last.rows ? last.rows : max_height; } // (2)append images laterally one after another Mat combined_img(Size(total_width, max_height), CV_8UC3); vector<Mat>::iterator it = src_img.begin(), it_end = src_img.end(); Rect roi_rect; for(; it!=it_end; ++it) { roi_rect.width = it->cols; roi_rect.height = it->rows; Mat roi(combined_img, roi_rect); it->copyTo(roi); roi_rect.x += it->cols; } // (3)show the combined image, and quit when any key pressed namedWindow("Combined Image", CV_WINDOW_AUTOSIZE); imshow("Combined Image", combined_img); waitKey(0); return 0; }
// (1)コマンドライン引数で指定された画像を全て読み込みます.
コマンドライン引数で指定された画像ファイルを読み込み,vector に追加します.また同時に,画像の幅の合計値,高さの最大値を求めます.
// (2)画像を横方向に,単純に連結します.
ROI を利用したコピー(Mat.copyTo)を用いて,画像を横方向に連結します.連結の際は,最大の画像高さが利用されるので,高さの小さい画像の下方向には隙間ができます.また,結果画像の幅は,全ての画像の合計値となります.
// (3)連結後の画像を表示し,何かキーが押されると終了します.
結合された画像を表示し,何かキーが押された場合プログラムを終了します.