山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他OpenCVを使用して2つのjpgファイルを1つのウィンドウの中に横に並べて表示する
概要
OpenCVのMat型を使用してjpgファイルを2個読み込み1つのウィンドウの中に横に並べて表示するプログラムである。
Visual C++ を対象としておりOpenCVのインストールが必要である。
        
        Visual C++ を対象としておりOpenCVのインストールが必要である。

テスト環境
コンパイラ
Visual C++ 2008 Express(32bit)/Standard(32/64bit) with OpenCV2.3.1Visual C++ 2013 Express 32bit/64bit with OpenCV2.4.10
実行環境
Windows 7 32/64bitOpenCVのインストール及び環境設定
プログラムソースの概要
          #include の後の行からusing namespace cv;の手前までは、Visual C++のバージョン及びRelease/Debug 32bit/64bit 静的リンク/動的リンクに合わせてロードするLIBのファイル名を自動的に作成するために記述しています。
固定された環境であれば、簡素に記述可能です。
例えば Visual C++ 2013 32bit Release 動的リンクであれば、以下のように簡素に記述できます。
imgのメンバー変数のdataがNULLの場合は、ロードに失敗しているのでプログラムを終了させます。
2つのjpgファイルを横に並べた大きさのMat型baseを作成します。
baseに張り付ける領域を示すMat型 roi1とroi2を作成します。
Rectで領域を指定していますが、張り付け後の領域であるのがミソです。
copyToによりimgをroi1とroi2にコピーします。
namedWindow関数によりウィンドウを開きます。
imshow関数によりbaseをウィンドウに表示します。
waitkey()によりキー入力があるまで待機します。
        固定された環境であれば、簡素に記述可能です。
例えば Visual C++ 2013 32bit Release 動的リンクであれば、以下のように簡素に記述できます。
#pragma comment(lib, "c:/opencv2.4.10/opencv/build/vc12/x86/lib/opencv_core2410.lib")
#pragma comment(lib, "c:/opencv2.4.10/opencv/build/vc12/x86/lib/opencv_highgui2410.lib")
_tWinMain
imread関数でjpgファイルをMat型の変数imgにロードします。imgのメンバー変数のdataがNULLの場合は、ロードに失敗しているのでプログラムを終了させます。
2つのjpgファイルを横に並べた大きさのMat型baseを作成します。
baseに張り付ける領域を示すMat型 roi1とroi2を作成します。
Rectで領域を指定していますが、張り付け後の領域であるのがミソです。
copyToによりimgをroi1とroi2にコピーします。
namedWindow関数によりウィンドウを開きます。
imshow関数によりbaseをウィンドウに表示します。
waitkey()によりキー入力があるまで待機します。
ソースコード
//      OpenCVを使用して1.jpg 2.jpgを1つのウィンドウに横に並べて表示するサンプル
//      Open CV 2.3.1/2.4.10 サポート
//      例えばVisual C++ 2013でOpen CV 2.4.10でコンパイルする場合の設定は以下の通りとなる
//              VCのインクルードディレクトリに C:\opencv2.4.10\opencv\build\include; を付加
//              動的リンクで作成した場合は、サンプルの実行には環境変数PATHに以下のフォルダーを登録する必要がある。
//              win64   C:\opencv2.4.10\opencv\build\x64\vc12\bin
//              win32   C:\opencv2.4.10\opencv\build\x86\vc12\bin
//      動作確認
//              Visual C++ 2008 Standard Release 64bit 動的/静的    OpenCV 2.3.1
//              Visual C++ 2008 Standard Debug 64bit 動的/静的              OpenCV 2.3.1
//              Visual C++ 2008 Standard Release 32bit 動的/静的    OpenCV 2.3.1
//              Visual C++ 2008 Standard Debug 32bit 動的/静的              OpenCV 2.3.1
//              Visual C++ 2013 Express Debug 32bit 動的/静的               OpenCV 2.4.10
//              Visual C++ 2013 Express Release 32bit 動的/静的             OpenCV 2.4.10
//              Visual C++ 2013 Express Debug 64bit 動的/静的               OpenCV 2.4.10
//              Visual C++ 2013 Express Release 64bit 動的/静的             OpenCV 2.4.10
#include <windows.h>
#include <opencv2/opencv.hpp>
#include <tchar.h>
#ifdef _DLL     //      動的リンク
 #define CV_LINK_MODE "/lib/"
