CapSense
・CY8C21534-24PVXI(28pin)
・CY8C21334-24PVXI(20pin)
chip1で買うのが良さそう。21334の方が少量から値引率が高い。
digikeyでは少量から注文できるのはCY8C21434だけで、QFNパッケージしかない。
USB
・CY8C24794-24LFXI(56pin)
・CY8C24894-24LFXI(56pin)
HID準拠のUSBデバイスが作れて、キーボード・ジョイスティック・マウスなどとして認識させれる。USBシリアルチップとしても動作可能。MLFパッケージしかない。
24794はchip1では在庫が少ないのか、一度に1個しか買えない。24894はデータシート見る限り上位互換なのでこっちにしよう。
今PSoC Designer開いてみたら、24894でCapSense(CSD/CSRともに)使えるみたいだ
MLFは裏返してイソギンチャク配線できなくもないが、基盤を設計して発注した方が良さそうだ
共立エレショップのblogで紹介されていたロボット用のカメラ(WR-UC32)を買った。
この商品、なぜかシリコンハウスblog通販ではリストに載っていないので、共立エレショップの左側の検索ボックスから「WR-UC32」と型番で検索すると見つかる。
ロボット用らしいが、USBビデオクラスとしてパソコンからも使える。
解像度は640×480で、画質は普通。オートフォーカスは付いていない。
箱には「Windows XP/Vista対応」とあるがMacbook(Leopard)、Dell inspiron mini(Ubuntu)でもドライバインストールなしにいきなり認識した。もちろんMacbook(Windows XP)でも動作した。
Macbook上のWindowsでVMWarePlayerで動かしているUbuntuではデバイスとして認識しようとするとVMWareごと強制終了して駄目だった。
薄くて小さい。デバイスを使うと青色LEDが点灯する。
ネジ止めする穴が複数空いていて使いやすそう
付属のケーブル。
面倒くさいことに、ロボット用のパーツなので(?)サーボモータを制御するためのシリアルケーブルと一本にまとめられている
基盤側のUSBケーブルとのコネクタは、秋葉原に行けば普通に買える形状の4ピンのものなので自分でケーブル作った方が扱いやすそう
OpenCVで、画像の特定領域のHSV(HSB)を増やしたり減らしたりするツール「colortrans」を作った。
コマンドラインからファイル名を渡すと実行できるタイプ。
こんなコマンドでお手軽一発生成できます
colortrans ../data/shokai.jpg result.jpg -30 50 -10 ../data/shokai-mask.bmp
できた画像
■ダウンロード
mercurialリポジトリをbitbucketに置いた。
shokai / twitter face color change / overview — bitbucket.org
Ubuntu8.04でビルドしたバイナリもコミットしておいた。OpenCVなので他環境でも同じコードをコンパイルしなおせば実行できるはず。
twitterでriywoさんがアイコンに自分の最近の発言ワードを出しているのを見て、じゃあ自分の顔色を使って何か表現できないかという事で作り始めた。なのでリポジトリ名が twitter face color change になっている
でもまだ何と色を連動させればいいのか決めかねているので、アップローダはまだ書いてない。たぶんtwitterと関係のないリアルワールドの情報の方が面白い。俺の脈拍とかクリエイティブビートとか・・・
■顔だけ色を変える方法
画像認識ではできそうにないので、手動でマスクを作る
イラレでもPhotoshopでもいい。
元画像と同じサイズで、顔部分だけ黒で描く画像間違えた。顔を白で、顔以外を黒で描くだった
モノクロ2階調のBMP形式で保存する
ファイル名はなんでもいい。
できたマスクBMP画像と、今回使うjpeg元画像
■変換する
colortransというUbuntuでビルドしたバイナリがコミットしてあるので、
入力ファイル名 出力ファイル名 Hue Saturation Value マスクファイル名
の順に引数を渡すとできる。
colortrans shokai.jpg result.jpg -30 50 -10 mask.bmp
マスクを指定しないと、画像全体の色を遷移させる事も出来る
colortrans shokai.jpg result.jpg 40 0 0
これはこれで何かに使えるかもしれない
■プログラム
MacやWindowsでも、OpenCVをはじめたで書いたとおりビルド環境を作れば使える。
OpenCVは簡単なので、各言語バインディング使うより普通にCで書いた方がいいと思う
colortrans.cpp
#include <stdio.h>
#include <highgui.h>
#include <cv.h>
IplImage *img = NULL;
IplImage *imgMask = NULL;
IplImage *imgHsv, *imgResult, *imgHue, *imgSat, *imgVal;
int main(int argc, char** argv){
if(argc < 6){
puts("Put filenames and HSV(HSB) as ARGS");
puts(" colorchange input output H(int) S(int) V(int) (mask)");
puts("Usage:");
puts(" colortrans ../data/shokai.jpg result.jpg -30 50 -10 ../data/shokai-mask.jpg");
puts(" colortrans ../data/shokai.jpg result.jpg 40 0 0");
return -1;
}
img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR);
if(argc > 6) imgMask = cvLoadImage(argv[6], CV_LOAD_IMAGE_GRAYSCALE);
imgHsv = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_8U, 3);
imgResult = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 3);
imgHue = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
imgSat = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
imgVal = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
cvCvtColor(img, imgHsv, CV_BGR2HSV);
cvSplit(imgHsv, imgHue, imgSat, imgVal, NULL);
cvAddS(imgHue, cvScalarAll(atoi(argv[3])), imgHue, imgMask);
cvAddS(imgSat, cvScalarAll(atoi(argv[4])), imgSat, imgMask);
cvAddS(imgVal, cvScalarAll(atoi(argv[5])), imgVal, imgMask);
cvMerge(imgHue, imgSat, imgVal, NULL, imgHsv);
cvCvtColor(imgHsv, imgResult, CV_HSV2BGR);
cvSaveImage(argv[2], imgResult);
}
Rubyスクリプトをexeにできる。
試しにRuby本体もgemもアンインストールしてみたが動いたので、exe内にruby本体とrequireしたファイル全てが収まっているみたいだ。
少し古いけどRuby on Railsをexe化する記事もあったので、使い道があるんじゃないですかね。
RubyScript2Exe – A Ruby Compiler
から、rubyscript2exe.rb をダウンロードしてきてexe化したいrubyスクリプトと同じディレクトリに置く。
今回は試しにfeed-normalizer – 橋本詳解をexe化してみる。
引数で渡したURLのRSS/Atomフィードを表示する簡易Feedリーダー。引数なしではこのblogのfeedを読み込む。
rss.rb として保存(Windows用に出力文字コードだけshift_jisに変更した)
require 'rubygems'
require 'feed-normalizer'
require 'open-uri'
require 'cgi'
require 'kconv'
require 'pp'
uri = ARGV.shift || 'http://shokai.org/blog/feed/'
puts "parse #{uri}"
feed = FeedNormalizer::FeedNormalizer.parse open(uri)
puts "title: #{feed.title.tosjis}"
puts "(#{feed.entries.size}entries)"
#feed.clean!
feed.entries[0..3].each{ |e|
puts e.url
puts e.content.tosjis
puts e.last_updated
puts ''
}
#pp feed.entries[0]
■exe化
ruby rubyscript2exe.rb rss.rbで、rss.exeが生成される。
Rubyそのものが格納されるのでファイルサイズがでっかい。puts ‘test’しただけのコードをexe化したら900kb超えた。
このrss.rbだと5個requireしているので1.5MBになった。
まあファイルサイズは大した問題でもないか
ちょっとUDPを使ってアプリを作る用事があるので、まずは.NETのSystem.Net.Sockets.UdpClientクラスでシンプルなテキストチャットを作ってみた。相手のIPアドレスとポートを指定してメッセージ(文字列)を送り、受信側はポートを開けてさえいればメッセージが読める。
UDPによりデータの送受信を行う: .NET Tips: C#, VB.NET, Visual Studioを参考にした。
学部の頃にインターネット概論という授業で、
- コンジェスチョンコントロールがない
- フローコントロールがない
■ソースコード
shokai / C# UDP Sample / source — bitbucket.org
(VisualStudio2008pro C#で作成)
別ホスト(VMWare上のUbuntuでmonoで実行)とも通信できた
■UdpClientの使い方
まず必要な物読み込んで
using System.Net;
using System.Net.Sockets;
UdpClientオブジェクトを作ってportを開く。
UdpClient client = new UdpClient(6000); // 受信port
client.DontFragment = true;
client.EnableBroadcast = true;
これですでに受信できるようになっている。
相手のIPアドレスかホスト名とportを指定して、UTF8エンコードで送信
Encoding encoding = Encoding.UTF8;
byte[] sendBytes = encoding.GetBytes("送信する文字列");
client.Send(sendBytes, sendBytes.Length, "192.168.0.15", 6000);
受信バッファから読み出すと、文字列と受信元IPとportがわかる。
if (client.Available > 0)
{
byte[] recvByte = client.Receive(ref remoteEP);
Console.WriteLine("receive: " + encoding.GetString(recvByte) +
" (form" + remoteEP.Address + ":" + remoteEP.Port+")");
}
最後にUdpClientを閉じるのを忘れないように
client.Close();
チャットアプリの実際の処理はUDPClientSampleForm.csに全部書いてある。受信を別スレッドにしてある。