画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

05 | 2017/06 | 07
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV2.0】cv::Matクラス

メインページOpenCV

OpenCV2.0からはC++ Interfaceに対応され、「cv」という名前空間が登場しました。
これまで画像データはIplImage構造体で管理されていましたが、C++ Interfaceではcv:Matというクラスで管理されるようになります。(従来のIplImageも使用可能です。)

ということで、IplImageとcv::Matとの対応は以下のようになっているようです。

 IplImagecv::Mat
画像の幅widthcols
画像の高さheightrows
画像一行あたりのバイト数widthStepstep ※注1
1ピクセルあたりのビット数depthdepth() ※注2
チャンネル数nChannelschannels()
画像の種類-type() ※注3
画像データのポインタimageDatadata

※注1
widthStepでは画像1行あたりのバイト数はビットマップファイルと同様に4バイト単位になるように調整されていましたが、画像ファイルをcv::imread()関数を使って読み込むと、stepの値は(メモリも?)4バイト単位に調整されません。(画像の幅×チャンネル数になるのみ)
そのため、その他もろもろの互換性を考慮すると、cvLoadImageを使って画像ファイルを読み込み、cv::Matに変換した方が良さそうです。
(例)
//画像ファイルの読み込み
cv::Ptr<IplImage> iplimg = cvLoadImage("test.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
//cv::Matへ変換
cv::Mat img(iplimg);

※注2
cv::Matから取得するdepth()は以下のようになっています。(取得した値とビット数とは異なります。)
#define CV_8U   0     //8ビット、符号なしデータ
#define CV_8S   1     //8ビット、符号付きデータ
#define CV_16U  2     //16ビット、符号なしデータ
#define CV_16S  3     //16ビット、符号付きデータ
#define CV_32S  4     //32ビット、符号付きデータ
#define CV_32F  5     //32ビット、単精度実数浮動小数点データ
#define CV_64F  6     //64ビット、倍精度実数浮動小数点データ
#define CV_USRTYPE1 7

※注3
cv::Matから取得するdepth()は上記depth()にチャンネル数を付加した表記になります。
  8Bitモノクロデータ: CV_8UC1
  24Bitカラーデータ: CV_8UC3
など。

※注、その他
Matクラスのclone()関数で、例えば
  cv::Mat dst = src.clone();
とすると、srcとdstのstepの値が異なる場合があります
具体的にはcolsが4の倍数で無く、stepを4の倍数になるようにsrcのMatをIplImageから作った場合、clone()で確保したdstのstepはcols×channels()の値で確保されてしまいます。(4の倍数とならない場合がある。)

ということで、画像データのポインタをOpenCV以外の関数でも処理したい私は、Matクラスで管理するのは断念気味。つまり、cv::Matの画像データを表示できるのはcv::imshowのみで、Win32APIや.NETを使って画像を表示する事ができないんですよね!
ってことは、OpenCVを使ったアプリはcv::imshowを使って画像を表示しないといけない!なんてありえない~!
(もちろん、画像の幅×チャンネル数の値が4の倍数になっている場合はWin32APIや.NETでも表示可能です。)

ちなみに、こちらが幅257×高さ257×8Bitの画像データをcv::imshowで表示したのが、こちら↓
     cv::Mat Class

そして同じ画像のcv::Matを使って、IplImageからBitmapを確保するのページ行っているように、Matクラスのdataを.NETのBitmapクラスに変換し、その画像を表示したものがこちら↓
     cv::Mat Class
画像が斜めになってしまいます。
これ、Win32APIでStretchDIBits関数で画像データを表示する時に初心者が陥りやすい、メモリの確保の仕方が間違っているバグと同じ現象です。

やっぱりIplImageで画像データを管理するか...って事はcv::の関数も使うの面倒臭いな~。
少し期待していたのに残念!この仕様は画像処理屋さんでは無く、MATLAB使いの数学屋さんが作っちゃったのかな???
Loading...
スポンサーリンク

この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/178-2ecd1966
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計