#else   //      静的リンク
 #define CV_LINK_MODE "/staticlib/"
#endif
// バージョン取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
#define CV_INST_SUB_DIR  "opencv" ## CVAUX_STR(CV_MAJOR_VERSION) ## "." CVAUX_STR(CV_MINOR_VERSION) ## "." CVAUX_STR(CV_SUBMINOR_VERSION)
#define CV_INST_DIR "c:/" ## CV_INST_SUB_DIR ## "/opencv/build"
//      32bit/64bit ランタイムのリンクモード等に応じてLIBファイルのフォルダー名(CV_LIB_DIR)を作成
#ifdef _WIN64
 #ifdef _DLL
  #define CV_LIB_DIR  CV_INST_DIR ## "/x64/" ## CV_MS_VER ## "/lib/"
 #else
  #define CV_LIB_DIR  CV_INST_DIR ## "/x64/" ## CV_MS_VER ## "/staticlib/"
 #endif
#else
 #ifdef _DLL
  #define CV_LIB_DIR  CV_INST_DIR ## "/x86/" ## CV_MS_VER ## "/lib/"
 #else
  #define CV_LIB_DIR  CV_INST_DIR ## "/x86/" ## CV_MS_VER ## "/staticlib/"
 #endif
#endif
#if _MSC_VER==1500
 #define VCVER 2008
 #define CV_MS_VER "vc9"
#endif
#if _MSC_VER==1600
 #define VCVER 2010
 #define CV_MS_VER "vc10"
#endif
#if _MSC_VER==1700
 #define VCVER 2012
 #define CV_MS_VER "vc11"
#endif
#if _MSC_VER==1800
 #define VCVER 2008
 #define CV_MS_VER "vc12"
#endif
#ifdef _DEBUG   //      デバック
 #define CV_EXT_STR "d.lib"
#else   //      リリース
 #define CV_EXT_STR ".lib"
#endif
#pragma comment(lib, CV_LIB_DIR "opencv_core"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, CV_LIB_DIR "opencv_highgui" CV_VERSION_STR CV_EXT_STR)
#ifdef _DLL     //      動的リンク
#else
 #pragma comment(lib,"comctl32.lib")
 #pragma comment(linker, "/nodefaultlib:\"msvcprt"  CV_EXT_STR "\"")
 #if CV_MAJOR_VERSION==2 && CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION==10
  #pragma comment(lib, CV_LIB_DIR "IlmImf"  CV_EXT_STR )
 #endif
 #pragma comment(lib, CV_LIB_DIR "libjasper"  CV_EXT_STR )
 #pragma comment(lib, CV_LIB_DIR "libjpeg"  CV_EXT_STR )
 #pragma comment(lib, CV_LIB_DIR "libpng"  CV_EXT_STR )
 #pragma comment(lib, CV_LIB_DIR "libtiff"  CV_EXT_STR )
 #pragma comment(lib, CV_LIB_DIR "zlib"  CV_EXT_STR )
#endif
using namespace cv;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, char* CmdLine, int nCmdShow){
        Mat img1=imread("1.jpg");
        if(img1.data==NULL){
                MessageBox(0,_TEXT("1.jpgが開けません"),_TEXT("エラー"),MB_OK);
                return 1;
        }
        Mat img2=imread("2.jpg");
        if(img2.data==NULL){
                MessageBox(0,_TEXT("2.jpgが開けません"),_TEXT("エラー"),MB_OK);
                return 2;
        }
        //      2つの画像を横に並べた大きさのMat型を作成する
        Mat base(max(img1.rows,img2.rows), img1.cols+img2.cols, CV_8UC3);
        //      img1を張り付ける領域をあらわすMat型を作成する
        Mat roi1(base, Rect(0 , 0 , img1.cols , img1.rows) );
        //      img1をroi1にコピーする
        img1.copyTo(roi1);
        //      img2を張り付ける領域をあらわすMat型を作成する
        Mat roi2( base,Rect(img1.cols , 0 , img2.cols , img2.rows) );
        //      img2をroi2にコピーする
        img2.copyTo(roi2);
        namedWindow("dualview",CV_WINDOW_AUTOSIZE);
        imshow("dualview",base);
        waitKey();
        return 0;
}
      Copyright (C) 2012 山本ワールド All Rights Reserved.
    
    
  