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

OpenCV 学習:画像サイズ変更

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

その中で“画像の拡大(2次元補間)”処理のコードが出てきた。

これに関しては、
昨年6月(2016-06-04)の記事「GSL Shell:2次元補間(interp2d)」で、
  ・・・・・
  ・・・・・
  画像データに限定すると、“OpenCV”ではどうか?
  「cvResize」でしょうか?
  でも、いろいろ試してみたが結果がオカシイ???
  ・・・・・
  ・・・・・
と書いていた。


ここで、
改めて“OpenCV 2.4.13.2 documentation”を見てみた:
void cvResize( ・・・ )
void cvResize( const CvArr* src, CvArr* dst, int interpolation=~ )
  src - 入力Image
  dst - 出力Image
  interpolation -
    INTER_NEAREST - ・・・
    INTER_LINEAR - ・・・
    INTER_CUBIC - ・・・
    INTER_AREA - ・・・
    INTER_LANCZOS4 - ・・・
とある。


そこで、念のためテストしてみた:
----- test_Resize.gsl -----
local cv2 = require'cv2'
-- 自作 'cv2.lua' に不足している宣言を追加
ffi.cdef[[
void cvResize( const CvArr* src, CvArr* dst, int interpolation );
]]
------------------------------------------
---------- GrayScale画像
-- 元データ
img=cv2.cvLoadImageM( 'Gray.tif', 0 )
xx, yy = img.xx, img.yy

-- 拡大データ領域
m = cv2.cvCreateMat( 2*yy, 2*xx, 0 ) -- 0:CV_8UC1

cv2.cvResize( img, m, 1 ) -- 1:INTER_LINEAR
cv2.cvSaveImage( 'outGray.tif', m, 0 )

------------------------------------------
---------- カラー画像
-- 元データ
img=cv2.cvLoadImageM( 'Color.png', 1 )
xx, yy = img.xx, img.yy

-- 拡大データ領域
m = cv2.cvCreateMat( 2*yy, 2*xx, 16 ) -- 16:CV_8UC3

cv2.cvResize( img, m, 1 ) -- 1:INTER_LINEAR
cv2.cvSaveImage( 'outColor.png', m, 0 )
これで出来ました。


過去記事ではなぜ出来なかったのかナ???


本日はここまで。


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


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


170602

gnuplot 学習:極座標モード

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

その中で“ローズダイアグラム”描画処理があった。

これは、
過去記事:「Python 学習:polar_bar_chart
そのもの?

過去記事:「ローズダイアグラム って何?」では、
  ・・・・・
  ・・・・・
  「Gnuplot」では?
  「レーダーチャート」のみ?
  ・・・・・
  ・・・・・
と書いていたが、・・・・・


改めて「gnuplot 極座標」で検索してみた

いろいろ見つかるが、・・・・・

ふと、
折線で、高さ?に相当する r をゼロにしたりして行たらどうなる?
そして、filledc パラメータを指定する。

これで出来るのではないか?

と云うことで、試してみた:
##### sample_polar.plt #####
$D << EOD
4.99 0
5 20 # 10-5+5
15 20
15.01 0
114.99 0
115 30 #120-5+5
125 30
125.01 0
244.99 0
245 30 #250-5+5
255 30
255.01 0
EOD
set terminal wxt size 400, 400
unset key
set polar
set angles degrees # 0度は右方向で、反時計回り
set grid polar
unset xtics
unset ytics

set xrange [-31.5:31.5]
set yrange [-31.5:31.5]
unset border
plot $D w filledc lc rgb "red"
これで、
3方向に伸びた“ローズダイアグラム”と云える?


これで、行こう。


本日はここまで。


Lua / gnuplot 学習は続く。


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


170605

afxLua / winman 実用的な? 応用例

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

その中で“WinPython 標準”の
win32apiwin32com を使った処理コードが出てきた:
##### hogehoge.py
import win32api
import win32com.client
import string
###### ・・・・・
ww = raw_input( '6 int. number(xx,yy,x0,y0,d,th2)+[Ret]:' )
w = ww.translate( string.maketrans( ',', ' ' ) )
v = w.split()
xx = int(v[0]); yy = int(v[1]); ###### ・・・・・

shell = win32com.client.Dispatch( 'WScript.Shell' )
shell.Run( 'notepad' )
win32api.Sleep(100)

###### ・・・・・
shell.SendKeys( '%d %d %d' % ( x, y, th2) )
shell.SendKeys( '{ENTER}' )
といった様なコード。

これなら、
過去記事:「afxLua / winman (続)
と大差ない?

変換作業を行ってみた:
----- use_afxLua_winman.gsl -----
require'pl'
require'winman'

print( '6 int. number(xx,yy,x0,y0,d,th2):' )
ww = io.read()
w = string.gsub( ww, ',', ' ' )
v = stringx.split(w)
xx = v[1]+0; yy = v[2]+0 ----- ・・・・・

os.execute( 'start notepad' )
-- winman.sleep( 100 ) -- int_msec
b = winman.find{matchtitle=".+メモ帳$", wait=4000}

