OpenCV学習(一)


OpenCV学習
シンボル規則:
g_nはグローバルな整数変数を表し、g_dはグローバルな32ビット変数、srcはソースオブジェクト、g_bはブール値を表す.
画像の読み込み:imread()関数
関数のプロトタイプ:
Mat imread(const string& filename,intflags=1)
  • const string&タイプのfilenameは、画像をロードするパス名である.
  • intタイプのflagsは、ロードIDであり、ロード画像の色タイプを指定する.

  • 階調図,原図,深さ8/16/32ビットの図の意味を理解する必要がある.
    使用方法:
    Mat image0 = imread("1.jpg",2|4);	//       
    Mat image1 = imread("1.jpg",0);		//     
    Mat image2 = imread("1.jpg",199);	//         
    

    画像の表示:imshow()関数
    関数のプロトタイプ:
    void imshow(const strings& winname, InputArray mat);
    
  • const string&タイプのwinnameで、表示するウィンドウ識別名を記入します.
  • InputArrayタイプのmatで、表示する画像を記入します.

  • imshow()は、指定したウィンドウに画像を表示するために使用されます.既定値はCV_WINDOW_AUTOSIZEは、オリジナル画像サイズを表示します.
    画像の深さに応じて、imshow()で画像をスケールします.
  • 8ビット符号なし、原図
  • 16ビット符号なし/32ビット整数、画素値/256
  • を表示する.
  • 32ビット浮動小数点、ピクセル値*255
  • 使用方法:
    Mat srcImage=imread("1.jpg");//    
    mshow("【   】",srcImage);//    
    

    作成ウィンドウさくせいうぃんどう:namedWindow()関数namedWindow()かんすう
    関数のプロトタイプ:
    void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE);
    
  • const string&型のnameは、ウィンドウの識別子として使用されるウィンドウ名を記入します.
  • intタイプのflags、ウィンドウの識別は、以下のいくつかの値を記入することができます.
    WINDOW_NORMAL、この値を設定すると、ユーザーはウィンドウのサイズを変更できます(制限はありません).OpenCV 2ではCV_と書くこともできますWINDOW_NORMAL.
    WINDOW_AUTOSIZEは、この値を設定すると、表示される画像に合わせて自動的にウィンドウサイズが調整され、ユーザーが手動でウィンドウサイズを変更することはできません.OpenCV 2ではCV_と書くこともできますWINDOW_AUTOSIZE.
    WINDOW_OPENGL、この値を設定し、ウィンドウ作成時にOpenGLをサポートします.OpenCV 2ではCV_と書くこともできますWINDOW_OPENGL.
  • namedWindow関数の役割は、指定した名前で画像とプログレスバーとして使用できるコンテナウィンドウを作成することです.
  • は、destroyWindow()またはdestroyAllWindows()関数を呼び出してウィンドウを閉じ、以前に割り当てられたウィンドウに関連するすべてのメモリ領域をキャンセルすることができる.

  • 画像をファイルに出力:imwrite()関数
    関数の意味:imwrite関数は、指定されたファイルに画像を保存するために使用されます.
    画像フォーマットはファイル拡張子に基づいており、保存可能な拡張子はimreadで読み取れる画像拡張子と一致している.
    関数宣言:
    bool imwrite(const string& filename,InputArray img,const vector<int>& params=vector<int>();
    
  • const string&タイプのfilenameで、書き込むファイル名を記入します.「123.jpg」などの接尾辞を付けることに注意してください.
  • InputArrayタイプのimgで、一般的にMatタイプの画像データを記入します.
  • const vector&タイプのparamsは、特定のフォーマットで保存されたパラメータ符号化として表される.デフォルト値vector0があるので、一般的には記入する必要はありません.
  • JPEG形式のピクチャで、パラメータ(3番目)は0から100までのピクチャ品質(CV_IMWRITE_JPEG_QUALITY)を表し、デフォルト値は95です.
  • PNG形式のピクチャは、圧縮レベル(CV_IMWRITE_PNG_COMPRESSION)が0から9であることを示す.より高い値は、より小さいサイズとより長い圧縮時間を意味し、デフォルトは3です.
  • PPM、PGM、またはPBMは、0または1の値をとり、デフォルト値は1であるバイナリフォーマットフラグ(CV_IMWRITE_PXM_BINARY)を表す.

  • サンプルプログラム
    // OpenCV     png  ,           。
    #include
    #include 
    using namespace cv;
    using namespace std;
    void createAlphaMat(Mat &mat)
    {
         
    for(inti=0;i<mat.rows;++i){
         
    	for(intj=0;j<mat.cols;++j){
         
    		Vec4b&rgba=mat.at<Vec4b>(i,j);
    		rgba[0]=UCHAR_MAX;
    		rgba[1]=saturate_cast<uchar>((float(mat.cols-j))/((float)mat.cols)*UCHAR_MAX);
    		rgba[2]=saturate_cast<uchar>((float (mat.rows-i))/((float)mat.rows)*UCHAR_MAX);
    		rgba[3]=saturate_cast<uchar>(0.5*(rgba[1]+rgba[2]));
    		}
    	}
    }
    int main()
    {
         
    //   Alpha   Mat
    Mat mat (480, 640, CV_8UC4);
    createAlphaMat(mat);
    vector<int>compression_params;
    //     OpenCV2  :
    //compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    //     OpenCV3  :
    compression_params,push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);
    try{
         
    imwrite("  Alpha  .png",mat,compression_params);
    imshow("   PNG ",mat);
    fprintf(stdout,"PNG     alpha      ~
    imwrite
    "
    ); waitKey(0); } catch(runtime_error&ex){ fprintf(stderr," PNG :%s
    "
    ,ex.what()); return 1; } return 0; }

    総合例1:
    //      ,         ,    ,           jpg      。
    
    #include 
    #include 
    using namespace cv;
    
    int main( )
    {
         
    	//----------------【 、        】-------------
    	//	  :                  
    	//------------------------------------------------
    	Mat girl=imread("girl.jpg"); //     Mat
    	namedWindow("【1】   "); //       "【1】   "     
    	imshow("【1】   ",girl);//     "【1】   "     
    
    	//--------------------【 、      】-------------------
    	//	  : 、      
    	//-----------------------------------------------------
    	//    
    	Mat image= imread("dota.jpg",199);
    	Mat logo= imread("dota_logo.jpg");
    
    	//      
    	namedWindow("【2】   ");
    	imshow("【2】   ",image);
    
    	namedWindow("【3】logo ");
    	imshow("【3】logo ",logo);
    
    	//     Mat  ,    ,   ROI
    	Mat imageROI;
    	//   
    	imageROI= image(Rect(800,350,logo.cols,logo.rows));
    	//   
    	//imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));
    
    	//  logo     
    	addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);
    
    	//    
    	namedWindow("【4】  +logo ");
    	imshow("【4】  +logo ",image);
    
    	//-------------------------【 、     】---------------------
    	//	  :   Mat         
    	//------------------------------------------------------------
    	//    jpg        
    	imwrite(" imwrite     .jpg",image);
    
    	waitKey();
    
    	return 0;
    }
    

    プログラムインタフェースにスライドバーを追加する:createTrackbar()関数createTrackbar()関数
    関数の意味:createTrackbar関数は、数値を調整できるスライドバー(トラックバーとも呼ばれることが多い)を作成し、指定したウィンドウにスライドバーをアタッチするのに便利です.コールバック関数と組み合わせて使用されることが多い.
    関数のプロトタイプ:
    int createTrackbar(conststring& trackbarname,conststring& winname,int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
    

    パラメータの意味:
  • const string&タイプのtrackbarnameは、作成したトラックを表すトラックバーの名前です.
  • const string&タイプのwinname、ウィンドウの名前、namedWindow()がウィンドウを作成するときに記入するウィンドウ名に対応します.
  • int*タイプのvalueは、スライダ位置を示す整数のポインタを指します.作成時にスライダの初期位置が変数の現在の値になります.
  • intタイプのcountは、スライダが達成できる最大位置の値を示しています.スライダの最小位置の値は、常に0です.
  • TrackbarCallbackタイプのonChangeで、デフォルト値0があります.これは、スライダの位置が変わるたびにコールバックされるコールバック関数を指すポインタです.この関数のプロトタイプはvoidXXXX(int,void*)でなければならない.1番目のパラメータはトラックバーの位置で、2番目のパラメータはユーザーデータです.コールバックがNULLポインタである場合、コールバック関数の呼び出しがないことを示し、3番目のパラメータvalueのみが変化する.
  • void*タイプのuserdataで、デフォルト値0もあります.このパラメータは、トラックバーイベントを処理するためにユーザがコールバック関数に渡すデータです.使用する3番目のパラメータvalue実パラメータがグローバル変数であれば、このuserdataパラメータをまったく管理しなくてもよい.

  • 例:
    #include 
    #include 
    using namespace cv;
    
    //-----------------------------------【     】-----------------------------------------
    //    :        
    //---------------------------------------------------------------------------------------
    #define WINDOW_NAME "【      &      】"        //          
    
    //-----------------------------------【        】------------------------------------
    //		  :      
    //---------------------------------------------------------------------------------------
    const int g_nMaxAlphaValue = 100;//Alpha     
    int g_nAlphaValueSlider;//        
    double g_dAlphaValue;		/*g_n         ,g_d     32   */
    double g_dBetaValue;
    
    //         
    Mat g_srcImage1;
    Mat g_srcImage2;
    Mat g_dstImage;
    
    //-----------------------------------【on_Trackbar( )  】--------------------------------
    //		  :          
    //---------------------------------------------------------------------------------------
    void on_Trackbar( int, void* )		//    
    {
         
    	//    alpha          
    	g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;
    	// beta  1  alpha 
    	g_dBetaValue = ( 1.0 - g_dAlphaValue );
    
    	//  alpha beta       
    	addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
    
    	//     
    	imshow( WINDOW_NAME, g_dstImage );
    }
    
    //--------------------------【ShowHelpText( )  】----------------
    //		  :      
    //----------------------------------------------------------------
    
    void ShowHelpText()
    {
         
    	//       OpenCV  
    	printf("

    \t\t\t !
    "
    ); printf("

    \t\t\t , 《OpenCV3 》
    "
    ); printf("

    \t\t\t OpenCV :"
    CV_VERSION ); printf("

    ------------------------------------------------------------------
    "
    ); } //-------------------------【main( ) 】--------------------------- // : , //----------------------------------------------------------------- int main( int argc, char** argv ) { // ShowHelpText(); // ( ) g_srcImage1 = imread("1.jpg"); g_srcImage2 = imread("2.jpg"); if( !g_srcImage1.data ) { printf(" , imread ~!
    "
    ); return -1; } if( !g_srcImage2.data ) { printf(" , imread ~!
    "
    ); return -1; } // 70 g_nAlphaValueSlider = 70; // namedWindow(WINDOW_NAME, 1); // char TrackbarName[50]; sprintf( TrackbarName, " %d", g_nMaxAlphaValue ); createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar ); // on_Trackbar( g_nAlphaValueSlider, 0 ); // waitKey(0); return 0; }

    Visual Studioでアイテムを閉じる警告(VS実行中にエラーが発生した解決方法)
    Visual Studio IDEでプロジェクト全体の警告を閉じるには、次の手順に従います.
    プロジェクトの[プロパティページ](Properties Page)ダイアログボックスを開きます.「プロパティ・ページ」ダイアログ・ボックスの使用方法については、「プロパティ・ページ」を参照してください.「プロパティの構成」>「c/c++」>「詳細」プロパティ・ページを選択します.特定の警告の無効化(Disable Specific Warning)アトリビュートを編集して、4996を追加します.変更を適用するには、「OK」を選択します.
    Alphaブレンド:
  • 作用:半透明効果を実現する.
  • 詳述:ある不透明なものの色がAであり、もう一つの透明なものの色がBであると仮定すると、Bを通してAを見ると、見える色CはBとAの混合色であり、この式で近似することができる.B物体の透明度をalpha(0−1,0は完全透明,1は完全不透明)R(C)=a l p h a∗R(B)+(1−a l p h a)∗R(A)R(C)=alpha*R(B)+(1−alpha)*R(A)R(C)=alpha∗R(B)+(A)=alpha∗R(B)+(1−alpha)+(1−alpha)∗R(A)G(C)=a l p h a∗G(B)+(1−−−−−−−−−−−a(B)+(1−−−−−−−−−−−−−−−−−−−a a l p h a)∗G(A)G(C)=alpha*G(B)+(1-alpha)*G(A)G(C)=alpha∗G(B)+(1−alpha)∗G(A)B(C)=a l p h a∗B(B)+(1−a l p h a)∗B(A)B(C)=alpha*B(B)+(1−alpha)*B(C)=alpha∗B(B)+(1−alpha)∗B(A)R(x)、G(x)、B(x)はそれぞれ色xのRGB成分を指す.Alphaハイブリッドテクノロジーを適用すると、最もまぶしい火、煙、シャドウ、ダイナミック光源などのすべての半透明効果を実現できます.参照リンク:RGBA alpha透明度ハイブリッドアルゴリズム実装とテスト
  • 現在のトラックバーの場所の取得:getTrackbarPos()関数getTrackbarPos()関数
    関数のプロトタイプ:
    int getTrackbarPos(conststring& trackbarname,conststring& winname);
    
  • const string&タイプのtrackbamameは、トラックバーの名前を表す.
  • const string&タイプのwinnameは、トラックバーの親ウィンドウの名前を表します.

  • マウス操作:SetMouseCallback()関数
    関数の意味:SetMouseCallback関数の役割は、指定されたウィンドウにマウスコールバック関数を設定することです.
    関数のプロトタイプ:
    void setMouseCallback(conststring& winname,MouseCallback onMouse,void* userdata=0)
    
  • const string&タイプのwinname、ウィンドウの名前.
  • MouseCallbackタイプのonMouseは、ウィンドウ内でマウス時間が発生するたびに呼び出される関数ポインタを指定します.この関数のプロトタイプの概略形式はvoid Foo(intevent,int x,int y,int flags,void* param)である.ここで、eventEVENT_+ xおよびyは、画像座標系(ウィンドウ座標系ではないことに留意されたい)におけるマウスポインタの座標値であり、flagsEVENT_FLAGの組合せであり、paramは、ユーザ定義のSetMouseCallback関数呼び出しに伝達されるパラメータである.EVENT_MOUSEMOVEがマウス移動メッセージ、EVENT_LBUTTONDOWNがマウス左ボタン押下メッセージなどである.Note:OpenCV 2では、上記「EVENT_」前に「CV_」を付けることができます接頭辞.
  • void*タイプのuserdataで、ユーザー定義のコールバック関数に渡されるパラメータには、デフォルト値0があります.

  • 例:
    /*************【      】    **********/
    
    #include 
    using namespace cv;
    
    //-----------------------------------【     】-----------------------
    //    :        
    //---------------------------------------------------------------------
    #define WINDOW_NAME "【    】"        //          
    
    //-----------------------------------【        】-------------------
    //		  :       
    //-----------------------------------------------------------------------
    void on_MouseHandle(int event, int x, int y, int flags, void* param);
    void DrawRectangle( cv::Mat& img, cv::Rect box );
    void ShowHelpText( );//  
    
    //-----------------------------------【        】--------------------
    //		  :       
    //-----------------------------------------------------------------------
    Rect g_rectangle;
    bool g_bDrawingBox = false;//      
    RNG g_rng(12345);
    
    //-----------------------------------【main( )  】------------------------
    //		  :            ,            
    //------------------------------------------------------------------------
    int main( int argc, char** argv ) 
    {
         
    	//【0】  console    
    	system("color 9F"); 
    
    	//【0】         (  )
    	ShowHelpText();
    
    	//【1】    
    	g_rectangle = Rect(-1,-1,0,0);
    	Mat srcImage(600, 800,CV_8UC3), tempImage;
    	srcImage.copyTo(tempImage);
    	g_rectangle = Rect(-1,-1,0,0);
    	srcImage = Scalar::all(0);
    
    	//【2】          
    	namedWindow( WINDOW_NAME );
    	setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
    
    	//【3】     ,            ,    
    	while(1)
    	{
         
    		srcImage.copyTo(tempImage);//         
    		if( g_bDrawingBox ) DrawRectangle( tempImage, g_rectangle );//           ,     
    		imshow( WINDOW_NAME, tempImage );
    		if( waitKey( 10 ) == 27 ) break;//  ESC ,    
    	}
    	return 0;
    }
    
    //--------------------------------【on_MouseHandle( )  】-------------
    //		  :      ,                
    //---------------------------------------------------------------------
    void on_MouseHandle(int event, int x, int y, int flags, void* param)
    {
         
    
    	Mat& image = *(cv::Mat*) param;
    	switch( event)
    	{
         
    		//      
    	case EVENT_MOUSEMOVE: 
    		{
         
    			if( g_bDrawingBox )//              ,        RECT    
    			{
         
    				g_rectangle.width = x-g_rectangle.x;
    				g_rectangle.height = y-g_rectangle.y;
    			}
    		}
    		break;
    
    		//      
    	case EVENT_LBUTTONDOWN: 
    		{
         
    			g_bDrawingBox = true;
    			g_rectangle =Rect( x, y, 0, 0 );//     
    		}
    		break;
    
    		//      
    	case EVENT_LBUTTONUP: 
    		{
         
    			g_bDrawingBox = false;//     false
    			//      0   
    			if( g_rectangle.width < 0 )
    			{
         
    				g_rectangle.x += g_rectangle.width;
    				g_rectangle.width *= -1;
    			}
    
    			if( g_rectangle.height < 0 ) 
    			{
         
    				g_rectangle.y += g_rectangle.height;
    				g_rectangle.height *= -1;
    			}
    			//        
    			DrawRectangle( image, g_rectangle );
    		}
    		break;
    	}
    }
    
    //-----------------------------------【DrawRectangle( )  】------------------------------
    //		  :          
    //---------------------------------------------------------------------------------------
    void DrawRectangle( cv::Mat& img, cv::Rect box )
    {
         
    	cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//    
    }