OpenCV 学習:GrayScale 画像の2値化

2017-08-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-08-07)の記事「OpenCV 学習:CvMat型学習サイト」で書いたが、・・・

「OpenCV.jp」の「OpenCV-CookBook」サイトに、

画像処理」のページがあり、
その中に、「画像を2値化する」がある。

  画素値を閾値処理して,画像の2値化を行います.
  閾値処理の手法には,以下のものがあります:

   ・THRESH_BINARY:閾値以下の値は0に,
        それ以外は指定した値(maxVal)になります.
   ・THRESH_BINARY_INV:上記とは逆に,閾値より大きい値が0に,
        それ以外は指定した値(maxVal)になります.
   ・THRESH_TRUNC:閾値より大きい値は閾値まで切り詰められ,
        それ以外はそのまま残ります.
   ・THRESH_TOZERO:閾値より大きい値はそのまま残り,
        それ以外は0になります.
   ・THRESH_TOZERO_INV:上記とは逆に,閾値以下の値はそのまま残り,
        それ以外は0になります.

  さらに,特殊な値 THRESH_OTSU を,
    上述のものと組み合わせて使うこともできます.
  この場合,関数は大津のアルゴリズムを用いて最適な閾値を決定し,
  それを引数 thresh で指定された値の代わりに利用します.
  つまり,自分で閾値を決める必要がありません.

  また, adaptiveThreshold は適応的な閾値処理を行います.・・・
  ・・・・・
  ・・・・・

C 言語用関数は;
double cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type )
ですネ。

ここで、
最初の5つの手法に対するコード値は、順に 0, 1, 2, 3, 4 の様です。


そして、
特殊な値 THRESH_OTSU は、8 でしょうか。

この手法に関する過去記事は:

2年前(2015-02-23)の記事「Python/OpenCV 学習:大津の2値化

2年前(2015-03-30)の記事「ImageJ プラグイン:大津の2値化


今では、Lua ( GSL Shell ) / OpenCV なので、

以前(2017-08-14)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で書いた、
“cv2_a.lua”を使ってコーディングしてみた。

指定固定値では:
----- test_Threshold.gsl -----
require'cv2_a'

img = cv2.cvLoadImageM( 'sample.tif', 0 ) -- CV_8UC1 タイプで入力

Bim = cv2.cvCloneMat( img ) -- 出力領域

Ret = cv2.cvThreshold( img, Bim, 128, 255, 1 ) -- 128 以下は 255 で、超だと 0
print( Ret ) -- これは、指定した値 = 128

cv2.cvSaveImage( 'Threshold.tif', Bim, 0 )
そして、大津さんのアルゴリズム適用は:
----- test_Otsu_Bin.gsl -----
require'cv2_a'

img = cv2.cvLoadImageM( 'sample.tif', 0 ) -- CV_8UC1 タイプで入力

Bim = cv2.cvCloneMat( img ) -- 出力領域

Ret = cv2.cvThreshold( img, Bim, 0, 255, 1+8 ) -- X 以下は 255 で、超だと 0
print( Ret ) -- これは、大津さんが決めた値 = X

cv2.cvSaveImage( 'Otsu_Bin.tif', Bim, 0 )
ですね。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170722(0607)
スポンサーサイト

“DLL”ファイルから“DEF”ファイルを作る

2017-08-28 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-08-16)の記事「GSL 学習:“gsl_a.lua”モジュール?」では、
  ・・・・・
  ・・・・・
  “GSL Shell”が包含しているDLL“libgsl-0.dll”に就いても・・・
  ・・・・・
  ・・・・・
と書いている。

このDLL“libgsl-0.dll”に含まれる関数の一覧を確認してみた。


その為には、tiny_impdefを使えば出来る?

5月(2017-05-06)の記事「tcc 学習:lua52.dll 利用その他」で、
  ・・・・・
  ・・・・・
  学習した手順通り:
tiny_impdef  lua52.dll
  で、“lua52.def”が出来た。
  ・・・・・
  ・・・・・
と書いている。


やってみた:
tiny_impdef  libgsl-0.dll
で、“libgsl-0.def”が出来た。

このファイルで確認出来る。



それでは、
以前(XXX)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で作った、
“cv2_a.lua”で定義している関数が、
“OpenCV”のDLL“opencv_world300.dll”に含まれているか?
確認したい。

その為には、
DLL“opencv_world300.dll”ファイルから“DEF”ファイルを作る???

だが、tiny_impdef はこの種の DLL ファイルには対応していない!!!

そこで、何か無いか探してみたら、

古い記事(投稿日:2013年4月15日)だが、
dllに含まれる関数の一覧を取得する。
が見つかった。

dumpbinツールですね。

<紙>の場合は、
  C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/
にあった。

で、使ってみた:
dumpbin  /exports  opencv_world300.dll  >CV_300.txt
これで、一旦 CV_300.txt ファイルを作り、
不要な行や各行の不要部分を削除して“opencv_world300.def”を作った。



本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170703

OpenCV 学習:cvCopy で 型変換

2017-08-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
“OpenCV”の C 関数:
CvMat* cvCloneMat( const CvMat* mat ); は、

  Creates a full matrix copy.

と云うことですね。

なので、
  img2 = cv2.cvCloneMat( img )
とすれば、
既存のimg から、そっくりなimg2ができる。

一方で、今回学習した、C 関数:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask ); は、

  Copies one array to another.

と云うことですね。

これでは、
既存のimg から、適切に領域を用意したimg2にコピーできる。

これだと、データ型の変換
 ・CvMat 型 → IplImage 型
 ・IplImage 型 → CvMat 型