------ ・・・・・
winman.Send( string.format('%d %d %d' , x, y, th2 ) )
winman.Send( '{ENTER}' )
でどうかな?


良さそうダ。


本日はここまで。


GSL Shell / afxLua ライブラリの学習は続く。


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


170601,05

OpenCV 学習:画像群から .avi ファイル作成

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

その中で“画像群から .avi ファイル作成”処理コードが出てきた:
##### hogehoge.py
###### INdir, OTfile, fps は、設定済。

import cv2

os.chdir(INdir); flist=os.listdir('.');
img = cv2.imread( flist[0] ); os.chdir('..')
yy, xx, layers = img.shape

codec = 'CVID'
fourcc = cv2.VideoWriter_fourcc( *codec )
video = cv2.VideoWriter( OTfile, fourcc, fps, ( xx, yy ) )

os.chdir( INdir )
for IN in flist:
img = cv2.imread( IN )
video.write( img )
os.chdir( '..' )

video.release()
#####
の様なコード。つまり、
Python/OpenCV 学習:OpenCV 3.0 gold 導入”で書いた
“OpenCV”を使っている。

これなら、
“GSL Shell”に移植するのはほぼ“右から左”で出来る?

ここで、
気になるのは、
   codec  = 'CVID'
fourcc = cv2.VideoWriter_fourcc( *codec )
のところ。


Web検索で“参考サイト”を探してみた。

“OpenCV 3.0.0-dev documentation”の
Creating a video with OpenCV

“可変ブログ”の
OpenCVのVideoWriterを使って画像から動画を作る。

“tessy.org”の
ビデオの出力 - AkiWiki


これらを参考に、学習した。

以下のマクロが定義されている様ダ。
CV_FOURCC(c1,c2,c3,c4)   (((c1)&255) + (((c2)&255)<<8) + (((c3)&255)<<16) + (((c4)&255)<<24))
と云うことは、
codec  = 'CVID'
fourcc = ffi.cast( 'int32_t*', codec ) [0]
とすればイイ?


それで、頑張って移植してみた:
----- make_avi.gsl -----
------ INdir, OTfile, fps は、設定済。
--------------------------------------
cv2 = require'cv2'
ffi.cdef[[
typedef struct CvSize{ int xx; int yy; } CvSize;
void* cvCreateVideoWriter( const char* fname, int fourcc, double fps, CvSize frame_size, int is_color );
int cvWriteFrame( void* writer, const IplImage* image );
void cvReleaseVideoWriter( void** writer );
]] ----- 上記の 'void*' は、正しくは 'CvVideoWriter*'

codec = 'CVID'
fourcc = ffi.cast( 'int32_t*', codec ) [0]

require'pl'
flist=dir.getfiles( INDir )
img = cv2.cvLoadImageM( flist[1], 1 ) --- 'BGR' で読み込み
SZ=ffi.new( 'CvSize', img.xx, img.yy )

video = cv2.cvCreateVideoWriter( OTfile, fourcc, fps, SZ, 1 )

for z=1,#flist do
img = cv2.cvLoadImage( flist[z], 1 ) -- IplImage のみ可(CvMat 不可)?
cv2.cvWriteFrame( video, img )
end

cv2.cvReleaseVideoWriter( ffi.new( 'void*[1]', video ) )
で行けました。


本日はここまで。


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


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


170605

OpenCV 学習:画像・回転変換処理

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

その中で、画像を回転する処理コードが出てきた:
##### hogehoge.py
r = 10 # 回転角度 ( 反時計回りの“度”。実数可 )
Cp='C:/_kami_/convert'; vpb='-virtual-pixel black'; rr=str(0-r)

inF=INdir+'/'+fnm; otF=OTdir+'/'+fnm
subprocess.call('%s %s -distort SRT %s %s %s' % (Cp, vpb, rr, inF, otF))
#####
つまり、
“Python”では“ImageMagick:画像形式変換ツール”の convert を使って、
convert -virtual-pixel black -distort SRT -10 <入力画像> <出力画像>
の様にして(例えば)10度回転変換を実行。
ここで、回転角度は(convertでは)時計回りなので、
反時計回りで実行したいので、負数にしている。

これをGSL Shellで行うには、
やはり「画像処理は、OpenCV で」でしょうか。


「OPenCV 画像 回転」で検索して、
OpenCVの画像処理
を見つけた。

このページの“4.画像回転”のコードを頂いた。


結果:
----- Rot.gsl -----
cv2 = require'cv2'
ffi.cdef[[
typedef struct CvPoint2D32f{ float x; float y; } CvPoint2D32f;
void cvResize( const CvArr* src, CvArr* dst, int interpolation );
CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* map_matrix );
void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
]]----- 自作 'cv2.lua' に不足している宣言を追加

Pxy32F=ffi.new('CvPoint2D32f')
function setPxy32F(x,y) Pxy32F.x=x Pxy32F.y=y end

