OpenCV 学習:cvFitEllipse2をCvMat型点データで

2017-08-03 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-07-22)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2 は正常」で書いたプログラムでは、
入力の点データ群は“CvSeq”型で定義したが、
<紙>的には、面倒なので“CvMat”型で使えないか学習した。

---- test_CvMat-Points_FitEllips.gsl -----
cv2 = require'cv2'
ffi.cdef[[
/****************************/
/* 不足分の関数宣言を記述 */
/****************************/
]]
X=ffi.new('int32_t[8]', 35, 46, 48, 39, 26, 21, 26, 35 )
Y=ffi.new('int32_t[8]', 22, 26, 43, 51, 50, 40, 28, 23 )

------------- 2 列で定義する -----
points = cv2.cvCreateMat( 8, 2, 4 ) -- 4==CV_32S
M = points.Int
for i=0,7 do M[2*i]=X[i]; M[2*i+1]=Y[i] end

ell = cv2.cvFitEllipse2( points )

---------- 確認 -----
print( ell.x, ell.y, ell.xx, ell.yy, ell.angle )

でしょうか?

多分、正しく求まっている様ダ。


本日はここまで。


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


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


170625

LuaCV:CvMat型も使える

2017-08-01 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-07-30)の記事「OpenCV:cvFindContours 正常に出来た
で書いた如く、
  原因が分からなかった、cvFindContoursの結果不正。
  遂に、原因が判明した。
  ・・・・・
  ・・・・・
  これで、やっと懸案事項が解決した。

と云うことで、
もう“LuaCV”を使うことは無いだろうが、
駄目押しで、1点確認してみた。


以前(2017-07-28)の記事:
LuaCV:OpenCV library wrapper for Lua language」の
プログラムでは、“IplImage”型画像データを使っていた。

この“LuaCV”即ちOpenCVバージョンは2.3.1で、
“CvMat”型画像データが使えるか?

と云うことで、書き直してみた:
----- test_CvMat_FindContors.lua -----
cv = require'luacv'

img2 = cv.LoadImageM( 'Threshold.tif' ) -- これはカラーモードでの読み込み
xx, yy = img2.width, img2.height

img1 = cv.Createmat( yy, xx, cv.CV_8UC1 ) -- GrayScale 用領域
cv.CvtColor( img2, img1, cv.CV_BGR2GRAY )

---------- 以下でテスト
storage = cv.CreateMemStorage()
a, contours = cv.FindContours( img1, storage, cv.CvContour["size"], cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE, cv.Point(0,0) )
print( contours ) -- 確認用
while contours do
print( contours.total ) -- 確認用
z = cv.FitEllipse2( contours )
print( z["center"].x, z["center"].y, z["size"].width, z["size"].height, z["angle"] ) -- 確認用

cv.Ellipse( img2, cv.Point(z["center"].x,z["center"].y), cv.Size(z["size"].width/2,z["size"].height/2), z["angle"], 0, 360, cv.Scalar(0,0,255), 1, 8,0 )

contours=contours.h_next
end

cv.SaveImage( 'CvMat_LuaCV.png', img2 )
cv.ClearMemStorage(storage)
でしょうか?

キッチリ結果が出ていた。
OKでした。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170625

OpenCV:cvFindContours 正常に出来た

2017-07-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-07-21)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2」以来、
原因が分からなかった、cvFindContoursの結果不正。

遂に、原因が判明した。

改めて、当該関数の定義を見直すと:
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
とある。
ここで、最後の7番目の引数に関しては、
  offset - Optional offset by which every contour point is shifted. ・・・
と(Optional)とあるので、省略していた。
しかし、5番目、6番目はデフォルトとかを指定していた。

つまり、7番目もデフォルト値を指定すべきだった。

と云うことで、完成したコード:
---- GSL Shell コード
cv2 = require'cv2'
ffi.cdef[[
/****************************/
/* 不足分の関数宣言を記述 */
/****************************/
]]
---- ・・・・・
img = cv2.cvLoadImageM( 'Threshold.tif', 0 ) -- CV_8UC1 入力
xx, yy = img.xx, img.yy