に使える?

それで、1本コーディングしてみた:
----- conv_mat-Ipl.gsl -----
require'cv2_a'

fnam = 'test.tif' ----- テスト画像:2行5列

Timg = cv2.cvCreateMat( 2, 5, CV_8UC1 )
T = { 10, 30, 50, 70, 90, 110, 130, 150, 170, 190 }
for n=0,9 do Timg.Byte[n]=T[n+1] end
cv2.cvSaveImage( fnam, Timg, 0 )

--============================================
---------- IplImage 型 → CvMat 型

----- (1) IplImage 型で読込:
Iimg = cv2.cvLoadImage( fnam, 0 )
p = ffi.cast( 'uint8_t*', Iimg.data )
print( p[1*5+4], p[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界

----- (2) CvMat 型領域確保 & コピー(変換):
Mimg = cv2.cvCreateMat( Iimg.yy, Iimg.xx, CV_8UC1 )
cv2.cvCopy( Iimg, Mimg, NULL )
print( Mimg.Byte[1*5+4] ) -- 2行目の5列目

--============================================
---------- CvMat 型 → IplImage 型

----- (1) CvMat 型で読込:
Nimg = cv2.cvLoadImageM( fnam, 0 )
print( Nimg.Byte[1*5+4] ) -- 2行目の5列目

----- (2) IplImage 型領域確保 & コピー(変換):
SZ = ffi.new( 'CvSize', Nimg.xx, Nimg.yy )
Oimg = cv2.cvCreateImage( SZ, 8, 1 )
-- int depth, int channels
cv2.cvCopy( Nimg, Oimg, NULL )
q = ffi.cast( 'uint8_t*', Oimg.data )
print( q[1*5+4], q[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界
と云うことで???

出来ました。


IplImage 型が好きになれないのは、
行毎に、4バイト境界にアラインされるから。


因みに、
'cv2_a.lua' 内で2つのデータ型の定義は以下:
--  構造体の定義:
ffi.cdef[[
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;

typedef struct _IplImage{
int nSize; int ID; int nChannels;
int alphaChannel; int depth;
char colorModel[4]; char channelSeq[4];
int dataOrder; int origin; int align;
union{ int cols; int width; int xx; };
union{ int rows; int height; int yy; };
struct _IplROI *roi; struct _IplImage* maskROI;
void* imageId; struct _IplTileInfo *tileInfo;
int imageSize; union{ void* data; char* imageData; };
int widthStep;
int BorderMode[4]; int BorderConst[4];
char* imageDataOrigin;
} IplImage;
]]
と云った感じ。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170723

OpenCV 学習:CvMat 型のソート機能は無し

2017-08-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-23)の記事「GSL 学習:配列要素の並び替え」に対抗して、
OpenCV でもやりたい。

OpenCV 2.4.13.2 documentationの、
OpenCV API Reference」を、sortで検索してみた。


cv2.sort (Python function, ・・・)

void sort( ・・・・・ ) (C++ function, ・・・)

などなど。

で、

C function では、

void cvSeqSort( CvSeq* seq, CvCmpFunc func, void* userdata )

schar* cvSeqSearch( CvSeq* seq, const void* elem, ・・・ )

しか見つからない。


残念ながら、CvSeq 型では却下。


並び替え(ソート)については、
GSL - GNU Scientific Library
で対処する。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170717

GSL 学習:配列要素の並び替え

2017-08-23 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
“GSL - GNU Scientific Library”のドキュメント:
GSL Reference Manual - HTML」には、Sorting の章がある。
しかし、
  Sorting objects
には、以下様な記述がある。

  The following function provides a simple alternative
  to the standard library function qsort().
  It is intended for systems lacking qsort(), not as a replacement for it.
  The function qsort() should be used whenever possible,
  as it will be faster and can provide stable ordering of equal elements.
  Documentation for qsort() is available in
   the GNU C Library Reference Manual.
===(Google翻訳)
  次の関数は、標準ライブラリ関数qsort()に代わる簡単な方法を提供します。
  これは、qsort()が不足しているシステムを対象としたものであり、
  qsort()の代わりとはなりません。
  可能な限りqsort()関数を使用する必要があります。
  これは、より速く、同等の要素の安定した順序付けを提供できるからです。
  qsort()のドキュメントは、
   GNU Cライブラリリファレンスマニュアルにあります。

そういえば、
昨年5月(2016-05-16)の記事「Lua で、クイックソート“qsort”」で、

  ・・・・・
  ・・・・・
  そうならば、と、真似をしてコード化してみた。
  ・・・・・
  でも、実行したところ、
  比較判定関数(コールバック関数?) の終盤でアボート???

  原因究明に至らなかったので、
  その昔、2008年初め?、それ以前(?)から使っていた「ActiveBASIC
  でコード化したモノ。
  それは、
  「ab.com コミュニティ ・ トピック - ソートロジック大会
  にあるものを頂いていた。
  これを、Lua に移植した:
  ・・・・・
  ・・・・・
  「GSL - GNU Scientific Library
  にも、
  「void gsl_sort_vector(gsl_vector* v)」や、
  void gsl_sort_index(size_t* p, const double* data, size_t stride, size_t n)
  があるが、
  これは、実数型データの昇順ソートですネ。
  ・・・・・
  ・・・・・

と書いていた。


'gsl_a.lua' サブプログラムを作ったことだし、
今回、使ってみることにした。

 ・gsl_heapsort
 ・gsl_heapsort_index
 ・gsl_sort
 ・gsl_sort_index

等々、幾つか関数があるが、何れも昇順のみ?


クイックソートで、
2種類:
gsl_sort
  double 型データ、in-place ソート
と、
gsl_sort_long_index
  int32 型データ、index ソート
を試した:
----- gsl_Sorting.gsl -----
require'gsl_a'

----- in-place ソート
V = matrix.vec { 5, 4, 3, 2, 1 }
gsl.gsl_sort( V.data, 1, #V ) -- ソート実行(破壊更新)
print( V[1], V[2], V[3], V[4], V[5] ) -- 結果確認


----- index ソート
V = ffi.new( 'int32_t[5]', 5, 4, 3, 2, 1 )
P = ffi.new( 'int32_t[5]' )
gsl.gsl_sort_long_index( P, V, 1, 5 ) -- index ソート実行
-- 結果確認
print( P[0], P[1], P[2], P[3], P[4] )
print( V[P[0]], V[P[1]], V[P[2]], V[P[3]], V[P[4]] )
これで?

出来ました。


本日はここまで。


Lua ( GSL Shell ) / GSL 学習は続く。


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


170717+

OpenCV 学習:cvReduce

2017-08-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
OpenCV.jp : OpenCV逆引きリファレンス」を見ていたら、・・・


 cv::Matの列/行毎の合計,平均値,最小,最大値を求める

 例えば,
 1行が1つの特徴ベクトルである行列(行数は特徴ベクトルの個数)があるとして,
 それらのベクトルの平均を求めるにはどうすれば良いでしょうか.
 1行1行足し合わせて個数で割ることも出来ますが, reduce メソッドを用いると,
 行列の行毎(または列毎)の,合計値や平均値などを簡単に計算できます.


とあった。

つまり、
void cvReduce( ・・・ )
  Reduces a matrix to a vector.
void cvReduce( const CvArr* src, CvArr* dst, int dim=-1, int op=CV_REDUCE_SUM );
// dim - dimension index along which the matrix is reduced.
// 0 means that the matrix is reduced to a single row.
// 1 means that the matrix is reduced to a single column.

// CV_REDUCE_SUM: sum of all rows/columns of the matrix.
// CV_REDUCE_AVG: mean vector of all rows/columns of the matrix.
// CV_REDUCE_MAX: maximum (column/row-wise) of all rows/columns of the matrix.
// CV_REDUCE_MIN: minimum (column/row-wise) of all rows/columns of the matrix.
と云うこと。


そこで、テストしてみた:
----- cvReduce.gsl -----
require'cv2_a'

--- 3行4列マトリックス
M = cv2.cvCreateMat( 3, 4, CV_64FC1 )
T = { 0.2, 4, -0.5, 1 , 1.1, 0, 3.0, -3 , 1.2, -5, 0, 2 }
for n=0,11 do M.Dbl[n]=T[n+1] end

--- 3行1列マトリックス
N = cv2.cvCreateMat( 3, 1, 6 )

cv2.cvReduce( M, N, 1, 0 ) -- 1列化、CV_REDUCE_SUM

print( N.Dbl[0], N.Dbl[1], N.Dbl[2] ) -- 行毎の和
と云った方法もある。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170712

GSL 学習:配列要素の合計

2017-08-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-18)の記事:
OpenCV / cvSum : Calculates the sum of array elements」に対応して、
同様なことを、“GSL - GNU Scientific Library”でやってみた。


しかし、・・・・・

“stackoverflow”に、
Sums on GNU Scientific Library (GSL)
があった。

質問
  I have used the 'mean' function on GSL which proved to be more accurate
   than my naive implementation.
  I haven't found a 'sum' function though,
   I'm using 'mean'*N instead, but I think it would be cleaner
   if I use a proper summing function.
  I'm summing a huge quantity of numbers,
   I and was wondering this to avoid
   if possible implementing a stable summing algorithm.
===
  私は、私の素朴な実装よりも正確であることが証明された
   GSLの「平均」関数を使用しました。
  私は 'sum'関数を見つけませんでしたが、
   代わりに 'mean' * N を使用していますが、
   適切な合計関数を使用するときれいになると思います。
  私は膨大な数の数値を集計していますが、
   安定した集計アルゴリズムを実装することを避けるために
   これを避けることを考えていました。

回答
  One sometimes-used trick is to use cblas_ddot function and
   compute the dot product of your data with a vector of ones.
  That will effectively compute the sum of your data.
===
  時々使用されるトリックは、cblas_ddot関数を使用して、
   データのドット積を1のベクトルで計算することです。
  それは効果的にあなたのデータの合計を計算します。

と云うこと!


そこで、
先日(2017-08-16)の記事「GSL 学習:“gsl_a.lua”モジュール?」で作った、
“gsl_a.lua”サブプログラムを使って、
試しにコーディングしてみた:
----- Sum_of_Vec_gsl.gsl -----
require'gsl_a'

----- double 版
v = matrix.vec{ 0.1, 0.2, 0.4, 7.6, 0.8, 1.0 }
sum_of_v = gsl.gsl_stats_mean( v.data, 1, #v ) * #v
print( sum_of_v )

-------------------------------------------------

----- long 版
I = ffi.new( 'int32_t[6]', 1, 2, 4, 76, 8, 10 )
sum_of_I = gsl.gsl_stats_long_mean( I, 1, 6 ) * 6
print( sum_of_I )
2パターンとも行けました。


本日はここまで。


Lua ( GSL Shell ) / GSL 学習は続く。


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


170709

OpenCV / cvSum : Calculates the sum of array elements

2017-08-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
OpenCV 2.4.13.2 documentationの、
OpenCV API Reference」の、
Operations on Arrays」に、

  sum
  Calculates the sum of array elements.

  C: CvScalar cvSum( const CvArr* arr )

   arr - input array that must have from 1 to 4 channels

  The functions sum calculate and return the sum of array elements,
   independently for each channel.

がある。


先日(2017-08-14)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で作った、
“cv2_a.lua”サブプログラムを使って、

試しにコーディングしてみた:
----- CV_Sum_of_Vec.gsl -----
require'cv2_a'

----- double 版
T = matrix.vec{ 0.1, 0.2, 0.4, 7.6, 0.8, 1.0 }

v = cv2.cvCreateMat( 1, #T, CV_64FC1 )
ffi.copy( v.Dbl, T.data, #T*8 )

print( cv2.cvSum(v).v1 )

-------------------------------------------------

----- long 版
T = ffi.new( 'int32_t[6]', 1, 2, 4, 76, 8, 10 )

i = cv2.cvCreateMat( 1, 6, CV_32SC1 )
ffi.copy( i.Int, T, 6*4 )

print( cv2.cvSum(i).v1 )
2パターンとも行けました。


と、以上は行ベクトルだった。


(多分行けるでしょうが)列ベクトルではどうか?
念の為コーディングしてみた:
----- Sum_of_Vec_CV_col.gsl -----
require'cv2_a'

----- double 版
T = matrix.vec{ 0.1, 0.2, 0.4, 7.6, 0.8, 1.0 }

v = cv2.cvCreateMat( #T, 1, CV_64FC1 ) -- 列ベクトル
ffi.copy( v.Dbl, T.data, #T*8 )

print( cv2.cvSum(v).v1 )

-------------------------------------------------

----- long 版
T = ffi.new( 'int32_t[6]', 1, 2, 4, 76, 8, 10 )

i = cv2.cvCreateMat( 6, 1, CV_32SC1 ) -- 列ベクトル
ffi.copy( i.Int, T, 6*4 )

print( cv2.cvSum(i).v1 )
(当然の事ながら?)行けました。



本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170709,10

GSL 学習:“gsl_a.lua”モジュール?

2017-08-16 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-14)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で、

昨年(2016-03-26)の記事「GSL Shell 学習:“cv2.lua”モジュール自作」で書いた、
'cv2'モジュールを全面的に置き換えて、
cv2_a.luaなるサブプログラムを作った。

同じ様に、
“GSL Shell”が包含しているDLL“libgsl-0.dll”についてもやってみた。

“libgsl-0.dll”に就いては、
昨年(2016-02-14)の記事「GSL Shell 学習:“libgsl-0.dll”で十分だった」で書いている。


それで、バージョンはよく分からないが、
1.8よりは新しそうだが2.0ではなさそうなので、

ftpサイト:Index of /pub/GNU/gsl
から、古いかも知れないがgsl-1.9.tar.gzをダウンロードした。

そして、取り敢えずdouble版と、long版について、
一部、計 16 ヘッダーファイルを取り込んだ。
「gsl_block_double.h」「gsl_block_double_long.h」「gsl_histogram.h」「gsl_histogram2d.h」「gsl_interp.h」「gsl_permute_double.h」「gsl_permute_long.h」「gsl_sort_double.h」「gsl_sort_long.h」「gsl_statistics_double.h」「gsl_statistics_long.h」「gsl_spline.h」「gsl_matrix_double.h」「gsl_matrix_long.h」「gsl_vector_double.h」「gsl_vector_long.h」

これらのファイルから“構造体”と“関数”の定義を抜き出した。
「gsl_cdef_Struct.lua」と「gsl_cdef_Func.lua」

“OpenCV”と同様なチェックを行った。
「GSL_VAR」宣言が付いているものと、
構造体名に“_view”が付いているものがジャマ(?)をする。


あれこれ“調べ/考え”た結果、

「GSL_VAR」宣言は単純に消せば行ける?
名前に“_view”が付いているものについては、
ffi.cdef[[
typedef gsl_matrix_view _gsl_matrix_view;
typedef gsl_matrix_const_view _gsl_matrix_const_view;
typedef gsl_vector_view _gsl_vector_view;
typedef gsl_vector_const_view _gsl_vector_const_view;

typedef gsl_vector_long _gsl_vector_long_view;
typedef gsl_vector_long _gsl_vector_long_const_view;
]]
で誤魔化した。

これで、“gsl_a.lua”サブプログラムを作った:
----- gsl_a.lua -----
gsl = require'gsl'

ffi.cedf[[
// ここには、「gsl_cdef_Struct.lua」
]]


ffi.cedf[[
// ここには、「gsl_cdef_Func.lua」
]]


これを利用するときは、

  require'gsl_a'

で読み込み、

関数を使うときは、

  M = matrix.vec{ 0.2, 2.0, -0.5, 1.1, 0, 4.0 }
  k = gsl.gsl_stats_max_index( M.data, 1, 6 )

の様な感じ。


これで、double版、long版のそれなりの数の関数が使える?


本日はここまで。


Lua ( GSL Shell ) / GSL 学習は続く。


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


170706,07

GSL Shell 学習:“cv2_a.lua”モジュール?

2017-08-14 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-12)の記事「OpenCV 学習:関数プロトタイプ宣言一覧」で、
関数プロトタイプ宣言「cv_cdef_Func.lua」ファイル、
構造体等定義ファイル「cv_cdef_Struct.lua」ファイル、
が一応出来た?

そこで、
以前(2017-08-05)の記事「OpenCV 学習:定数コードの値」で書いた、
“CV_constant.txt”ファイルも含めて、

昨年(2016-03-26)の記事「GSL Shell 学習:“cv2.lua”モジュール自作」で書いた、
'cv2'モジュールを全面的に置き換えることにした。


と云っても、モジュールではない?
単なるサブプログラムでしょうか?


ファイル名は cv2_a.luaとした:
----- cv2_a.lua -----

----- 最初に定義:
cv2 = ffi.load( 'opencv_world300' )


--[[
   ここに「CV_constant.txt」の中身
]]


--[[
   ここに「cv_cdef_Struct.lua」の初め部分
]]
  charA = |s| ffi.cast( 'char*', s )
  voidA = |a| ffi.cast( 'void*', a )
  intA = |v| ffi.cast( 'void*', v )

  NULL = voidA(0)


--[[
   次に、「cv_cdef_Struct.lua」の残り部分
]]

ffi.cdef[[
typedef unsigned char Byte;
typedef unsigned short Word;
typedef unsigned int DWord;

// 続けて、OpenCV 固有の構造体

typedef void CvArr;
typedef struct CvPoint{ int x; int y; } CvPoint;
/*****************/
/*****************/

]]


----- 最後に「cv_cdef_Func.lua」の宣言

ffi.cdef[[
CvPoint cvPoint( int x, int y );
CvPoint cvPointFrom32f( CvPoint2D32f point );
CvPoint2D32f cvPoint2D32f( double x, double y );
CvPoint2D32f cvPointTo32f( CvPoint point );
CvPoint3D32f cvPoint3D32f( double x, double y, double z );
CvPoint2D64f cvPoint2D64f( double x, double y );
CvPoint3D64f cvPoint3D64f( double x, double y, double z );
CvSize cvSize( int width, int height );
CvSize2D32f cvSize2D32f( double width, double height );
CvRect cvRect( int x, int y, int width, int height );
void cvClearND( CvArr* arr, const int* idx );
IplImage* cvCloneImage( const IplImage* image );
CvMat* cvCloneMat( const CvMat* mat );
/*****************/
/*****************/

]]
以上、約 700 行ほど。


これを利用するときは、

  require'cv2_a'

で読み込み、

関数を使うときは、

  cv2. cvLoadImageM( 'hoge.tif', CV_LOAD_IMAGE_GRAYSCALE )
  print( img.xx, img.yy )
  cv2.cvSaveImage( 'out.tif', img, 0 )

の様な感じ。


これで、それなりの数の関数が使えるものができた?


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170707

OpenCV 学習:関数プロトタイプ宣言一覧

2017-08-12 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-11)の記事「OpenCV 学習:cvMinMaxLoc」でも、
昨年(2016-03-26)の記事「GSL Shell 学習:“cv2.lua”モジュール自作」で書いた、
'cv2'モジュールを使っている。

作った時からかれこれ1年半が経過し、あれこれ学習してきた。
現在使っているOpenCVの“DLL”opencv_world300.dllに含まれている
多くの関数に関するプロトタイプ宣言の不足が目立ってきた。


そこで、一気にそこそこの数のプロトタイプ宣言をまとめたくなった。


都度参照している、
OpenCV 2.4.13.2 documentationの、
OpenCV API Reference」では、
以下の様にリンクの一覧がある。

 ・Introduction
   ・API Concepts
 ・core. The Core Functionality
   ・Basic Structures
   ・Basic C Structures and Operations
   ・Dynamic Structures
   ・Operations on Arrays
   ・Drawing Functions
   ・XML/YAML Persistence
   ・XML/YAML Persistence (C API)
   ・Clustering
   ・Utility and System Functions and Macros
   ・OpenGL interoperability
 ・imgproc. Image Processing
   ・Image Filtering
   ・Geometric Image Transformations
   ・Miscellaneous Image Transformations
   ・Histograms
   ・Structural Analysis and Shape Descriptors
   ・Motion Analysis and Object Tracking
   ・Feature Detection
   ・Object Detection
 ・highgui. High-level GUI and Media I/O
   ・User Interface
   ・Reading and Writing Images and Video
   ・Qt New Functions
 ・video. Video Analysis
 ・・・・・
 ・・・・・

この中で、
(上記)太字で表示した 13のページから、
C 言語用の関数定義を抽出し、
「cv_cdef_Func.lua」ファイルにまとめた。

その結果は、・・・・・

最初の「Basic C Structures and Operations
から抽出した一部:
ffi.cdef[[

CvPoint cvPoint( int x, int y );
CvPoint cvPointFrom32f( CvPoint2D32f point );
CvPoint2D32f cvPoint2D32f( double x, double y );
CvPoint2D32f cvPointTo32f( CvPoint point );
CvPoint3D32f cvPoint3D32f( double x, double y, double z );
CvPoint2D64f cvPoint2D64f( double x, double y );
CvPoint3D64f cvPoint3D64f( double x, double y, double z );
CvSize cvSize( int width, int height );
CvSize2D32f cvSize2D32f( double width, double height );
CvRect cvRect( int x, int y, int width, int height );
void cvClearND( CvArr* arr, const int* idx );
IplImage* cvCloneImage( const IplImage* image );
CvMat* cvCloneMat( const CvMat* mat );
CvMatND* cvCloneMatND( const CvMatND* mat );
CvSparseMat* cvCloneSparseMat( const CvSparseMat* mat );
void cvConvertScale( const CvArr* src, CvArr* dst, double scale, double shift );
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask );
void cvCreateData( CvArr* arr );
IplImage* cvCreateImage( CvSize size, int depth, int channels );
IplImage* cvCreateImageHeader( CvSize size, int depth, int channels );
CvMat* cvCreateMat( int rows, int cols, int type );
/***********************************************************************/
/***********************************************************************/

]]


これに対応して、
構造体等の定義ファイル「cv_cdef_Struct.lua」を手作業で作った。
その一部:
-- 初めに、良く使う(Lua)関数等々の宣言

charA = |s| ffi.cast( 'char*', s )
voidA = |a| ffi.cast( 'void*', a )
intA = |v| ffi.cast( 'void*', v )

NULL = voidA(0)


-- 次に、<紙>流型宣言

ffi.cdef[[
typedef unsigned char Byte;
typedef unsigned short Word;
typedef unsigned int DWord;
]]


-- そして、OpenCV 固有の構造体

ffi.cdef[[

// 主に、Basic C Structures and Operations から、17の構造体(一部修正)

typedef void CvArr;
typedef struct CvPoint{ int x; int y; } CvPoint;
typedef struct CvPoint2D32f{ float x; float y; } CvPoint2D32f;
typedef struct CvPoint3D32f{ float x; float y; float z; } CvPoint3D32f;
typedef struct CvPoint2D64f{ double x; double y; } CvPoint2D64f;
typedef struct CvPoint3D64f{ double x; double y; double z; } CvPoint3D64f;
typedef struct CvSize{ union{ int width; int xx; }; union{ int height; int yy; }; } CvSize;
typedef struct CvSize2D32f{ union{ float width; float xx; }; union{ float height; float yy; }; } CvSize2D32f;
typedef struct CvRect{ int x; int y; union{ int width; int xx; }; union{ int height; int yy; }; } CvRect;

typedef struct CvBox2D{ float x; float y; float xx; float yy; float angle; } CvBox2D;
/***********************************************************************/
/***********************************************************************/

]]


そして、これで使えるのか?のチェックを行った:
-- test.gsl --
cv2 = ffi.load( 'opencv_world300' )
require'cv_cdef_Struct'
require'cv_cdef_Func'
以上3行のプログラムを作り、
実行=コンパイル?
エラー無く終われば定義漏れが無いと云える?


エラー=未定義構造体については、
都度追加していった
-- cv_cdef_Struct.lua に追加

typedef void CvSparseNode;
typedef void CvSparseMatIterator;
typedef void CvRNG;
typedef void CvHistogram;
/***************************************/
typedef int64_t int64;
typedef int64_t Cv_iplCreateImageHeader;
typedef int64_t Cv_iplAllocateImageData;
typedef int64_t Cv_iplDeallocate;
/***************************************/

の様にダミー定義を追加した。

これで、使えるものができる?


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170703-06

OpenCV 学習:cvMinMaxLoc

2017-08-11 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-09)の記事「GSL 学習:gsl_stats_max_index」では、
OpenCVから逸れて、GSLの学習だった。

今回は、
本流?に戻って、OpenCVの学習。


OpenCV 2.4.13.2 documentation
minMaxLoc」では、

  Finds the global minimum and maximum in an array.
void cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val,
CvPoint* min_loc=NULL, CvPoint* max_loc=NULL, const CvArr* mask=NULL )
 Parameters:
  ・src - input single-channel array.
  ・minVal - pointer to the returned minimum value; NULL is used if not required.
  ・maxVal - pointer to the returned maximum value; NULL is used if not required.
  ・minLoc - pointer to the returned minimum location (in 2D case); NULL is used if not required.
  ・maxLoc - pointer to the returned maximum location (in 2D case); NULL is used if not required.
  ・mask - optional mask used to select a sub-array.
(パラメータ名は、C++ 用なので、読み替えが必要)
とある。


そこで、
3行4列マトリックスの2行目のデータに関してテストしてみた:

----- CV_cvMinMaxLoc.gsl -----
cv2 = require'cv2'
ffi.cdef[[
void cvMinMaxLoc( CvArr* arr, double* Min, double* Max, CvPoint* Minidx, CvPoint* Maxidx, CvArr* mask );
]]
--- 3行4列マトリックス
arr = cv2.cvCreateMat( 3, 4, 6 ) -- CV_64FC1
T = { 0.2, 4, -0.5, 1, 1.1, 0, 3.0, -3, 1.2, -5, 0, 2 }
for n=0,11 do arr.Dbl[n]=T[n+1] end

Min=ffi.new('double[1]'); Max=ffi.new('double[1]')
PMin=ffi.new('CvPoint[1]'); PMax=ffi.new('CvPoint[1]')

mask = cv2.cvCreateMat( 3, 4, 0 )
for n=0,11 do mask.Byte[n]=0 end
for n=4,7 do mask.Byte[n]=1 end --- 2行目を対象に

cv2.cvMinMaxLoc( arr, Min, Max, PMin, PMax, mask )

--- 結果確認
print( Min[0], Max[0], PMin[0].x, PMin[0].y, PMax[0].x, PMax[0].y )
これでOK。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170701

GSL 学習:gsl_stats_max_index

2017-08-09 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-07)の記事「OpenCV 学習:CvMat型学習サイト」では、
 ・・・・・
 ・・・・・
 それで、
 2番目の ・線形代数の、
 13番目の 行列要素の最小値・最大値を求める
  行列要素の最小値・最大値,およびそれの位置を求めます.
  (例えば,最大値だけが必要で,最小値が不要な場合など)
  求める必要がないパラメータには NULL を渡すこともできます.
  また,マスクを利用して,
  限定された範囲内の最小値・最大値を求めることも可能です.
 などなどが気になった。
 ・・・・・
 ・・・・・

で終わっていたが、・・・・・

ふと思いついた。
この様なことは、GSL Shellが包含している、
GSL - GNU Scientific Library」でも、
当然出来るのでは?

と云うことで、調べてみた。

GSL Reference Manual - HTML」を見ると、・・・

Statistics」に有るのでは?

Maximum and Minimum values
に、
double gsl_stats_max( const double data[], size_t stride, size_t n )
などがある。


手始めに、
上記と、
size_t gsl_stats_max_index( const double data[], size_t stride, size_t n )
を使ってみた。


----- test_use_GSL.gsl -----
gsl = require'gsl'

ffi.cdef[[
double gsl_stats_max ( const double data[], const size_t stride, const size_t n );
int gsl_stats_max_index ( const double data[], const size_t stride, const size_t n );
]]

x = matrix.vec{ 3.5, 3.1, 3 }
y = gsl.gsl_stats_max( x.data, 1, 3 )
print( y )

k = gsl.gsl_stats_max_index( x.data, 1, 3 )
print( k, x[k+1] )
これは、使える。


もっと、
GSL - GNU Scientific Library を学習しよう。


本日はここまで。


Lua ( GSL Shell ) / GSL 学習は続く。


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


170630

OpenCV 学習:CvMat型学習サイト

2017-08-07 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
OpenCV 学習”と云うことで、
OpenCV.jp : OpenCV逆引きリファレンス」サイトを見つけた。

だが、
このサイトについては、
昨年3月(2016-03-04)の記事「GSL Shell 学習:OpenCV の CvMat 型」で
書いていた:
  ・・・・・
  ・・・・・
  「OpenCV.jp」の「OpenCV-CookBook」サイト内の、
  「cv::Matの基本処理
  には、
  ・・・・・
  ・・・・・

更にその後の記事「OpenCV:CV_8UC3 のコード値」でも:
  ・・・・・
  ・・・・・
  上記記事以前(2016-03-04)に書いていた記事:
  「GSL Shell 学習:OpenCV の CvMat 型」で、
  参照(&学習?)していた「OpenCV-CookBook」の、
  「cv::Matの基本処理
  を良く見れば載っていたのだった。
  ・・・・・
  ・・・・・


そう云う訳で、
今度こそはこのサイトでしっかり学習することにした。

 基本的に OpenCV (と依存ライブラリ),
  および標準ライブラリ以外は使用しません.
 OpenCVはEigenなしでも利用できますが,
  このサンプルの中にはEigen必須のものもあります.
 また,2.4.0以降に導入された書式には一部対応しておらず,
  古い書き方で書かれているサンプルもあります.
 指摘や訂正,リクエストなどは OpenCV.jp か, @idojun (Twitter) まで.

 OpenCV 2.4.0 対応:
 ・cv::Matの基本処理
   ・cv::Matの概要
   ・cv::Mat の内容を std::cout に出力する
   ・cv::Matにおけるメモリの自動管理
   ・cv::Matを初期化する
   ・cv::Matの行数・列数・次元数を調べる
   ・cv::Matのビット深度を調べる
   ・cv::Matのデータがメモリ上で連続しているかを調べる
   ・cv::Matが部分配列かを調べる
   ・cv::Matの様々なプロパティ
   ・cv::Matの型(ビット深度)を変換する
   ・cv::Matをリサイズする
   ・cv::Matを変形する
   ・cv::Matの特定の行/列を取り出す
   ・cv::Matの部分行列を取り出す
   ・cv::Mat のチャンネルの合成と分離
   ・cv::Matの列/行毎の合計,平均値,最小,最大値を求める
   ・・・・・
   ・・・・・
 ・線形代数
   ・行列要素の四則演算を行う
   ・行列同士の積を求める
   ・cv::Vecの内積と外積
   ・ノルムを求める
   ・行列式を求める
   ・行列の転置
   ・行列の対角成分を取り出す
   ・行列のトレースを求める
   ・逆行列/疑似逆行列を求める
   ・2次元ベクトルの角度と大きさを求める
   ・角度と大きさから2次元座標を求める
   ・行列を反転する
   ・行列要素の最小値・最大値を求める
   ・・・・・
   ・・・・・
 ・画像処理
   ・画像を単色で塗りつぶす
   ・色空間を変換する
   ・画像サイズを変更する
   ・画像を垂直・水平に反転する
   ・画像をネガポジ反転する
   ・画像を2値化する
   ・画像を回転する
   ・2次元のアフィン変換を行う
   ・・・・・
   ・・・・・
 ・描画処理
   ・・・・・
   ・・・・・
 ・入出力とGUI
   ・・・・・
   ・・・・・
 ・その他の機能
   ・・・・・
   ・・・・・


それで、
2番目の ・線形代数の、
13番目の 行列要素の最小値・最大値を求める
  行列要素の最小値・最大値,およびそれの位置を求めます.
  (例えば,最大値だけが必要で,最小値が不要な場合など)
  求める必要がないパラメータには NULL を渡すこともできます.
  また,マスクを利用して,
  限定された範囲内の最小値・最大値を求めることも可能です.

などなどが気になった。


このサイトで、OpenCV の学習だ。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


170630

OpenCV 学習:定数コードの値

2017-08-05 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
OpenCVの“DLL”opencv_world300.dllを使っている。

ドキュメントで関数のプロトタイプを調べると、
出てくるのは、CV_8UC1とかと云った定数コード。

そこで、これまで調べたコト等々を纏めてみた。

取り敢えず、“CV_constant.txt”として備忘録とした。

以下、全くの<紙>用のもの:
----- CV_constant.txt -----

----- Image 作成用
CV_8U = 0; CV_8UC1 =0; CV_8UC2=8; CV_8UC3=16
CV_8S = 1; CV_8SC1 =1
CV_16U = 2; CV_16UC1=2; CV_16S = 3; CV_16SC1= 3
CV_32S = 4; CV_32SC1=4; CV_32SC2=12; CV_32SC3=20
CV_32F = 5; CV_32FC1=5; CV_32FC2=13; CV_32FC3=21
CV_64F = 6; CV_64FC1=6; CV_64FC2=24

----- Image 読み込み用
CV_LOAD_IMAGE_UNCHANGED=-1
CV_LOAD_IMAGE_GRAYSCALE= 0
CV_LOAD_IMAGE_COLOR = 1


----- Contour 検出モード
CV_RETR_EXTERNAL =0
CV_RETR_LIST =1 -- デフォルト
CV_RETR_CCOMP =2
CV_RETR_TREE =3
CV_RETR_FLOODFILL=4

----- Contour 近似方法
CV_CHAIN_CODE =0
CV_CHAIN_APPROX_NONE =1
CV_CHAIN_APPROX_SIMPLE =2 -- デフォルト
CV_CHAIN_APPROX_TC89_L1 =3
CV_CHAIN_APPROX_TC89_KCOS=4
CV_LINK_RUNS =5


----- Image カラー変換
CV_BGR2BGRA =0; CV_RGB2RGBA=0
CV_BGRA2BGR =1; CV_RGBA2RGB=1
CV_BGR2RGBA =2; CV_RGB2BGRA=2
CV_RGBA2BGR =3; CV_BGRA2RGB=3
CV_BGR2RGB =4; CV_RGB2BGR =4
CV_BGRA2RGBA=5; CV_RGBA2BGRA=5
CV_BGR2GRAY =6 -- カラーからGray
CV_RGB2GRAY =7
CV_GRAY2BGR =8 -- Grayからカラー
CV_GRAY2RGB =8
CV_GRAY2BGRA=9: CV_GRAY2RGBA=9
CV_BGRA2GRAY=10
CV_RGBA2GRAY=11


----- Image 補間方法
CV_INTER_NEAREST =0
CV_INTER_LINEAR =1
CV_INTER_CUBIC =2
CV_INTER_AREA =3
CV_INTER_LANCZOS4=4

----- Rotation / affine transformation
CV_CV_WARP_FILL_OUTLIERS= 8
CV_CV_WARP_INVERSE_MAP =16


----- マウスイベントの種類
CV_EVENT_MOUSEMOVE = 0 -- マウスカーソルが動いた
CV_EVENT_LBUTTONDOWN = 1 -- 左ボタンが押された
CV_EVENT_RBUTTONDOWN = 2 -- 右ボタンが押された
CV_EVENT_MBUTTONDOWN = 3 -- 中央ボタンが押された
CV_EVENT_LBUTTONUP = 4 -- 左ボタンが離された
CV_EVENT_RBUTTONUP = 5 -- 右ボタンが離された
CV_EVENT_MBUTTONUP = 6 -- 中央ボタンが離された
CV_EVENT_LBUTTONDBLCLK = 7 -- 左ボタンがダブルクリックされた
CV_EVENT_RBUTTONDBLCLK = 8 -- 右ボタンがダブルクリックされた
CV_EVENT_MBUTTONDBLCLK = 9 -- 中央ボタンがダブルクリックされた

----- フラグの種類
CV_EVENT_FLAG_LBUTTON = 1 -- マウス左ボタンが押されているか
CV_EVENT_FLAG_RBUTTON = 2 -- マウス右ボタンが押されているか
CV_EVENT_FLAG_MBUTTON = 4 -- マウス中央ボタンが押されているか
CV_EVENT_FLAG_CTRLKEY = 8 -- CTRLボタンが押されているか
CV_EVENT_FLAG_SHIFTKEY = 16 -- Shiftボタンが押されているか
CV_EVENT_FLAG_ALTKEY = 32 -- Altボタンが押されているか


-- cvCreateSeq 用
CV_SEQ_ELTYPE_POINT = 12 -- CV_32SC2 /* (x,y) */
CV_SEQ_ELTYPE_CODE = 0 -- CV_8UC1 /* フリーマンコード: 0..7 */
CV_SEQ_ELTYPE_GENERIC = 0 -- 0 /* 一般的なシーケンス要素型 */
CV_SEQ_ELTYPE_PTR = 6 -- CV_USRTYPE1 /* =6 */
--- CV_SEQ_ELTYPE_PPOINT CV_SEQ_ELTYPE_PTR /* 他のSeq要素へのポインタ */
--- CV_SEQ_ELTYPE_INDEX CV_32SC1 /* 他のSeqの要素のインデックス */
--- CV_SEQ_ELTYPE_GRAPH_EDGE CV_SEQ_ELTYPE_GENERIC /* ・・・・・ */
--- CV_SEQ_ELTYPE_GRAPH_VERTEX CV_SEQ_ELTYPE_GENERIC /* 最初の辺, &(x,y) */
--- CV_SEQ_ELTYPE_TRIAN_ATR CV_SEQ_ELTYPE_GENERIC /* 二分木の頂点ノード */
--- CV_SEQ_ELTYPE_CONNECTED_COMP CV_SEQ_ELTYPE_GENERIC /* 連結成分 */
--- CV_SEQ_ELTYPE_POINT3D CV_32FC3 /* (x,y,z) */
と云ったところ。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


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


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



おきてがみ

最新記事
カレンダー
07 | 2017/08 | 09
- - 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
ブックマーク