Miyabiarts.net

一年に一度の更新頻度

OpenCVのcv::Mat / cv::Mat_の使い方(cv::Mat_編)

前回の続きで、今回はcv::Mat_に関してです。
内容はほぼ前回のコードの置き換えなので説明は少ないです。
記事の構成も同じです。

画像の作成

cv::Mat_は見たままですが、cv::Matに対して型Tを与えて用いるためのクラスです。
そのため、変数を定義する際に画素の型を与える必要があります。
cv::Matでは画素の型はOpenCVの定数でしたが、cv::Mat_ではC++の型のことです。

cv::Mat_< T > image( 高さ, 幅 );

// グレースケール画像(8bit)画像
cv::Mat_< unsigned char > image( height, width );

// RGB画像(24bit)画像
cv::Mat_< cv::Vec3b > image( height, width );

画像の入出力

画像の入力は、cv::Matと同様です。

// グレースケール画像(8bit)画像
cv::Mat_< unsigned char > image = cv::imread( "ファイル名", 0 );

// RGB画像(24bit)画像
cv::Mat_< cv::Vec3b > image = cv::imread( "ファイル名", 1 );

画像の出力も同様。

cv::imread( "ファイル名", image );

任意の画素へのアクセス

cv::Mat_だと、変数を定義する際に型を与えているため、任意の画素へとアクセスする際に型を与える必要がありません。
以下の例では、位置(x,y)の画素に0xffを代入して白画素にしています。

// グレースケール画像(8bit)画像
image( y, x ) = 0xff;

// RGB画像(24bit)画像
image( y, x )[ 0 ] = 0xff;
image( y, x )[ 1 ] = 0xff;
image( y, x )[ 2 ] = 0xff;

画像全体の走査

cv::Matの時と同様に3つのアクセス方法で画像全体を走査します。

任意の画素へのアクセスによる走査

// グレースケール画像(8bit)画像
for( int y = 0 ; y < image.rows ; ++y )
{
  for( int x = 0 ; x < image.cols ; ++x )
  {
    image( y, x ) = 0xff;
  }
}

// RGB画像(24bit)画像
for( int y = 0 ; y < image.rows ; ++y )
{
  for( int x = 0 ; x < image.cols ; ++x )
  {
    image( y, x )[ 0 ] = 0xff;
    image( y, x )[ 1 ] = 0xff;
    image( y, x )[ 2 ] = 0xff;
  }
}

ポインタアクセスによる走査

// グレースケール画像(8bit)画像
for( int y = 0 ; y < image.rows ; ++y )
{
  unsigned char *p = &image( y, 0 );
  for( int x = 0 ; x < image.cols ; ++x )
  {
    *p = 0xff;
    ++p;
  }
 }

// RGB画像(24bit)画像
for( int y = 0 ; y < image.rows ; ++y )
{
  cv::Vec3b *p = &image( y, 0 );
  for( int x = 0 ; x < image.cols ; ++x )
  {
    ( *p )[ 0 ] = 0xff;
    ( *p )[ 1 ] = 0xff;
    ( *p )[ 2 ] = 0xff;
    ++p;
  }
}

MatIterator_による走査

// グレースケール画像(8bit)画像
cv::MatIterator_ itr = image.begin();
for( ; itr != image.end() ; ++itr )
{
   *itr = 0xff;
}

// RGB画像(24bit)画像
cv::MatIterator_ itr = image.begin();
for( ; itr != image.end() ; ++itr )
{
   ( *itr )[ 0 ] = 0xff;
   ( *itr )[ 1 ] = 0xff;
   ( *itr )[ 2 ] = 0xff;
}
広告

OpenCVのcv::Mat / cv::Mat_の使い方(cv::Mat_編)」への4件のフィードバック

  1. shiina 2011年10月4日 06:29

    cv::Mat_ の説明ソース内で < や > に囲まれた部分が飛んでませんか?
    chromeとie9 では、<> が有りそうなところに何も見えません。
    なので肝心な所が少々わかりにくくなっています。
    「opencvを用いた特徴点対応付け」ページもそうなっていて、 cv::Mat_ の所で
    エラーが発生していたので、調べていてここにたどり着きました。

  2. miyabiarts 2011年10月4日 13:25

    ご指摘どうもです。
    ブログを移転した時にコードのハイライトを行うプラグインを変更したのですが、その影響でおかしくなっていたようです。
    他の箇所も順次修正していきます。

    • shiina 2011年10月5日 01:36

      修正ありがとうございます。とてもわかりやすくなりました。

  3. ピンバック:std::vectorからcv::Matへの変換 « sweden::erasmusLife

%d人のブロガーが「いいね」をつけました。