img2=cv2.cvCreateMat(yy,xx,16) -- CV_8UC3 領域
cv2.cvCvtColor( img, img2, 8 ) -- CV_GRAY2BGR BWからcolor

storage = cv2.cvCreateMemStorage( 0 )

contours=ffi.new('CvSeq*[1]'); P0=ffi.new('CvPoint', 0, 0 )

r = cv2.cvFindContours( img, storage, contours, 88, 3, 2, P0 )

it=ffi.new('CvTreeNodeIterator[1]')
cv2.cvInitTreeNodeIterator( it, contours[0], 3 )

while true do
cnt = ffi.cast( 'CvSeq*', cv2.cvNextTreeNode( it ) )
if cnt == nil then break end

ell = cv2.cvFitEllipse2( cnt )

P1=ffi.new('CvPoint'); S1=ffi.new('CvSize')
P1.x, P1.y = ell.x+0.5, ell.y+0.5
S1.xx, S1.yy = ell.xx/2+0.5, ell.yy/2+0.5
Sc1=ffi.new('CvScalar', 255,0,0,0) -- B:青

cv2.cvEllipse( img2, P1, S1, ell.angle, 0, 360, Sc1, 1, 8, 0 )
end

cv2.cvSaveImage( 'FitEllipse.tif', img2, 0 )
と云った感じ。

ここで、注意点

cvEllipseの第3引数、
即ち楕円のの指定は整数に成っている。
なので、四捨五入した方が宜しいようだ。


なお、
cvFitEllipse2の戻り構造体CvBox2Dの定義は、
<紙>流にしている。

要素の定義はフラットで、
{ x, y, xx, yy, angle }
最初の2つが中心、次の2つが径、最後が角度。


これで、やっと懸案事項が解決した。


本日はここまで。


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


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


170628

OpenCV 2.3.1 でも変わらない?

2017-07-29 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-07-28)の記事:
LuaCV:OpenCV library wrapper for Lua language」では、

LuaCVを使うと、(基本)LuaからOpenCV 2.3.1を使える。
そして、FindContoursが正常に動作した。

なので、GSL Shellから使えるOpenCV 2.3.1を探してみた。
つまり、今使っているOpenCV 3.0.0の“DLL”じゃなくて、
古いバージョンの“DLL”



Index of /project/opencvlibrary」の中から、
opencv-win/ に行き、
2.3.1/ を選び、
OpenCV-2.3.1-win-superpack.exeをダウンロードした。
  2011-08-18 05:06 付 124MB

これ(~.exe)を“Explzh”で開き、
“build”フォルダの中の“x86”の中の“mingw”の中の“bin”に、
13個の“DLL”がある。
“opencv_”で始まる12個の“DLL”を頂いた。


それで、“cvcv.lua”で、ヘッダーファイルを作り、
ダメだった最初(2017-07-21)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2
のコードを真似てコーディングしてみた。

途中、“DLL”が複数に分かれているので苦労したが、
以下で動いた:
----- FindContours_2.3.1.gsl -----
cvc = ffi.load( 'opencv_core231' )
cvi = ffi.load( 'opencv_imgproc231' )
cvh = ffi.load( 'opencv_highgui231' )

require'cvcv'

img = cvh.cvLoadImage( 'Threshold.tif', 0 )
xx, yy = img.width, img.height
sz = ffi.new( 'CvSize', xx, yy )

img2 = cvc.cvCreateImage( sz, 8, 3 )
cvi.cvCvtColor( img, img2, 8 )

storage = cvc.cvCreateMemStorage( 0 )

contours=ffi.new('CvSeq*[1]')
r = cvi.cvFindContours( img, storage, contours, 88, 1, 2 )
print( 'OK' , r ) ----- 確認用

it=ffi.new('CvTreeNodeIterator[1]')
cvc.cvInitTreeNodeIterator( it, contours[0], 3 )

