GWの工作

おはようございます。GWの真っただ中、皆さんいかがお過ごしでしょうか?

自分は寂しく…はぁ。ということで、ひきこもって工作をしておりました。


もう一回書きますと、ビデオ信号を任意秒遅らせることで、今自分が行った動きをすぐに確認できるようになる装置です。当然、CPUと大量の映像バッファとしてのメモリが必要になりますので、本格的な機械は10万円〜20万円程度です。

それを、今のパソコンなにやらせて。ただで作ってしまおうというプロジェクトです。カメラはUSBのものを想定していますので、ネットブックにインストールすれば、外の射場でも使用できます(公共の射場はやめたほうがいいと思います)。


こんな感じ(Youtube)です。


録画機能は実装していません。また、ユーチューブにアップしたものはテスト用のもので、配布するものはウィンドウが1つのみで遅延信号のみが表示されます。

環境はVista/xpでテストしましたが、OSのバージョンではなく、.NETフレームワーク2.0をインストールしていれば動くはずです。カメラはUSBカメラでCMS-V22SETBLを使用しましたが、640x480の解像度があるものでしたら、大丈夫なはずです。

遅延速度はフレーム数で指定する感じですが、10フレームと指定した場合、P4-2.8Gで1秒程度、Core2-2.1Gで0.7秒程度の遅延が発生するようです。実際の時間設定はお客様の環境に合わせてください。

フレーム数を入力後に、バッファメモリを確保しにいきます。ここで、実際の遅延時間の場合程度の時間がかかりますので、1,000とは入力せずに、30程度から動作確認をお願いします。バグったら容赦なく強制終了です。



こんなところでしょうか。EXEとDLL(OpenCVのもの)だけのZipファイルをこちらで配布中です。


削除も実行ファイルから行いますので、実行ファイルは消さないでください。
徹夜で3時間で作った、仕様書もRead meも書いていない最低のプログラムです。
愛してくれる方がいらっしゃれば、メンテしていきたいと思います。

↓要望などはこちらのユーザーグループからお願いします。


OpenCVを使った簡単なプログラムです。VS2005のC++で作成しました。フリーです。好きにいじってください。下手くそなソースも貼っておきますので。以上、一年以上も前に思いついたGWの工作でした。



//そーすです〜 Opencvをinstallしてください。 ryo_h18
//http://sourceforge.net/projects/opencvlibrary/ ver1.1使用


#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include <stdio.h>
#include <time.h>

int

main (int argc, char **argv)
{
printf("---------------------------------\n" );
printf("Archery Play Back Ver 0.001\n\n" );
printf("作者:山口 諒(JPアーチェリー あちぇ屋 所属)\n" );
printf("作成日:2009.05.03\n" );
printf("バグ報告: http://groups.yahoo.co.jp/group/jparchery/\;n" );
printf("---------------------------------\n\n" );
printf("説明:USBカメラなどに対応しております。使用には.NET2.0以上が必要です。\n\n" );
printf("使い方:遅延時間を決めるために10〜1000までの任意の数字を入力してください。\n" );
printf(" 大体10で1秒程度の遅延です(お客様の環境によって異なります)。\n" );
printf("\n終了時には「ESC」キー、もしくは[Ctrl]キーと[C]キーを押してください。\n" );
printf("---------------------------------\n\n" );
printf("\n遅延フレーム数を入力してください: " );

int frameNum,c,i = 0;
boolean printTime = false;
scanf("%d(フレーム)",&frameNum);
printf("\n\n%dフレーム遅延で映像を配信します。",frameNum);
printf("\n\nただいま、カメラ設定中です…\n" );


CvCapture *capture = 0;
IplImage *frame[1000];

time_t start;
time_t end;

if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

/* この設定は,利用するカメラに依存する */
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, 640);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

printf("バッファ中…" );

   //バッファメモリを確保しています。実際の遅延時間の2倍程度の時間がここでかかります。
while (i <= frameNum) {
frame[i] = cvCreateImage(cvGetSize(cvQueryFrame(capture)),8 ,3);
cvCopy(cvQueryFrame(capture),frame[i]);
i++;
}

time(&start);
i = 0;

while (1) {

if (i < frameNum) {
cvShowImage ("Capture", frame[i]);
cvCopy(cvQueryFrame (capture),frame[i]);
i++;
}

if (i >= frameNum) {
i = 0;
cvShowImage ("Capture", frame[i]);
cvCopy(cvQueryFrame (capture),frame[i]);
i++;

if (printTime == FALSE){
time(&end);
printf("\n\n%f秒前の映像を配信します。\n", difftime(end,start));
printTime = true;
}
}


c = cvWaitKey (10);
if (c == '\x1b')
break;
}

cvReleaseCapture (&capture);
cvDestroyWindow ("Capture" );

return 0;
}

コメントの投稿

非公開コメント

アクセス数
最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

QRコード
QRコード