-- // 入力画像読み込み
img = cv2.cvLoadImageM( 'sample.png', 1 )
xx, yy = img.xx, img.yy

-- // 出力用領域
img2 = cv2.cvCreateMat( yy, xx, 16 ) -- CV_8UC3

-- // 回転中心
setPxy32F( xx/2, yy/2 )

-- // 回転角度(degree) ( 正:右回転 / 負:左回転 )
angle_deg = -30.0

-- // スケーリング係数
scale = 1

-- // 回転行列領域確保
rotationMat = cv2.cvCreateMat( 2, 3, 5 ) -- CV_32FC1

-- // 回転行列設定
cv2.cv2DRotationMatrix( Pxy32F, angle_deg, scale, rotationMat )

-- // 回転実行
cv2.cvWarpAffine( img, img2, rotationMat )

-- // 画像出力
cv2.cvSaveImage( 'Rot_img.png', img2, 0 )
で行けました。


本日はここまで。


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


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


170603

OpenCV 学習:GrayScale/'RGB' 変換

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

その中で、こんなコードが出てきた:
from  PIL import Image
img = Image.open( inp_tif )
img = img.convert( 'RGB' )
IMG = img.load()
##### IMG 加工
img.save( out_png )
これを作った頃は、“Pillow”だった?

それで、
この処理を“GSL Shell”で書くなら、やはり“OpenCV”ですネ:
cv2 = require'cv2'
img = cv2.cvLoadImageM( inp_tif, 1 ) -- 'BGR' で読み込む
----- img 加工
cv2.cvSaveImage( out_png, img, 0 )
の様に、読み込み時に変換する?

cvLoadImageM関数の第2引数:
 -1 ・・・ ありのままに読み込む
 0 ・・・ GrayScale で読み込む
 1 ・・・ 'BRG'カラーで読み込む


ところが今回、今更ながら“OpenCV”では、
読み込み済み画像の色数変換が出来ることを知った。
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
なる関数が使えた。

それで、第3引数の“code”値については、
CV_BGR2BGRA =0
CV_RGB2RGBA = CV_BGR2BGRA
CV_BGRA2BGR = 1
CV_RGBA2RGB = CV_BGRA2BGR
CV_BGR2RGBA = 2
CV_RGB2BGRA = CV_BGR2RGBA
CV_RGBA2BGR = 3
CV_BGRA2RGB = CV_RGBA2BGR
CV_BGR2RGB = 4
CV_RGB2BGR = CV_BGR2RGB
CV_BGRA2RGBA = 5
CV_RGBA2BGRA = CV_BGRA2RGBA
CV_BGR2GRAY = 6 // カラーから白黒
CV_RGB2GRAY = 7
CV_GRAY2BGR = 8 // 白黒からカラー
CV_GRAY2RGB = CV_GRAY2BGR,
CV_GRAY2BGRA = 9
CV_GRAY2RGBA = CV_GRAY2BGRA
CV_BGRA2GRAY = 10
CV_RGBA2GRAY = 11
・・・・・
ですね。


そうすると、・・・・・
cv2 = require'cv2'
ffi.cdef[[
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
]]
img = cv2.cvLoadImageM( inp_tif, 0 ) -- 白黒 で読み込む
-----
-----
img2 = cv2.cvCreateMat( img.yy, img.xx, 16 ) -- カラー画像領域確保 ( CV_8UC3 )
cv2.cvCvtColor( img, img2, 8 ) -- 色数変換
----- img2 加工
cv2.cvSaveImage( out_png, img2, 0 )
の様になる。


本日はここまで。


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


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


170530,0603

Lua ( GSL Shell ) / Penlight 学習:range 関数

2017-07-07 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
Python プログラムの“GSL Shell”への移植を行っている。
その作業で、“range 関数”が出てきた。

“Python”で云うところの“range”関数に関しては、
昨年2月(2016-02-09)の記事「GSL Shell 学習:fun 関数」で書いている。
  ・・・・・
  ・・・・・
local fun = require'fun'
for _, a in fun.range(3) do print(a) end
  ・・・・・
  ・・・・・

だら、このところPenlightが気に入っていて、
調べてみたら、
案の定あった。

Pythonで、
for k in range( n ) :   # ~ #
### とか、
for k in range( i, j ) : # ~ #
と記述する処は、

Lua ( GSL Shell )では、
require'pl'   ----- これ前提で、
for k in seq.range( 0, n-1 ) do -- ~ -- end
--- とか、
for k in seq.range( i, j-1 ) do -- ~ -- end
となる。


更なるPenlight学習で、・・・
plc = require'pl.comprehension'.new()
T = plc('x for x=1,10')()
とすることで、
配列 T は、 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
となる。
なお、
plc = require'pl.comprehension'.new()
T = plc'x for x=1,10'()
と括弧は省略出来る。

更に更に、GSL Shellの“matrix”ベクトルも作れる:
plc = require'pl.comprehension'.new()
T = matrix.vec( plc'x for x=1,10'() )
と云った具合。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


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



おきてがみ

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