OpenCv学習ノート(一)--OpenCvにおけるMat類ソースコードの詳細解読(1)

4431 ワード

OpenCv学習ノート(一)OpenCvにおけるMat類ソースコードの詳細解読(一)
(一)Mat類の引用
1–2010年以降、OpenCvの関数ライブラリはCインタフェースコンポーネントに基づいているため、最初のいくつかのOpenCvバージョンでは、IplImageを使用していたC言語構造体がメモリに画像を格納していた.今日に至るまで、これは依然として多くの古い書籍の中に現れて、例えば経典の《Learning OpenCv》2–OpenCv 1に対して.xの時代、C言語インタフェースに基づいて作成された画像格納フォーマットIplImage*は、終了する前にreleaseが画像を指すポインタ変数を落とすことを忘れてしまうと、–メモリリークを引き起こすことになります.もちろん、一部の小さなプログラムでは、手動でメモリを管理しても問題はありませんが、プログラムの規模が大きいと、では、深刻なメモリ漏洩の問題を引き起こす可能性があります.これにより、プログラムを設計する際に、ビジネスロジックに関係のない問題を考えすぎて、使いにくいことがあります.3–幸いなことに、OpenCvでは、C++インタフェースが登場し、新しい概念であるクラスの概念がもたらされました.これにより、自動的にメモリ管理を行う別の選択肢が得られました.4–つまり、OpenCvは2.0以降のバージョンで新しいC++インタフェースを導入し、自動メモリ管理の方法で問題を解決する方法を提供しています.この方法を用いると,画像処理やコンピュータビジュアルプログラム開発の過程で,メモリ管理の問題にこだわる必要がなくなり,ビジネスロジックや問題の処理に多くの時間と精力を注ぐことができる.5–C++インタフェースの唯一の不足は、現在多くの組み込み開発システムがC言語のみをサポートしていることであり(この問題は考えてみてもよい)、androidシステムであれば、C++言語を利用して画像処理ライブラリを開発することができる.soライブラリ6–OpenCv 2.xバージョンの時代、Matクラスが主なデータ構造として使われていた時代は、画像処理がより簡単になり、実験的な言語Matlabのようになりました.例えば、よく知られているimread、imwrite、imshowなどの関数です.
(二)Matクラスについて、まず、2つの点を知る必要があります.
 1--             
 2--       ,         

(三)Matクラスの構造:
 1--  ,Mat C++     ,      ---class Mat{};           C++    
        ,  :
    1--    
    2--    
    3--    
    4--    
 2--class Mat    ,        :
    1--   --  :
       1--    
       2--    
       3--     
    2--                  --(  ---  )---           ,    
             
 3--   ---       ,  ,                  ,           
         。  ,                 ,           ,      
 4--OpenCv        ,            ,      ,            , 
     ,             ,  ,       ,                   
       ,  ,      ,           ,         ---    
 5--        ,OpenCv   ---      。    :   Mat          ,  
          。                 。                   , 
           
          :
        //【1】  Mat        ,              
        Mat A,C;
        //【2】   .                    ,            Mat  A
        A=imread("1.jpg",CV_LOAD_IMAGE_COLOR);
        //【3】        , Mat  B   ,       A             B
        //【4】          ----   
        Mat B(A);
        //【5】     ------------   
        C=A;
 6--     ,   Mat          ,          .          ,   
                       .   ,                    。
 7--   ,            ;                 。           
      (ROI),               :
        //【1】        
        Mat D(A,Rect(10,10,100,100));
        //【2】          
        Mat E=A(Range:all(),Range(1,3));
 8--  ,        --           Mat  ,           ,      
     ?
    1--      :          .           。            Mat
             ,           。  ,        ,         ;    
         ,       。
 9--  ,    ,          (           ),  ,      clone()  
    copyTo()  
        //【1】  clone()  , Mat    ---   ---              ,    
              //     
        //【2】Mat  A    F
        Mat F=A.clone();
        //【3】    Mat  G
        //【4】  copyTo       
        A.copyTo(G);
 10--    Mat  F G,     Mat   

(四)本節の知識点のまとめ
1--OpenCv                  (          )
2--  OpenCv C++   ,            
3--            --   --   ---            ,       
4--  clone() copyTo()  --  --   ---     --