js-ctypes 学習:cast そして OpenCV

2017-03-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-18)の記事「js-ctypes 学習:外部プログラムの実行」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
Tipe casting ( 変換 )について学習。

js-ctypes のドキュメント:
MDN > Mozilla > js-ctypes > Using js-ctypes の、
Working with data」に、
  ・・・・・
  ・・・・・
  Type casting
  You can type cast data from one type to another
   by using the ctypes.cast() function:

  var newObj = ctypes.cast(origObj, newType);

  This will return a new object whose data block is shared
   with the original object, but whose type is newType.
  If the size of the new type is undefined or larger than
   the size of the original object's data block, TypeError is thrown.

  This works very much like a standard C type cast or C++ reinterpret_cast.

即ち(Google翻訳で)

  ctypes.cast()関数を使用すると、あるタイプから別のタイプへの
  キャストデータを入力できます。

  var newObj = ctypes.cast(origObj、newType);

  これは、元のオブジェクトとデータブロックが共有されているが、
  その型がnewTypeである新しいオブジェクトを返します。
  新しい型のサイズが未定義であるか、元のオブジェクトのデータブロックの
  サイズよりも大きい場合は、TypeErrorがスローされます。

  これは、標準のCタイプのキャストやC ++のreinterpret_castと
  非常によく似ています。

まあ、分かるかナ。

続けて、
  Example: Cast an array
  This example shows
  how to cast an array of a certain type to another type.
とある。

これで、学習した:
// バイト配列8要素、値格納:
var B = ctypes.uint8_t.array(8)( [8,7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、2バイト配列4要素に cast
var I = ctypes.cast( B.address(), ctypes.uint16_t.array(4).ptr).contents;
print( I[3] ); // 0x0102 == 258 で、OK
こんな風に。

更に、構造体への cast は?
// uint32_t 配列7要素、値格納:
var A = ctypes.uint32_t.array(7)( [7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、構造体に cast
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.int32_t }, { 'step': ctypes.int32_t },
{ 'refc': ctypes.int32_t }, { 'hdrr': ctypes.int32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var K = ctypes.cast( A.address(), CvMat.ptr ).contents;
print( K.yy, K.xx ); // 2, 1 OK:これで行ける
つまり、要点は、“.contents”を付ける事?
この例は、OpenCV を使いたい為に選んだもの。


実は、今回の学習は、
昨年2月(2016-02-23)の記事「GSL Shell 学習:OpenCV 使えそうダ?」で書いた、
  「opencv_world300.dll」26.3MB 1つ。
この DLL を利用しようと、数日間悪戦苦闘していたことから始まった。

あれこれ悩み&検索していたが、
どうも、cast の問題の様なので、上記の例に至った。

と云うことで、
やってみた:
// ---------- test_OpenCV.js ----------
var lib = ctypes.open( 'opencv_world300' );
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.uint32_t }, { 'step': ctypes.uint32_t },
{ 'refc': ctypes.uint32_t }, { 'hdrr': ctypes.uint32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var cvCreateMat = lib.declare('cvCreateMat' ctypes.winapi_abi,CvMat.ptr,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );

var M = cvCreateMat( 5, 4, 0 ); // rows, cols, type(CV_8U)
var C = ctypes.cast( M, CvMat.ptr ).contents; // これが必要
print( C.type.toString(16), C.yy, C.xx ); // 0x42424000 5 4 OK
ss = C.xx * C.yy
var D = ctypes.cast( C.data, ctypes.uint8_t.array(ss).ptr ).contents;
print( D[0], D[ss-1] ); // 0 0 初期状態なので。エラーじゃ無いからOK?
で使えそう。


結論:
戻り値が構造体の場合は、
直接 CvMat で参照してもダメ?
1度 cast するコト!
それも“.contents”を付ける!


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

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

<紙>

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

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


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

Google Analytics
ブックマーク