i=0
while true do
contour = ffi.cast( 'CvSeq*', cvc.cvNextTreeNode( it ) )
if contour == nil then break end
print( contour.total, contour ) ----- 確認用

ell = cvi.cvFitEllipse2( contour )
print( ell.x, ell.y, ell.r1, ell.r2, ell.angle ) ----- 確認用

P1=ffi.new('CvPoint'); S1=ffi.new('CvSize')
P1.x, P1.y = ell.x, ell.y
S1.width, S1.height = ell.r1/2, ell.r2/2
Sc1=ffi.new('CvScalar'); Sc1.v1=255
cvc.cvEllipse( img2, P1, S1, ell.angle, 0, 360, Sc1, 1, 8, 0 )
end

cvh.cvSaveImage( 'Fit_By_CV231.tif', img2, 0 )
cvc.cvClearMemStorage(storage)
でしょうか?

やはり、“P1.x”“P1.y”つまり、近似楕円の中心点が不正?


結局、常用の“OpenCV 3.0.0”と変わらなかった。

再度出直しダ。


本日はここまで。


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


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


170624

LuaCV:OpenCV library wrapper for Lua language

2017-07-28 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-07-21)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2」以来、
“GSL Shell”でのOpenCVでは、
画像内のコンター(群)を求めるcvFindContoursの動作不正?の原因が分からない。


それで、「Lua OpenCV」で検索していたら、・・・・・
“GitHub”に、
marcoscoffier/lua---opencv: bindings to some parts of …

satoren/luaOpenCV: OpenCV wrapper for Lua
が見つかる。
しかし、これらはソースコードのみ。

更に探していたら、
“SourceForge.net”の「LuaCV download
が見つかった。

ここで、右にある大きい緑の「Download」ボタンではなくて、
その下にある、普通サイズ文字:
Browse All Files」からは、
Binariesが見つかった。

「LuaCV.exe」の他に、
「lua.zip」「luacv.zip」「opencv.zip」の3つの書庫がある。
それぞれの中身は、4ファイル、3ファイル、12ファイル。
これらを一箇所に展開した。
重複するので結果15ファイル。
OpenCVのバージョンは2.3.1で、
Luaは、5.2.0だった。

そこで、1本コーディングしてみた;
----- test_FindContors.lua -----
cv = require'luacv'

img2 = cv.LoadImage( 'Threshold.tif' ) -- これはカラーモードで読み込み
xx, yy = img2.width, img2.height
sz = cv.Size( xx, yy )

img1 = cv.CreateImage( sz, cv.IPL_DEPTH_8U, 1 ) -- GrayScale 用領域
cv.CvtColor( img2, img1, cv.CV_BGR2GRAY )

---------- 以下でテスト
storage = cv.CreateMemStorage()
a, contours = cv.FindContours( img1, storage, cv.CvContour["size"], cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE, cv.Point(0,0) )
print( contours ) -- 確認用
while contours do
print( contours.total ) -- 確認用
for i=1,5 do
w = cv.GetSeqElem( contours, i, cv.CvPoint["name"] )
io.write( w.x , ' ', w.y , ' ' ) -- 確認用
end print()
for i=k-4,k do
w = cv.GetSeqElem( contours, i, cv.CvPoint["name"] )
io.write( w.x , ' ', w.y , ' ' ) -- 確認用
end print()
contours=contours.h_next
end
でイイのかな?

そして、その場でDOSプロンプトで
Lua  test_FindContors.lua
としたら、
出来ているようダ。

続けて、楕円フィッティングをやってみた:
----- test_FindC_FitEs.lua -----
cv = require'luacv'

img2 = cv.LoadImage( 'Threshold.tif' ) -- これはカラーモードで読み込み
xx, yy = img2.width, img2.height
sz = cv.Size( xx, yy )

img1 = cv.CreateImage( sz, cv.IPL_DEPTH_8U, 1 ) -- GrayScale 用領域
cv.CvtColor( img2, img1, cv.CV_BGR2GRAY )

---------- 以下でテスト
storage = cv.CreateMemStorage()
a, contours = cv.FindContours( img1, storage, cv.CvContour["size"], cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE, cv.Point(0,0) )

