GSL Shell 学習:OpenCV の CvMat 型

2016-03-04 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
7、2、0、0、1、 0、0、0、0、0(40)で、換算ポイント 88pt 。
「Perl」「C言語」「化学業界」「硝子業界」「FM COCOLO」、
「グルコサミン」「Python」「Firefox」bg値変動のみ。
「e-radio」「FM青森」全く変化無し。
・-・ - -・

さて、本文。(これも Lua 学習?)


これまでの記事:
GSL Shell 学習:OpenCV 使えそうダ?
GSL Shell 学習:OpenCV の 'Callback' 処理
で使っている、画像データ格納域は、“IplImage”構造体ですネ。


「OpenCV 構造体」と検索して見つかるのは、

“OpenCV-1.0”の、
OpenCV: 基本構造体(Basic Structures)サンプルコード
  OpenCVでは,IPL(Intel Image Processing Library)で使われていた
  構造体 IplImage フォーマットの一部をサポートしている.

そして、
“Opencv v2.1”の、
基本構造体
  基本構造体
   ・CvPoint
   ・CvPoint2D32f
   ・CvPoint3D32f
   ・CvPoint2D64f
   ・CvPoint3D64f
   ・CvSize
   ・CvSize2D32f
   ・CvRect
   ・CvScalar
   ・CvTermCriteria
   ・CvMat
   ・CvMatND
   ・CvSparseMat
   ・IplImage
   ・CvArr

など。

それで、
「OpenCV.jp」の「OpenCV-CookBook」サイト内の、
cv::Matの基本処理
には、
  cv::Matの概要
  OpenCV 1.x には,基本的に C言語 および Python のインタフェースが
   用意されていましたが,OpenCV 2.0 以降では,
   新たに C++ インタフェースが追加されました.
  OpenCV 1.x では,画像を管理する構造体として IplImage が,
   その他の行列を管理する構造体として CvMat が用いられました.
  しかし,OpenCV 2.x の C++ インタフェースでは,
   cv::Mat クラスを利用して,これらを統一的に扱います.
   cv::Mat クラスは,実際のデータへのポインタと,
   様々なプロパティ(幅,高さ,ビット深度など)を保持します.
  ・・・・・
  ・・・・・

  連続データと不連続データ
  通常,cv::Matのデータはメモリ上の連続した領域に割り当てられます.
  しかし,IplImageからのキャストを行った場合や,ROIを利用した
   場合など,このデータが不連続になる場合があります.
  ポインタを利用してデータにアクセスする場合,
   データの連続・不連続の問題を意識することが重要です.
  ・・・・・
  ・・・・・

とあった。


<紙>の場合は、
“Lua”から使うので、C++ インタフェース は使えない(?)が、
画像データじゃなくて、一般の“データ・テーブル”として
“CvMat”型を使いたい。


始めは、値をセットする方法として、
“OpenCV 2.4.12.0 documentation”の、“OpenCV API Reference”の、
Basic C Structures and Operations - OpenCV 2.4.12.0 …
で見つけた

 mSet
  Sets a specific element of a single-channel floating-point matrix.

  C: void cvmSet(CvMat* mat, int row, int col, double value)

 ・・・・・
 The function is a fast replacement for SetReal2D() in the case of
  single-channel floating-point matrices.
 ・・・・・

を使って、以下の様なコードで試した:
local cv2 = ffi.load('opencv_world300')
ffi.cdef[[
typedef void CvArr;

typedef struct CvMat{
int type; int step; int* refcount; int hdr_refcount;
union{ unsigned char* Byte; char* Char; unsigned short* Word; int* Int; double* Dbl; };
union{ int rows; int height; int yy; };
union{ int cols; int width; int xx; };
} CvMat;

CvMat* cvCreateMat( int rows, int cols, int type );
void cvmSet( CvMat* mat, int row, int col, double value );
]]
x = cv2.cvCreateMat( 1, 3, 6 )
cv2.cvmSet( x, 0, 0, 1 ) -- ・・・
でも、・・・・・

  “cvmSet”が無い!

???????????

悩んでいたが、理由が分かった。

続きを見ると、

  It is faster because it is inline,
   it does fewer checks for array type and array element type,
   and it checks for the row and column ranges
   only in debug mode.

とある。

つまり、“インライン”だから速い。
即ち、純粋に“C言語”でのコードじゃないと使えない。
<紙>の様に、“Lua”から“DLL”を呼んでいたのではダメ!

SetReal2D()

を使うべきですネ。

そうしたら、出来た。


完成(?)したコードは:
local cv2 = ffi.load('opencv_world300')
ffi.cdef[[
typedef void CvArr;

typedef struct CvMat{
int type; int step; int* refcount; int hdr_refcount;
union{ unsigned char* Byte; char* Char; unsigned short* Word; int* Int; double* Dbl; };
union{ int rows; int height; int yy; };
union{ int cols; int width; int xx; };
} CvMat;

CvMat* cvCreateMat( int rows, int cols, int type );
int cvGetDimSize( const CvArr* arr, int index );

void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
double cvGetReal2D( const CvArr* arr, int idx0, int idx1 );
]]

m = cv2.cvCreateMat( 1, 3, 6 ) -- 6:CV_64F:double 型
print( cv2.cvGetDimSize( m, 0 ) ) -- → 1:row のサイズ
print( cv2.cvGetDimSize( m, 1 ) ) -- → 3:col のサイズ

cv2.cvSetReal2D( m, 0, 0, 1.0 ) -- row, col 添字ゼロオリジン
print( cv2.cvGetReal2D( m, 0, 0 ) ) -- → 1
ですね。


なお、「cvCreateMat」の第3パラメータは、
【OpenCV2.0】cv::Matクラス 画像処理ソリューション
このページの“※注2”から頂きました。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


160206
関連記事
スポンサーサイト

コメントの投稿

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

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
02 | 2017/03 | 03
- - - 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 31 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク