2015年12月25日金曜日

Java: Arrays.asListメソッドの注意事項

Arrays.asListを使ってString配列からListを作るとaddする時にエラーが発生。なんでかなと調べてみますと、
  • Arrays.asList()使うと固定長のListが生成される
らしいです。固定長のリストなんか意味不明。存在意味ありませんね。では、どうしたら良いかというと、
List list = new ArrayList(Arrays.asList(str));

とすれば良いようです。

2015年12月18日金曜日

MacTypeがあるとVirtualBoxで仮想マシンが起動しない

ちょっとVirtualBoxを利用する必要があって、用意された仮想イメージを読みこませてみるも
has terminated unexpectedly during startup with exit code -1073741819 (0xc0000005)
みたいなエラーが出て起動しない事象が発生。この仮想イメージ腐ってんじゃないの?とか一瞬思ってしまいましたが、ネット調べると出てくるもんですね。MacTypeというソフトとの相性が悪いようです。そういえばそういうのインストールしてたわ。。。ということで、アンインストールして解決。

2015年12月16日水曜日

GWT: GWT-RPC用のデータクラスはIsSerializableを忘れずに

GWTのコンパイル時に
com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.
というエラーが出たら、RPCで利用するデータクラスのシリアライズに問題あるということなので、
  • IsSerializable
が実装(Implement)されているか確認しましょう。今更な内容ですが、実は、
  • ローカル環境ではOKでもGAE上では動かない
ということがあるので、要注意です。以前は、Java標準の serializable でもOKだったような気がしますが、少なくともGAEの環境では、IsSerializable が必須のようです。





2015年11月20日金曜日

C#:null 許容型

C#のプログラムをググっていると、
  • bool? とか int?
みたいな型に遭遇することがあります。これは、null 許容型クラスと言われているもので、、基礎となる値型の正しい範囲の値だけでなく、null 値も表すことができます。

2015年10月25日日曜日

AWS Lambdaのメモリ設定とパフォーマンスについてのメモ書き

AWS Lambdaをもう少し本気で使ってみようかなということで、ラボで内部利用している非公開なAPIをGAE→Lambdaにしようと企んでいます。ちょっと試してみたんですが、その使用感などメモ書きです。

メモリとコンテナのスペックは連動する
Lambdaにはメモリ設定があります。これは最初悩みどころで、どれぐらいメモリが必要なんだろ?とか思ったりしますがこれは勘違いです。メモリ設定の正体は、Lambdaコンテナのスペックに比例します。つまり、

  • メモリ量を増やすことで、実効速度が速くなる
ということです。逆に言うと、メモリをケチるとめちゃめちゃ遅いです。使い物にならないです。例えば、「amazon product advertising api」をLambdaでコールしてみたんですが、
  • メモリ128MB:→実行速度:6000〜8000ms
  • メモリ1024MB:→実行速度:600〜1000ms
となります。ウェブアプリのREST APIとして使いたいなら、6000〜8000msなんてありえない数値です。1000msでも遅いなぁって気がしますしね。
傾向として初回は起動が遅いですが、連続した2回目以降の処理は速くなります。ただ、メモリ128Mだと、何回やっても6000〜8000msをうろつきます。ちなみに、試したプログラムの最大メモリ使用量は51MBです。

コスト(料金)に注意
ただし、メモリを増やすとコストもかかってきます。これについては、下記の記事を御覧ください。
メモリ設定変更の方法に注意(Javaの場合)
管理画面でメモリを変更できるようになってますが、Javaの場合はメモリ設定だけを変更することはできないようです。jarのアップロード時にしか反映されない感じなので注意が必要です。

コストの点ではLambdaはGAEよりも若干高い気がしますが、制約もなくきちんとしたモノを作りたいのであれば選択肢として充分アリかなという印象ですね。



2015年10月23日金曜日

GWT:週番号を取得する

過去の記事にも書いているように、GWTでは
  • java.util.Calendar 
  • java.text.SimpleDateFormat
が使えません。そこで、Dateクラスに頼らざるをえないのですが、DateクラスについてもgetYear() , getMonth() などは, deprecated (非推奨) になっています。このような制約のもと、任意の日付の週番号を取得するにはどうしたらよいか、、、ということですが、その解決策を下記に載せます。CalendarUtilクラスを利用するのがポイントですね。
なお曜日番号の取得は、下記になります。

2015年10月16日金曜日

Mac: "Developer Tools Access"に変更を許可するには、パスワードを入力してください。

MacのXCodeで開発中に
「 "Developer Tools Access"に変更を許可するには、パスワードを入力してください」
というメッセージが出る場合は、権限が不足していることが原因です。
sudo dscl . append /Groups/_developer GroupMembership <ユーザ名>
とすればOKです。


2015年9月10日木曜日

C#でマルチページ形式のTiff画像を表示する方法(WPF編)

WPFでのC#でマルチページ形式のTiff画像を表示する方法は、下記のようになります。若干、Formの時よりもシンプルになりますね。


2015年8月18日火曜日

Dynamic Data DisplayのY軸を固定する

WPFでグラフ表示をするには、D3(Dynamic Data Display)を利用するのが定番ですが(おちラボでは)、DynamicゆえにY軸がダイナミックに動いてしまうのが利点であり、欠点、、、で、Y軸を固定する方法が以前はよくわからなかったのですが、最近なぜかすんなり見つかりましたので、、、gistにアップしたのを下記に上げておきます。



2015年8月17日月曜日

C#でマルチページ形式のTiff画像を表示する方法(Form編)

C#でマルチページ形式のTiff画像を表示する方法です。Formアプリケーションの場合です。


WPFで画像表示が荒いと感じた場合の設定

WPFを本格的に使いだして2年目ですが、まだまだよくわからないところがありますね。tiffファイルの表示をWPFでやろうと思ったら、やけに荒い。。。WPFってUI周りが綺麗になるんじゃないの?Formの時より汚くなってるジャーンって、いろいろ調べて解決策がわかりました。XAMLのウィンドウタグに
  • RenderOptions.BitmapScalingMode="HighQuality"
のパラメータを設定すれば、OKです。どれだけ違いがあるのかは、下記のとおりです。

【デフォルト設定】


【HighQuality設定】


おわかりいただけだだろうか?


C#にてExcelの検索機能(Find関数)を利用する

C#からExcelのシートを検索するときには、下記のようにFind関数とFindNext関数を組み合わせればOKです。注意点としては、検索の開始位置は初期値の次の位置です。例えば、下記のコードを利用した場合、指定した列の2行目から検索が始まります。



2015年7月12日日曜日

EclipseでAWS Lambda Functionプログラミング(Java)

Lambdaについて、意外とJava版の情報が少ないので書いてみました。なお、本記事は新サービスである「Amazon API Gataway」を視野に入れた書き方をしています。

Lambdaとは
簡単にいうと、AWS上で動かすことのできるスクリプトです。AWSで提供されているサービスのイベントに合わせてプログラムを実行できます。例えば、
  • DynamoDBにデータが登録された際に〜な処理をする
みたいなこともできるわけです。以前までは、Javascript(node.js相当)で記述できましたが、先月、Javaも対応になりました。さらに、、、後日記事にするつもりですが、このたび、Amazon API Gatawayというサービスも登場し、Lambdaと連携できるようになったということもあり、今、ホットな話題と言えるでしょう。

Eclipseでの手順
ざっと書くと下記の通りです。

0.事前準備
Eclipse for AWS Pluginは入れておいて下さい。で、当然ですが、AWSのアカウントはもっており、Lambdaの実行権限のあるユーザアカウントを用意しておいて下さい。また、S3も使えるようにアカウント設定しておきましょう。

1.AWS Lambda Java Project でプロジェクトを生成
プロジェクトの作成でAWSのところに、AWS Lambda Java Projectがありますので、これをクリックして作成します。


2.InputTypeの設定に注意
Lambdaは基本的にAWSのイベントを扱いますから、どのようなイベントに対応するのかをInputTypeで設定します。今回はカスタムにしました。そして、Stringを授受するファンクションとしました。


3.サンプルコードを書き換えます
すでにサンプルはできていますので、出力がnullになっているので何か文字を返すように書き換えましょう。
4.アップロードと実行
プロジェクトを右クリックすることで、AWSへアップロードや実行をするメニューが出ます。

実行を選ぶとAWSへのアップもされるようです。

5.Deployするリージョンとファンクション名を指定
Lambdaにおいてどういうファンクション名にするのか指定します。既存のものに上書きすることもできます。なお、現段階では東京リージョンは使えない模様。

6.動作環境設定
最初は細かい設定が必要です。S3も使うようなのですが、何のためかは不明。コードの実体を保存する場所かと思いましたが、そういうわけではない模様。メモリとタイムアウトの設定については、どういう値がベターなのかは今後の要調査ですね。Roleについては、今回はAPIGatewayのを前提してます。


7.実行

実行時には、入力パラメータを求められるので必ず何かを書いて下さい。どうやらファンクションとのやりとりはJSON形式で行われているらしく、何もなしで実行するとJSON Parserエラーが出ます。今回はStringを受け取るファンクションを作ったわけですから、必ずStringを渡す必要があるのです。


実行結果は出力パネルに出ます。

ちなみに、、、、、この実行というのは、本番環境での実行になりますので注意して下さい。今回のサンプルでは、文字列を受け取るようになっているので、実行時の入力には必ず何か文字を渡して下さい。

以上、ざっと書いてみましたが、これとAmazon API Gatawayを組み合わせることで、面白いことができそうです。それについては後日。


2015年6月26日金曜日

DynamoDB: グローバルセカンダリインデックスを使ってみた(DynamoDBMapper利用編)

ネタ的には古いですが、DynamoDBのグローバルセカンダリインデックスを、高レベルAPIであるDynamoDBMapperクラスから利用してみました。Javaでの記述方法について紹介します。

想定環境
この記事では下記のようなテーブルを作成したとして説明します。
  • テーブルの構造は「ハッシュキー:id、レンジキー:a、通常のアトリビュート:v」
  • このテーブルに対して、「ハッシュキー:v、レンジキー:a」というグローバルインデックスを設定(このインデックス名を「v-a-index」とする)
記述例
例を下記に示しますが、悩みどころはアノテーションの書き方でしたね。複数のアノテーションの書き方に悩みました。あとは、通常の検索方法と変わらないと思います。



2015年6月18日木曜日

Eclipse:GWTプロジェクトで 「missing required argument 'modules」と言われた場合の対処法

EclipseのGoogle Web Applicationプロジェクトにおいて、
  • missing required argument 'modules
みたいなエラーが出る時があります。これは、結論から言えば、
  • GWTを有効化しているのにGWTのモジュールが定義されてない
場合に発生します。
おちラボでは、Jettyがついてくるという手軽さを利用してGWTを使わない場合でも「Google Web Application」でプロジェクトを生成する場合があるのですが、その際によく陥るエラーですね。

解決方法としては、なんでもいいからGWT Moduleを作っておけばOKです。


2015年5月15日金曜日

VBAでWin32APIを利用したサウンドの再生と停止

VBAにはサウンドを再生するメソッドは標準で用意されていません。そこで、Win32APIを利用することになります。ここでの注意事情ですが、
  • VBAのアプリを終わらせてもサウンドは鳴り続けるので、終了処理において必ず停止させる必要がある。
  • 再生できるフォーマットはmp3、wav、mid
  • mp3については再生できない場合がある
最後のmp3についてですが、詳細はわかりませんが、OSの何かの設定の違いにより、mp3を読み込ませるとフリーズすることがあります。同一のプログラムを異なるPCで実行させた時に、片方は再生成功、片方は再生失敗(フリーズ)という状況が起こりました。そのPC自体がmp3を再生できないというわけではないので、何かの設定の問題でしょう。


2015年4月24日金曜日

C#で物理アドレス(Macアドレス)を取得する方法

C#で物理アドレス(Macアドレス)を取得する方法です。以下のサンプルは1つだけ返してます。


2015年4月23日木曜日

Byte[]に入っているRGB情報からOpenCVのIplImageに変換する方法(OpenCVSharp)

Byte配列に入っているイメージデータ(RGB情報)から、OpenCVのIplImageへ変換する方法です。今まで、WritableBitmapに変えてから変換してたんですが、これで処理が削減されます。


2015年4月17日金曜日

Gridパネルに配置された子要素を行列指定で取得する

WPFのGridパネルに配置された子要素を行列指定で取得する方法です。直接参照はできないようで、ラムダ式を使って検索をかけて該当する子要素をとってくるという形式になります。WPFでのUIコンポーネントの配置や参照方法はいまいち癖がありますね


2015年4月15日水曜日

Arduinoにホールセンサーをつなげてデジタル接続する

Ardionoにホールセンサーをつなげて、デジタルピンで受信してみました。ホールセンサーには、
  • DN6851(パナソニック社製)
を利用しました。耐用電圧の幅が広いので、直接つなげてもOKなようです(たぶん)。Arduinoとの接続には、割り込み処理をするために2番ピンに繋げてます。以下、スケッチです。



2015年3月24日火曜日

H26年度卒業生・修了生を送り出して



ちょっと日付が遅れましたが、卒業・修了おめでとうございます。先週末、昨日と、卒業式・大学院修了式があり、本年度は、学部9名、院生0名が巣立ちました。昨年度と比べるとゼミ内の人数が少なく、また研究室の方にもデスクを置いてできるだけ部屋にいるようにしたので、例年よりは指導はできたかなという気がします。また、今年は本ラボから1名学部長賞の受賞者がでました。マツイシ君おめでとうございます。

とりあえず今年も、授与式等であった各先生方の式辞の内容をネタにしながら、個人的にアレンジした贈る言葉を書いてみようかと思います。

同窓会会長の話から
(1)仕事に対して受け身でなく自らの行動で。
やらされてる感があると、よい成果物はできません。私が卒研のテーマを決めるとき、できるだけゼミ生の興味を重視していますが、それは受け身な姿勢だとよいパフォーマンスが出ないからです。そして、責任は自分にあるというプロフェッショナルな意識も大切です。
(2)ホウレンソウを忘れずに
これは、ゼミで言ってきたことですね。上述のとおり、研究室にいるようにしたので、例年に比べると学生の質問に対応することができました。これは、「ゼミ生が質問しやすい環境づくり」の一環だったわけで、そういう環境を教員が作らないといけないという気質だったという意味でもあります。なぜ、なかなか質問、相談しないのか?
・質問をするのではなく、自分でなんとかしたい
・質問して何か先生に言われるのがいや
など、、、いろいろな思いがあるでしょう。卒研は自分の問題ですが、仕事は自分だけの問題ではありません。ベストな解を見つけるために、上司や先輩にはどんどんホウレンソウしなければならない、、、その勇気を持って欲しいです。
(3)3年間は勤めよう
個人的には5年はかかると思ってますが、まずは3年ですね。1年や2年では仕事がなんたるかなどはわかるはずもないです。最近の学生は、「やりたいこと」「自分の興味」なんて言葉を意識し過ぎて(我々大人がそのように仕向けているんですが)、ヤる前から「これは自分のやりたいことじゃない」と思っちゃうんですよね。3年で適性がわかるかは不明ですし、積み重ねていくということが実績にもなります。真剣にやっていくことでできるようになるし、また楽しくなってくるはずです。

学科長の話から
(1)節目を大切にする。
年を取るたびに、「〜式」という機会はなくなってくる。。。という話。まさにそうですね。節目節目で自分を振り返るというのは、成長していく上で大切だと思います。
(2)心身ともに健康に
昨年も同様のことをおっしゃってましたが、ほんとそう思います。会社に入るといろんな価値観を持つものの集団へ入るので、ストレスというのは必ずあるでしょう。また、責任も重くなってきます。そういったストレスをうまく流せる方法、、これは個人差があると思いますが、見つけて欲しいです。

退職される中村先生の話から
学科長と同様に「身体には十分気をつけて」と言われてましたが、その他社会人としての心得として3点。
(1)失敗を恐れない(若いうちは血のなり肉となる)。同じ失敗は繰り返さない(繰り返すのはアホ)
(2)危機管理をする。想像力を欠如。仕事の危機管理。不測の事態を考えて仕事をする。
(3)目標を決めて手順を考える時に脳が活性化する。目標を決めることが、イキイキと生きる。
上記のうち(2)については、時間のマネージメントの話で私自身関心があることであり、かつ耳の痛い話です。「今日できることは明日に延ばすな」ということですね。いつも締め切り間際にしてしまう自分に反省です。ただ、小さなタスクに追われていると、大きなタスクができませんからね。これは意外と難しい問題だと思います。

大学院専攻科長の話から
(1)大学の研究成果を活かせ
企業は、意外と新しい分野には弱いらしいので、大学の研究成果をどんどん取り入れる姿勢が大切なようです。そういえば、うちのゼミの卒業生も、企業のやり方が保守的とか言ってましたね。。
(2)なんでも聞け
とりあえず1年目は許されるようです。2年目以降に初歩的なことを聞いているとダメ。。これは卒研でもそうですね。10月とか11月頃に初歩的なことを聞いてくる学生には、さすがの私も、「このタイミングでそんなこと聞くか~?」と厳しく接したと思います。ただ、2年目以降にもそのような状況になることはあるでしょう。その際、「怒られるから、、、」と、相談しないままでいるのはダメなのは言うまでもありません。上記でも書きましたが、仕事は自分だけの問題ではないのです。
(3)リーダーとしての心構え
院卒の学生は、一般的にリーダーになる機会が早いので、人の前に立つことが増えてくると思います。ただ、大学との違いは、いろんな分野、学歴、経歴、価値観の人が集まるということ。話が通じないことが多々あるので、リーダとしては平等に接してうまく力を引き出せ、、といういい話でした。

というわけで、ちょっと長くなってしまいましたが、以上、贈る言葉です。最後に重ねて、卒業・修了おめでとうございます。

2015年3月13日金曜日

byte[]に入っているRGB情報からWritableBitmapに変換する方法

byte[]に入っているピクセルのRGB情報からWriteableBitmapに変換する方法を2つ紹介します。個人的には前者がシンプルで好きですが、後者のほうが速いかもしれません(未確認)。

BitmapFrame.Create編
Marshal.Copy編


Kinect v2でBodyIndexFrameを利用して人物画像(RGB)を抜き出す

Kinect v2 にて人物画像のみを表示するという初歩的なプログラムを、v1でもやっていたので練習がてらに試してみたのだが、初歩的なところで躓いたところとか、ネットをいろいろググってみて気づいたポイントをピックアップします。

解像度の違いに注意
v1では、Color画像とDepth画像の解像度が同じ(640 x 480)でしたから、Depthで人物領域に対応するColor画像のピクセルを描画するだけで表示できました。しかし、v2 では、Color画像の解像度が(1980×1080)、Depthが(512×424)と大幅に異なるため、描画サイズを気をつけないとおかしなことになります。

抜き出しサイズは512×424
人物領域のサイズが小さいわけですから、基本的にそれにあわせる必要があります。サンプルプログラムでクロマキー処理みたいなことをしてるのがあり、それは横長に写ってるんですが、実際に人物を特定できる領域は512×424と考えたほうがいいです。もちろん、アップスケーリングな処理を自前で実装できるのであればその限りではありません。

座標合わせにDepthFrameが必要
v2では、BodyIndexFrameという人物領域のマスク情報を持った新しいフレームが用意されました。しかし、座標合わせとして、CordinateMapperクラスにBodyIndexFrameに対応するメソッドが用意されていません。
coordinateMapper.MapDepthFrameToColorSpaceメソッド
を利用する必要があります。 つまり、座標合わせにDepthFrameを呼び出しておく必要があります。この辺りのAPIがまだ中途半端ですね。

上記以外はv1と特に変わらない
ネットでいろいろサンプルを調べてみると、ポインターの利用やunsafeな処理をするなど、何やら難しげなのを見かけましたが、基本的にv1でやっていたやり方でOKです(別にポインターの利用やunsafeな処理がダメと言うわけではありません)。v2に変わって何か特別な処理をしなければいけないというわけではないので、安心してください。

下記にサンプルを一部抜粋します。BodyIndexFrameのデータを走査しながら、ColorFrameの内容をコピーしているのがポイントです。


2015年3月12日木曜日

Eclipseを起動させるJava VMのバージョンを指定する

GWTやGAE対応のアプリ開発をするときは、EclipseにGPE(Google Plugin for Eclipse)をインストールするのが普通ですが、現段階でのGPEの動作条件は
Java 7(JRE 7) かつ最新のEclipse
となっています。Javaを利用するのがEclipseだけならまだいいですが、すでにJava8がインストールされていた場合、、、わざわざ新しい方を消すというのも勧められません。共存するためには、EclipseだけJava7で動かす必要があります。で、その方法ですが、eclipse.iniファイルにおいて、
-vm
C:\Program Files\Java\jre7\bin\javaw.exe
という記述を追加すればOKです。ここの書き方の注意点は、オプション名と値を必ず2行に分けて記述することです。 また、-vmargsよりも前に書かないとダメです。


2015年3月9日月曜日

VBAにてPDF形式で保存する

VBAを利用してExcelのシートをPDF形式で保存する処理は下記のようになります。下記ではファイル保存ダイアログを呼び出してますが、別名でファイル保存を使ってファイル形式を指定させる手間が省けます。

2015年3月4日水曜日

WPFでDoEventsを実現する

WindowsプログラミングというかVisualBasicの古くからあるおまじない的なメソッドとしてDoEventsがあります。これはOS側に処理を一旦渡す処理を行ってくれるので、ループ処理で重くなったUI描画を軽くしたい(実行させたい)ときに使う常套手段でした。昔のWindowsは擬似マルチタスクでしたからこのような処理が有効でしたが、現在はマルチスレッド化で対応するのが奨励されています。
ただ、マルチスレッド化するまでもない処理もあるわけで、.Net Frameworkに移行してからも「Application.DoEvents」というメソッドが残っており利用されてきましたが、WPFのフレームワークではそれがなくなってしまいました。
で、その代替手段が下記のコードになります。DispacherFrameというWPFのUIキューを呼び出してそれをInvokerにより実行させることで、UIの描画処理を行わせてます。



2015年3月1日日曜日

Arduino:Bluetooth Shield(SLD63030P)をSlaveモードで動かす


前記事にてBluetooth4.0BLEが接続できないという問題に遭遇したので、それなら古い Bluetoothで、、、ということで、旧式のBluetooth Shield(SLD63030P)を入手して接続に成功しました。成功しましたといっても、それまでにいろいろ四苦八苦しており、とりあえず現状できていることは
  • ノートPC側から接続(シリアルポートとして)
  • ArduinoからデータをBluetooth経由でノートPCに送信
  • プログラム側は前記事のようにシリアルとして認識
という感じです。で、正直、Bluetoothのことが全くわかっておらず、電源入れたらすぐに繋がるんだろう、、とか思ってたのがそもそもの間違いでした。Arudino側のスケッチの書き方次第で接続が失敗したりするようで、接続できなかった場合の問題の切り分けに注意が必要ですね。もしかするとBluetooth4.0が繋がらないのもそういう問題かもしれません。
下記は、Arduino側のスケッチです。公式のサンプルの一部を抜粋してますが、アナログポートの出力をそのまま送ってます。



2015年2月22日日曜日

Arduino:Bluetooth 4.0 Low Energy BLEシールドを入手しましたが、、、


表題のとおり、ArduinoにBluetoothシールドを入手しましたが、いろいろトラブっている最中なので作業録です。

対応するArduino IDEは1.0.6まで
まず、これにハマりました。ライブラリを追加してコンパイルすると、
C:\Program Files (x86)\Arduino\libraries\RBL_nRF8001\RBL_nRF8001.cpp:25:23: error: setup_msgs causes a section type conflict with __c
みたいなエラーがでます。現在、Arduino IDEは1.6が最新ですが、コレじゃダメ。なんと、1.06までしか対応してないようです(公式の回答をネットで目にしました)。で、1.06をダウンロードしてコンパイルしたら見事成功。iPhoneアプリでも接続を確認しました。

Bluetooth 4.0 Low Energy ってのが曲者
Low Energy...最新の低電力版ってことだね。。と安易に考えておりましたが、これは対応機種が限定されるようです。AndroidやiOSでも最新版が必要なのはわかるんですが、Windowsでも8.1以上が必要らしいです。手元にWindows7のノートPCがあって、検索にひっかかるけどコネクションできない、、、というよくわからない状況で、プログラムがおかしいのか、デバイスが4.0対応じゃないのか、、と思ったりしたのですが、Win8.1以上とは、、、とりあえずは旧式のBluetoothボードにした方がいいかもしれません。


2015年2月21日土曜日

Arduino:PCからの入力に合わせてLEDをON・OFFする 〜USB接続編〜




新規立ち上げの研究テーマでArduinoを利用することになったので、C#でUSBを通してArduinoを制御するプログラムを書いてみました。具体的には、USBで接続されたArduino本体のLEDを、PC側のクライアントソフトでON・OFFするというものです。
Arduino側のプログラム(スケッチというらしい)は下記のようになります。C#のプログラムは書くまでもない(シリアルポートに対してWriteするだけでよい)ので省略します。


C#にてシリアルポートからの通信を受信する

C#でシリアルポートからの通信結果を受信するサンプルです。簡単ですね。


2015年2月19日木曜日

Kinect v2にてMultiSourceFrameを利用する

Kinectプログラミングでは、v1ではAllFrameReadyイベントを用いて各種フレームを一括で処理するのが便利ですが、v2でも同様のイベントがあります。が、名前が変わっており、処理の仕方やメソッド名も違うので注意が必要です。具体的には以下のようになります。


2015年2月18日水曜日

NuGetを利用したOpenCVSharpのインストール

※OpenCVSharp3用に少し記事を書き換えました(2016/09/30)

OpenCVSharp3のインストールは、NuGetを利用するのが一番です。そのほうが、実行マシンでのOpenCVのバージョンの変化に対応しやすいです。下記はその手順です。なお、環境は、Visual Studio 2013を想定しています。

1.Nugetを利用したインストール

(1)NuGetマネージャーの起動
プロジェクトを右クリックして「NuGetパッケージの管理」を選択してください。


(2)OpenCVSharp3の検索とインストール

左のサイドバーからオンライン → すべて を選択したあと、右上の検索ウィンドウに「OpenCVSharp3」と入力してください(フルに歌入力しないと検索に引っかからないです)。“without DLLs”というのは、OpenCV本体のDLLを含まないという意味ですが、OpenCVSharp3はOpenCV本体とのバージョンの差異で動かなくなりますので、DLLを含んだもの(without DLLsと書いていないやつ)を選んで下さい。



2.サンプルを試す
下記のソースコードが実行できればOKです。testの画像は別途、どこかから用意してください。

注意事項
プロジェクトのプロパティで下記の設定を確認してください。
  • 対象のフレームワークを .NET Framework4にする
  • 64bit版のOpenCVを利用する場合は、プラットフォームターゲットを64bitにする


2015年2月17日火曜日

Kinect v2にて骨格情報を取ってくる

Kinect v2にて骨格情報を取ってくる方法です。クラス名に変更がありますが、やり方はほぼ同じですね。


Kinect v2にて人物領域を取得する

Kinect v2ではv1よりフレームワークが変わっているところが所々あります。今回の話は、BodyFrame(人物領域)の取得について。v2からは人物領域だけを格納するBodyFrameというのが新たに用意されました。v1ではDepthFrameからその情報の一部として取得していました。人物だけを表示するには、今までは自前のプログラミングが必要でしたが、その手間がなくなりますね。


2015年2月16日月曜日

kinect v2セットアップ ~PCが対応しているか確認しよう~

ずいぶんネタが古くなりましたがKinect v2のセットアップについてです。製品版がでてずいぶん時間も経ったので、インストールも楽になったかな~とかよくわからん期待をしたのですが甘かったです。。。かなり手間取りました。以下、注意事項です。

マシンの準備
下記のスペックのPCが必要です。
  • Windows8.1以上
  • CPU:2.66 GHz 以上のデュアルコア、64 ビット (x64) プロセッサ
  • GPU:DirectX 11 対応グラフィックス カード
  • 接続ポート:USB 3.0
  • メモリ:2GB RAM
メモリとCPUのスペックはα版と比べると下がりました。しかし、問題は残る2つ。USB3.0と:DirectX 11 対応グラフィックス カードが厄介でした。

マシンスペックの確認方法
USB3.0というのは、USBの口が青色になっていると思います。これで確認できます。しかし、DirectX 11 対応グラフィックス カードというのがわからない。。。これを確認するには、

  1. Kinect v2 SDKをインストール
  2. SDK Browser2.0を起動(SDKに同梱されインストールされてます)
  3. Kinect Configuration Verifier を起動する
というように、まずはSDKをインストールし、Kinect Configuration Verifier で確認するのが一番です。


Browserの最初のメニューにあります。


チェックがすべて入っていればOK(KinectをつなげてないのでConnectedは×でOK)。
ここでよく、USBとかGraphic Processorが×になるんですよね~。そうなったら残念。ボードを追加購入しましょう。

P.S
なお、上記がクリアしていても、Face系のプログラムが動かない事象が起きました。その際は、Graphic カードのドライバを最新にして解決しました。


2015年2月11日水曜日

Kinect v2にてRGBカメラを表示する

先行して入手したものの、全く手をつけていなかったKinect v2での開発をはじめました。とりあえずRGBカメラの表示です。噂通り、書き方が変わっているとことが多いですね。ただ、最終的にbyte[]に格納してWriteablebitmapにすればいいというのは従来通りなので、全面修正にはならないでしょう。なお、RGBカメラを表示後、数秒後にプログラムが落ちる事象が置きましたが、win8.1のバグのようです。とりあえず、ガーベージコレクションを強制実行することで回避できます。



2015年2月2日月曜日

OpenCVSharpにてテンプレートマッチングを行う

OpenCVSharpにて、テンプレートマッチングを行う方法です。Mat形式に対応しています。



2015年1月31日土曜日

'OpenCvSharp.OpenCVException' の初回例外が OpenCvSharp.dll で発生しました。

OpenCVSharpを使っていて

  • 'OpenCvSharp.OpenCVException' の初回例外が OpenCvSharp.dll で発生しました。

というエラーが発生した時は、このままだと何のことだかわかりません。try catchでエラーを拾いましょう(当然ですが)。ErrMsgを見ることで、OpenCVのライブラリレベルのエラー詳細がわかります。

2015年1月22日木曜日

OpenCVSharpでクリックイベントを設定する(Mat対応)

以前、OpenCVSharpにてクリックメソッドの設定の仕方に手間取り記事を書きましたが、前回のはIplImageの表示はできますがMatには対応してません。Mat対応のコードは下記のようになります。Windowのクラスが違うだけです。