while contours do
z = cv.FitEllipse2( contours )
print( z["center"].x, z["center"].y, z["size"].width, z["size"].height, z["angle"] ) -- 確認用
cv.Ellipse( img2, cv.Point(z["center"].x,z["center"].y), cv.Size(z["size"].width/2,z["size"].height/2), z["angle"], 0, 360, cv.Scalar(0,0,255), 1, 8,0 )
contours=contours.h_next
end
cv.SaveImage( 'LuaCV.png', img2 )
cv.ClearMemStorage( storage )
でしょうか?

キッチリ結果が出ていた。


これで行けると良いが、
これは、LuaJITに対応していない!

4月(2017-04-21)の記事:
call_Lua52 似非モジュール(基本Lua呼び出し)
で書いた方式でも一応出来たが???


どうしようかナ???


本日はここまで。


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


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


170623

OpenCV 学習:輪郭追跡処理

2017-07-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-07-24)の記事「GSL Shell/OpenCV 学習:輪郭(エッジ)検出」では、
  ・・・・・
  ・・・・・
  だが、これではcvFindContoursの代替にはならない。
  つまり、輪郭画素の位置データが得られない?
  ・・・・・
  ・・・・・
で終わっていた。


そこで、
輪郭座標取得処理に関して、Web検索した。

「画像処理ソリューション」サイトの“画像処理”に
輪郭追跡処理アルゴリズム」を見つけた。

  二値化された画像において、
  各連結部分の境界部分を求める事を輪郭追跡といいます。
  この輪郭追跡を行う事で周囲長や連結領域の幅や高さなどを
  求めることが出来ます。

  以下、この輪郭追跡の処理アルゴリズムを紹介します。
  ・・・・・
  ・・・・・

これを頂き、
Lua ( GSL Shell ) で、<紙>流コーディングを行った。

----- test_Search_Edge.gsl -----

-- BT : 二値化された画像(バイトデータ)

-- XT、YT : 輪郭点座標テーブル
XT, YT = matrix.new( 10000, 1 ), matrix.new( 10000, 1 )

function setP(x,y)
if x~=xs or y~=ys then
m=m+1; XT[m],YT[m]=x,y; xs,ys=x,y
end
end

-- 8方向座標差分 & 検出処理
VXY={ {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}, {-1,-1}, {-1,0} }
function chkBT(V) v=V
while BT[(y+VXY[v+1][2])*xx+(x+VXY[v+1][1])]==0 do v=(v+1)%8 end
return v, x+VXY[v+1][1], y+VXY[v+1][2]
end

----- 取り敢えず1つの塊についての処理:
m = 0 -- 輪郭点の数

while true do
xs,ys=0,0 -- 1つ前の座標

----- 開始点(x0,y0)探索
y0=-1
for y=0,yy-1 do
for x=0,xx-1 do
if BT[y*xx+x]>0 then y0=y; x0=x; break end
end
if y0>-1 then break end
end
if y0<0 then break end -- {y0,x0}
print( x0, y0 ) -- 確認用
y,x=y0,x0; setP(x,y); Vold=-6; y1=y0
while true do
V,x,y = chkBT((Vold+6)%8)
if y>y1 then y1=y end
if x==x0 and y==y0 then break end
setP(x,y); Vold=V
end
end
------ これで、輪郭検出終了
print( m ) -- 確認用
--[[
  以降は、
  以前(2017-07-22)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2 は正常
  のコードで、楕円フィッティング
]]
これでは?

輪郭点の数は、
“cvFindContours”で見つけるものより多い(?)が、
これで、代替は可能?


本日はここまで。


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


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


170622

GSL Shell/OpenCV 学習:輪郭(エッジ)検出

2017-07-24 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-07-22)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2 は正常
では、“cvFitEllipse2”の正常動作を確認できた。

すると、
“cvFindContours”が問題と云うことだが、
どう足掻いても分からない。

そこで、代替手段が無いか探してみた。

エッジ検出(Sobel,Laplacian,Canny)」はどうか?

(1) 画像を準備して、
(2) Sobelオペレータを用いて,1次微分画像を求め、
(3) 画像のラプラシアン(2次微分)を求め、
(4) Cannyアルゴリズムを用いて,エッジを検出。

と云うこと。


このページにある、C言語コードを頂いた。


出来上がったコード:
---- GSL Shell コード
cv2 = require'cv2'
ffi.cdef[[
/****************************/
/* 不足分の関数宣言を記述 */
/****************************/
]]
-- (1) 二値化された画像入力 & 各種画像領域確保:
src_img = cv2.cvLoadImageM( 'sample.tif', 0 )
xx, yy = src_img.xx, src_img.yy
tmp_img = cv2.cvCreateMat( yy, xx, 5 ) ------ CV_32FC1
sobel_img = cv2.cvCreateMat( yy, xx, 0 ) ------ CV_8UC1
laplaian_img = cv2.cvCreateMat( yy, xx, 0 )
canny_img = cv2.cvCreateMat( yy, xx, 0 )

-- (2) Sobelオペレータを用いて,1次微分画像を求め、
cv2.cvSobel ( src_img, tmp_img, 1, 1, 3 )
cv2.cvConvertScaleAbs( tmp_img, sobel_img, 1, 0 )

-- (3) 画像のラプラシアン(2次微分)を求め、
cv2.cvLaplace( src_img, tmp_img, 3 )
cv2.cvConvertScaleAbs( tmp_img, laplaian_img, 1, 0 )

-- (4) Cannyアルゴリズムを用いて,エッジを検出。
cv2.cvCanny( src_img, canny_img, 50.0, 200.0, 3 );

----- 確認用に、画像出力:
cv2.cvSaveImage( 'Canny_img.tif', canny_img, 0 )
これで、
輪郭画像が得られた。


だが、これではcvFindContoursの代替にはならない。

つまり、輪郭画素の位置データが得られない?

もっと、学習が必要だ。


本日はここまで。


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


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


170618

GSL Shell/OpenCV 学習:cvFitEllipse2 は正常

2017-07-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-07-21)の記事「GSL Shell/OpenCV 学習:cvFitEllipse2」では、
“cvFindContours”と“cvFitEllipse2”の2段階の結果が変だったので、
どちらで異常となっているのか?
判別のために、“cvFitEllipse2”について確認してみた。


参考サイトとして、
ランダムな点列を包含する矩形 - OpenCV.jp」で、
“2次元座標列の生成”=cvSeqPushを学習した。


頑張って書いてみた:
---- GSL Shell コード
cv2 = require'cv2'
ffi.cdef[[
/****************************/
/* 不足分の関数宣言を記述 */
/****************************/
]]
storage = cv2.cvCreateMemStorage( 0 )

points = cv2.cvCreateSeq( 12, -- /* CV_32SC2 : CV_SEQ_ELTYPE_POINT */
56, -- /* sizeof(CvSeq) */
8, -- /* element size : int 2つ分 */
storage -- /* the container storage */
)
X=ffi.new('int32_t[8]', 35, 46, 48, 39, 26, 21, 26, 35 )
Y=ffi.new('int32_t[8]', 22, 26, 43, 51, 50, 40, 28, 23 )
P1=ffi.new('CvPoint')

for i=0,7 do
P1.x=X[i]; P1.y=Y[i]
_ = cv2.cvSeqPush( points, P1 )
end

ell = cv2.cvFitEllipse2( points )

これで得られた ellCvBox2D
で確認した“中心点”“2つの径”“角度”は正しそう。


とすると、cvFindContours処理が問題?


本日はここまで。


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


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


170616

GSL Shell/OpenCV 学習:cvFitEllipse2

2017-07-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
このところ、Python プログラムを“GSL Shell”に移植している。

その中で“楕円フィッティング”の処理コードが出てきた。

当時の“Python”版については、
一昨年8月(2015-08-18)の記事:
Python/OpenCV 学習:cv2.fitEllipse」で書いた如く、・・・

