2010年10月7日木曜日

空手とビデオ判定

習ってる空手はかなり変わっている空手だ。カウンター攻撃をもっとも重要だと考える。大会でも通常の攻撃よりもカウンターの攻撃のほうを高く評価する。

でもその判定はむずかしい。体が向かってくるところで入れたカウンターは判定もむずかしくない。 しかし腰が動き始めた段階で食らうようなカウンターはなかなかわからない。

(30fpsの動画でも2、3コマのレベルだ)

タイミングはいいけど突きの威力が低いような場合とか。

 

そんなこんなで

外国人の選手の参加も増えて、今は自分が試合にでたときとは違いカウンターが別のポイントではなくなった。

 

 

けどカウンターは重要なのでそれを評価しなくちゃいけないって

ことでビデオ判定を入れるってことになった。

 

実験的に先月簡単な試合で導入しているのを見たが、とにかく試合が止まって流れを切って話にならない。テニスだとチャレンジとかで限定している。

  1. カウンター臭いのを発見
  2. 試合を止める
  3. ビデオで該当箇所を探す
  4. 判定

こんな流れだ。実験をみると試合時間よりあきらかに判定時間のほうが長い。てことでopencv + webcam で試合を止めた瞬間に該当箇所をすぐ確認できるものを

つくろうと制作中。最終的にはカウンター攻撃なのかとかも自動判定とかがまったく試合とめなくていいんだろうけど、それは12月じゃ無理だ。w

 

まぁ、サッカーとかでもそうだけど自分の身にふりかかってくると難しいなぁ。サッカーでは判定ミスもサッカーの一部だという考えもあるけど、

そんなものはうちの空手にはないしw

 

ffi-opencv を作って遊んでみた。

opencv を使わないといけない事象がでてきたのでいじり始めた。

ruby/OpenCV を使おうとしたら、どうやら放置プレイぽいしmatz ruby-1.8.x でしか動かないぽい。

とりあえず ruby/dl でちこちこ書いてたらなんかdouble がちゃんと扱えない風。どうやら設計的な問題らしい。

ffiを使うといんじゃね? と ay先生 に言われてちょっと調べてみると ruby-ffi なるものがあるようだ。

dl とちょっと違うのでとまどいつつ使ってみると。なかなかいい。

require "ffi"

module OpenCV

  module Highgui

      extend FFI::Library

      ffi_lib "/opt/local/lib/libhighgui.dylib"

      attach_function :cvNamedWindow,[:string, :int], :int

      attach_function :cvShowImage, [:string,:pointer], :void

      attach_function :cvQueryFrame, [:pointer],:pointer

      attach_function :cvCreateCameraCapture,[:int],:pointer

      attach_function :cvReleaseCapture,  [:pointer], :void

end

こんな感じ ffi_lib でshared object 指定して, attach_function , 関数, [引数],返り値

とかすればいい。

include OpenCV

include OpenCV::Highgui

window = cvNamedWindow("hoge")

cap = cvCareteCameraCapture(0)

frame = cvQueryFrame(cap)

cvShowImage("hoge",frame)

key = cvWaitKey(0)

でcap を最後に開放しないといかんのだけど

CVAPI(void) cvReleaseCapture( CvCapture** capture );

ううむポインタのポインタってどうすんの?dl だと .ref で終わりだがないんだなぁとおもったら

cap_p = FFI::MemoryPointer.new :pointer

cap_p.put_pointer(0,cap)

cvReleaseCapture(cap_p)

とかするといいらしい。

関数の引数が構造体だったりするときは

    class CvSize < FFI::Struct

      layout :width, :int,

             :height, :int

    end

   attach_function :cvCreateImage, [CvSize.by_value,:int,:int],:pointer
CvSize.by_value なのはそのままだとポインタ渡しだから明示しないといけない。なんかドキュメントにぜんぜん書いてなくてだいぶなやんだ> by_value
手で色々追加したあとに
ffi-swig-generator なるものを発見 swig のinterface ファイルを書いておくと ruby-ffi なscript を生成してくれるらしい...先に気がつけ...
そしてmacruby では attach_function しかsupport していないし
macports のopencv は複数のstream を別々のwindow で表示させようとすると同じものが映るとかいうバグ(head だと治ってた)..
ううむ。
とりあえず ffi-opencv は http://github.com/kazu/ffi-opencv においておきました。ちょびっとしか関数ないけど..

blog エディタ使用実験

blog エデイタとやらをつかってみる。

Qumana

しかしいきなり google

日本語入力でpreedit がみえんとかfuck。即削除

 

ScribeFire

WYSIWYGがいろいろ足りないような...

 

あとはecto とかいうのがあるのだっけか...

実験


blog エデイタとやらをつかってみる。