(1)cv2.findContoursによって、画像内のコンター(群)を求める。

(2)各コンター cnt に対して、cv2.fitEllipseによって、
    ・中心座標
    ・2つの径
    ・角度(X軸開始、時計回り)
   を求める。

と云う手順で、実際のコード(例)は:
#### Python コード
#### ・・・・・
#### Bimg : 二値化済画像
_, contours, _ = cv2.findContours( Bimg, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE )

for m in range( len(contours) ):
cnt = contours[m]
ellipse = cv2.fitEllipse( cnt )
# これで、中心点、2つの径、角度(時計回り) を、実数値で得る

#### ・・・・・
の様。


これに対して“GSL Shell”では、
昨年3月(2016-03-26)の記事:
GSL Shell 学習:“cv2.lua”モジュール自作」で書いた如く、
“OpenCV”のdll利用、即ち C 言語版を使う。


それから、
参考サイトとして、
opencv.jp - OpenCV 計算幾何(Computational Geometory)サンプルコード
の2番目の、
  楕円のフィッティング cvFitEllipse2
  求めた輪郭に対して,楕円をフィッティングする
の、
  “サンプルコード”
も参考にし、

頑張って書いてみた:
---- GSL Shell コード
cv2 = require'cv2'
ffi.cdef[[
/****************************/
/* 不足分の関数宣言を記述 */
/****************************/
]]
---- ・・・・・
storage = cv2.cvCreateMemStorage( 0 )
contours=ffi.new( 'CvSeq*[1]' )
r = cv2.cvFindContours( Bimg, storage, contours, 88, 3, 2 )
it=ffi.new('CvTreeNodeIterator[1]')
cv2.cvInitTreeNodeIterator( it, contours[0], 3 )

while true do
cnt = ffi.cast( 'CvSeq*', cv2.cvNextTreeNode( it ) )
if cnt == nil then break end
ell = cv2.cvFitEllipse2( cnt )
-- この ell が CvBox 型データで、中心点等々を得られる。

---- ・・・・・
と云った感じ。



ところが、
何故か?2つの径、角度 は合っている?
しかし、中心点 がデタラメ???



頭を冷やして出直しダ。


本日はここまで。


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


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


170607-12

Lua ( GSL Shell ) 学習:DLL 呼び出し

2017-07-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
このところ、Python プログラムを“GSL Shell”に移植している。

その中で“DLL 呼び出し”処理のコードが出てきた:

“MinGW”で自作した“Sub.dll”内の“Fun”関数を呼び出し実行するもの。
##### hogehoge.py ####
### inIMG 設定済み

import ctypes
import numpy as np
from PIL import Image

IN = Image.open( inIMG )
(xx, yy) = IN.size
INimg = np.array( IN.getdata(), np.uint8 ).reshape( ( yy, xx ) )

k_lib = ctypes.CDLL( 'Sub.dll' ) # dll 読み込み

iT = np.arange( 1, dtype=ctypes.c_ubyte ) # == 先ず属性を定義して、
iT = INimg # == 代入する。

################# dll 内の Fun 関数実行:
k_lib.Fun( xx, yy, iT.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)) )
##### ・・・・・
の様なコード

これ(DLL呼び出し)に関しては、
昨年4月(2016-04-20)の記事「Lua - dll 連携:コールバック処理」が
まとめ的なもの。


なので、上記“Python”コードは、
以下の様な“GSL Shell”コードに変換できる:
----- hogehoge.gsl -----
ffi.cdef[[
typedef unsigned char Byte;
int Fun( int, int, Byte* );
]]
cv2 = require'cv2'
img = cv2.cvLoadImageM( charA(inIMG), 0 )
xx, yy = img.xx, img.yy

k_lib = ffi.load( 'Sub' ) -- dll 読み込み

----------------- dll 内の Fun 関数実行:
k_lib.Fun( xx, yy, img.Byte )
----- ・・・・・
OKダ。


本日はここまで。


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


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


170531
おきてがみ/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
ブックマーク