2010年9月27日月曜日

まただいぶ真剣に空手をやろう。そして他のスポーツとの相互浸透

基本はたらたらとずっとやっていたけど、その隙にだいぶ体を肥えてなまりギミになっている。また真剣に(でももう年で体も壊しそうなので
そこは加減しつつ)最大の効率を考えながらやることにした。

フォームやそのために必要な筋力だってありとあらゆるスポーツから取り入れるのだ。

  • やり投げ
  • 野球のピッチャー
  • テニスのフォアハンド/サーブ/スマッシュ

等々。

そうやって威力をあげようとおもって上段逆突きをやっていたら、自分の逆突きの威力がないの股関節が原因なのは
ずっとわかっていたのだけれど、すこしコツをつかんだようだ。テニスを少しやってそれでいろいろ自分なりに分析していたら
気がついた。テニスと空手が相互浸透したってことかな。

その延長で肩までのちからの伝達を追求していたら
突然逆突きがさらにうなりだした。(俺の感触で)

ハムストリングに尻を載せて加速させるイメージをさらにその上を乗せようとしたらおきた。

確認しながら何回かやってみると、バドミントンのクリアの背中の使い方だった。

空手ではバドミントンのフットワークは非常にやくにたってたが、他はほぼすべて使えないと捨てていた。
しかし突然やくにたった。

人間の体ってすげえなとおもいつつ。

学生時代になぜ気がつかない俺!


とすこしせつなくなった。

2010年5月4日火曜日

Logitech Qcam Orbit のosx でのtilt/pan サポート

osx がUVC をsupport して無事使えていたのだけど、せっかくのtilt/pan がまったく使えなかった。

uvc のコントロールコマンドをほとんどサポートしてないということで、UVC Camera Control をつくった人がいた。

Qcam Orbit のTilt/Pan はUVC のTilt/Pan をつかってない。

UVCにはTilt/Pan が定義されているのだけど、Orbit ではこれを定義していない。
linux のdriver やlibwebcam を見るとUVC Extension Unit Control でやるらしい。
これでUVC CameraControl をいじらないとダメぽい。


#define UVC_LOGITECH_MOTOR 0x9

#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
#define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
#define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03

とか追加して libwebcam のlogitech.xml とかを見ると

 entity:UVC_GUID_LOGITECH_MOTOR_CONTROL
 selector:XU_MOTORCONTROL_PANTILT_RELATIVE
index:0
size:4
Allows the control of pan/tilt motor movements for camera models that support mechanical pan/tilt.
Bits 0 to 15 control pan, bits 16 to 31 control tilt.
The unit of the pan/tilt values is 1/64th of a degree and the resolution is 1 degree.


とかあるので、それにあわせて


.pantiltrel = {
.unit = UVC_LOGITECH_MOTOR,
.selector = LXU_MOTOR_PANTILT_RELATIVE_CONTROL,
.size = 4,
},
.pantilt_reset = {
.unit = UVC_LOGITECH_MOTOR,
.selector = LXU_MOTOR_PANTILT_RESET_CONTROL,
.size = 1,
},


本来はunit はuint id でvender UUID のGUID で指定してそれで該当するコントローラを取得しないといけないぽいけど
とりあえずあと回し。

- (BOOL)setData2:(void *)value withLength:(int)length forSelector:(int)selector at:(int)unitId
{
IOUSBDevRequest controlRequest;
NSLog(@"unitID %d", unitId);
controlRequest.bmRequestType = USBmakebmRequestType( kUSBOut, kUSBClass, kUSBInterface );
controlRequest.bRequest = UVC_SET_CUR;
controlRequest.wValue = ( selector <<>
controlRequest.wIndex = ( unitId <<8>
controlRequest.wLength = length;
controlRequest.wLenDone = 0;
controlRequest.pData = value;
return [self sendControlRequest:controlRequest];
}


USB Control Request を送るのに4バイトまでしか対応してなさげだったので追加

こんな感じで追加した。UVCCameraControl に追加したmethod は

- (BOOL)setPanTilt:(BOOL)reset withPan:(int)pan withTilt:(int)tilt;
- (BOOL)resetTiltPan:(BOOL)enabled;
いちよ変更したものは http://github.com/kazu/UVCCameraControl においておきました。
いちよruby のscript がついてるのでそれから操作できます。

ustream とかでdirect で使うとdevice interface がlock されちゃうのでCamTwist の2.1 とかで
試すとstreaming したまま動かすのができます。

注意: pan/tilt reset がまだちょっとおかしい。reset をかけた際にそっから移動しようとしてバキバキ音がして物理的に壊れそう。

いちよUVCCameraControl についてたユーティリティもちょっとだけいじった。




zenback