約 2,992,444 件
https://w.atwiki.jp/arprojectfun/pages/51.html
ノート OpenCV カメラの画像をテクスチャに利用する 準備 解説コメント 準備 荒川くんの用意してくれたプログラムを利用する。 mrip\trunk\directx の中にある[ShowXFile_base20100511]というプログラムを改良したプログラムを mrip\trunk\opencv\OpenCV_ShowXFile_base20100511 に作成した。SVNを最新のものに更新して、利用してください。 解説 基本的には動作確認用のプログラムでフレームの画像をテクスチャにコピーしているだけです。 コピーするための関数。 void replaceTexture(LPDIRECT3DTEXTURE9 pTexture, IplImage *pPanoImg) { D3DLOCKED_RECT pLockedRect; pTexture- LockRect(0, pLockedRect, NULL, 0);//ロック unsigned long data; //32bit unsigned long r, g, b, a; unsigned long *to = (unsigned long*)pLockedRect.pBits; for(UINT y=0; y (unsigned int)pPanoImg- height; y++) { for(UINT x=(unsigned int)pPanoImg- width; x 0 ; x--) { //初期化 data = r = g = b = 0; //B b = *(pPanoImg- imageData + (pPanoImg- width*y + x-1) * 3 + 0); data += b; //G g = *(pPanoImg- imageData + (pPanoImg- width*y + x-1) * 3 + 1); g = 8; data += g; //R r = *(pPanoImg- imageData + (pPanoImg- width*y + x-1) * 3 + 2); r = 16; data += r; //A a = 0; a = 24; data += a; *to++ = data; } } pTexture- UnlockRect(0);//アンロック } この関数が原因で、現在のプログラムではうまくコピー出来ていないらしい。 誰かにこの関数を直して欲しい。(加藤くん辺りに(ぇ コメント 名前 コメント
https://w.atwiki.jp/arprojectfun/pages/48.html
OpenCV OpenCVに関する記事のまとめ OpenCVの導入 OpenCVを使ったWebカメラの扱い方 カメラの画像をテクスチャに利用する OpenCV+DirectXでのプログラミング
https://w.atwiki.jp/arprojectfun/pages/3.html
更新履歴 取得中です。 ここを編集
https://w.atwiki.jp/arprojectfun/pages/57.html
ノート - メモリフォーマットについて - 非圧縮 RGB ビデオ サブタイプ 非圧縮 RGB ビデオ サブタイプとはDirectShowでメディアタイプ構造体を利用するときに設定するための定数です。 以下の定数を指定することによって取得出来るメモリフォーマットが異なります。 GUID 説明 MEDIASUBTYPE_RGB1 RGB、1 ピクセルにつき 1 ビット (1 bpp)。パレット化されている。 MEDIASUBTYPE_RGB4 RGB、4 bpp。パレット化されている。 MEDIASUBTYPE_RGB8 RGB、8 bpp。 MEDIASUBTYPE_RGB555 RGB 555、16 bpp。 MEDIASUBTYPE_RGB565 RGB 565、16 bpp。 MEDIASUBTYPE_RGB24 RGB、24 bpp。 MEDIASUBTYPE_RGB32 RGB、32 bpp。アルファ チャンネルなし。 MEDIASUBTYPE_ARGB32 RGB、32 bpp。アルファ チャンネルあり。 ここではMEDIASUBTYPE_RGB24とMEDIASUBTYPE_ARGB32について説明します。 MEDIASUBTYPE_RGB24について メモリに格納され方 型 バイト数 一つのポインタの中身 実際の入り方 long 4 0xRRGGBBCC (RGBは256階調の色データ。Cは次のピクセルのカラー) 0xRRGGBBRR,0xGGBBRRGG 4バイトにRGBの24bitを格納するとlongの型には1バイト余ってしまいます。 そのため、最後の1バイトには次のピクセルのカラーが詰められていると思います(予想) また、それぞれの色にアクセスしたい場合は分解する必要があります。 サンプル サンプルはめんどくさいので省略 欲しかったら、コメントください。書いておきます。 MEDIASUBTYPE_ARGB32について メモリに格納され方 型 バイト数 一つのポインタの中身 実際の入り方 long 4 0xAARRGGBB (RGBは256階調の色データ。Aはアルファ値) 0xAARRGGBB これは先ほどと違って、1つポインタをずらすと1ピクセルずれます。 ↑よりもアクセスが簡単になります。 サンプル char r,g,b,a; long data; //既にここには何か格納されてると仮定する for(int y=0;y height;y++){ for(int x=0;x width;x++){ a = (data 24) - 0xFFFFFF00; //ずれた部分にはFが入っている r = (data 16) - 0xFFFF0000 - a; g = (data 8) - 0xFF000000 - a - r; b = data - (a+r+g); } } コメント ありがとう!すごく参考になります(汗) -- 荒川 (2010-05-24 22 39 25) 名前 コメント
https://w.atwiki.jp/arprojectfun/pages/34.html
GPSモジュール比較表 調べてみたGPSモジュールを淡々とまとめてみるページ 重要と思われる価格と誤差、秒間あたりの出力回数についてまとめてあります GPSモジュール 通常のGPSモジュール類、割と安価であること、小型であることがウリか。 価格 誤差(方式) 出力回数(Hz) 接続 備考 マーキュリー48 18,857円 15m(単独測位) 1Hz Dsub9ピン(オス) 現在借りて使用しているもの参考基準にどうぞ BTGPS/408 9,500円 3m(SBAS) 1Hz Bluetooth バッテリ内蔵 コメットUSB/3*HL 8,980円 10m(単独測位) 5m(SBAS) 1Hz USB サターン18x-5Hz時刻同期ケーブルつき 42,800円 15m(単独測位) 3m(SBAS) 5Hz シリアル(RS-232C)端子(オス) ケーブル込みの価格ケーブルなしだと35,800円 GPS-52D(B)-014(秋月GPSレシーバモジュールキット) 4,800円 15m(単独測位) 1Hz シリアル(RS-232C)端子(メス) 組み立てキットコネクタは工夫次第で選べる DGPSモジュール 一般的に高精度と言われるGPSモジュール類 誤差1m以下の測定ができるものが多いが、1台で予算を食いつぶしそうなほど高価な物ばかり 比較的でかい物が多い CrescentA100 223,800円 2.5m(単独測位) 1m(SBAS) 1~10Hz(可変) Dsub9ピン(オスメス不明) 最高2ポート同時接続可能価格はPC接続ケーブル無し、ケーブル価格8,800円20Hzで出力可能なものもあり 286,800円 Sokkia GIR1600 299,800円 1m(SBAS) 1Hz Bluetoothシリアル(RS-232C)端子(オスメス不明) 中波DGPS対応 アンテナは158,000円10Hz,20Hz出力のものもあり 349,800円 399,800円 テンプレ リンク名 価格 誤差(方式) 出力回数(Hz) 接続 備考
https://w.atwiki.jp/arprojectfun/pages/11.html
コメントプラグイン @wikiのwikiモードでは #comment() と入力することでコメントフォームを簡単に作成することができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_60_ja.html たとえば、#comment() と入力すると以下のように表示されます。 名前 コメント
https://w.atwiki.jp/arprojectfun/pages/13.html
テストページみたいなもの。 実験のまとめやソースコードなどの解説などをまとめたものを書き込んでいこう。 GPS 緯度・経度による距離計算 冬休み中に実験したGPSのデータをもとに距離を解析しました。ほぼGoogleグループの転載。 GM-48ログデータ(VisualGPS(フリーソフト)を使用して出力したログです。 同ソフトで読み込むとグラフィカルに出力且つ平均等を算出してくれます) 10/2/6 14 30頃~16 00頃まで取ったデータ http //www29.atwiki.jp/arprojectfun?cmd=upload act=open pageid=16 file=GPSM48Log_anoon.zip 10/2/20 13 00~3時間ほど? http //www29.atwiki.jp/arprojectfun?cmd=upload act=open pageid=16 file=GPSM48Log_afternoon.zip GPSモジュール比較 調べたGPSモジュールを簡易にまとめてみた表です。 日本測地系と世界測地系 測地系変換について。 マーキュリー48のコマンド送信 現在利用中のGPS、マーキュリー48の測地系の切り替えについて マーキュリー38マニュアル また、型が一つ古いが、コマンドが使えそうであるためメモ 3Dプログラミング 開発環境の導入 DirectXのSDKの導入の仕方や、VisualStudioの導入の仕方 WinAPIとか Windowsプログラミングをやるには、これをすこし理解して欲しい。 Direct3D 入門 DirectXの3D描写の初期段階。 DirectShow 入門 DirectXで動画像処理を行う。 WiiRemote WillRemoteのプログラミング関係。 OpenCV OpenCVのプログラミング関係。 ソースコード置き場 作成したソースコード等はここに置いてください。 画像処理 メモリフォーマットについて 画像処理に関してのメモリの格納のされ方についてのまとめ 無線LAN WiFiAPIまとめ 無線LANのWindowsAPI。それぞれの使い方や、派生したライブラリ等のまとめ その他 TeX入門 TeX(テフ)とは高度な文章作成やPDF出力できるソフトウェアです。今後のプロジェクト文章 TeXによる報告書の書き方 中間報告書のファイルの扱い方について書きます はTeXで行う予定です。 ソースコードのバージョン管理とオンラインストレージの使い方 TortoiseSVNとBeanstalkの使い方、SugerSyncの導入の紹介 BackLogでのタスク管理 プロジェクトのタスク管理方法についてです。 GIFについて 「Ghost In Fun」についてのまとめページです。 実験動画 動画をアップしておきました(101027) パスは jlx です http //www1.axfc.net/uploader/C/so/123243
https://w.atwiki.jp/arprojectfun/pages/42.html
サンプルプログラム 書籍「はじめての動画処理プログラミング」の6章の list602.cpp
https://w.atwiki.jp/arprojectfun/pages/58.html
SampleGrabberによりカメラからの入力をテクスチャとして貼り付けたスプライトを背景として、スプライトの前方に3Dのメッシュオブジェクトを配置するプログラムについて。 プログラム SVN の下記の場所にあります。 mripo/trunk/directx/D3DObjectInFrontOfTexture ポイントとなったところ 今回のプログラムは 「薬のXファイルを表示するプログラム」 mripo/trunk/directx/ShowXFile_main20100511 と、 「テクスチャとしてスプライトにカメラ画像を張り付けるプログラム」 mripo/trunk/directx/TextureFromSampleGrabber2 を組み合わせたものです。 作成に際してポイントとなったところを書いておきます。 スプライトオブジェクトはワールドトランスフォームに影響されない スプライトオブジェクトはワールドトランスフォーム(絶対座標変換)によって座標変換されることはありません。 スプライトを移動させる場合は、 pSprite- Draw(pTexture, rect, vec3Center, vec3Position,D3DCOLOR_ARGB(255,255,255,255)); のように、スプライトオブジェクトのもつ Draw メソッドの第4引数で座標を指定する必要があります。 スプライトの描画前にはZバッファを無効にしておく スプライトオブジェクトの描画前にはZバッファを無効にしておきましょう。 でないと、スプライトと3Dオブジェクトが同時に表示されません。 Zバッファの有効/無効を切り替えるときは、 LPDIRECT3DDEVICE9 オブジェクトの持っているSetRenderState()を使います。 例) Zバッファを無効にするとき pDevice- SetRenderState( D3DRS_ZENABLE, FALSE ); Zバッファを有効にするとき pDevice- SetRenderState( D3DRS_ZENABLE, TRUE );
https://w.atwiki.jp/arprojectfun/pages/24.html
Visual Studio を用いてプログラミングを行う場合は、DirectXを使う上で必要なWin32 APIに関する記述はテンプレートにより自動的に追加されるので、最小限理解が必要な部分のみ解説されたサイトを紹介する。 プロジェクトの作成参考サイト よく解らない解説宣言部解説 _tWinMain関数解説 MyRegisterClass関数解説 InitInstance関数解説 WndProc関数説明 About関数解説 追記情報とか プロジェクトの作成 Visual Studio を起動させる。 上部のメニューから [ファイル(F)] - [新規作成(N)] - [プロジェクト(P)... Ctrl+Shift+N] を選択する。 左の「プロジェクトの種類(P) 」から「Visual C++」を選択し、 右の「テンプレート(T) 」から「Win32 プロジェクト」を選択して 適当な「プロジェクト名(N) 」を記入した後、[OK]ボタンをクリックする。 「Win32 アプリケーションウィザード」というウィンドウが表示されるので、 何もせずに[完了]ボタンをクリックする。 プロジェクトの作成はこれで完了。 参考サイト DirectX を扱う上での最小限の知識はコチラで得られる。 はじめてのWindowsプログラム【目次】 - プログラム初心者による3Dゲーム制作勉強日記 - livedoor Blog(ブログ) 詳細な解説はコチラを参考にすると良いかも Win32 API入門 よく解らない解説 自分でも解らない部分が多いですが、一応解説を入れておきます。 「プロジェクト名.cpp」を開いてください。これがメインのファイルです。 それ以外は飾りです(ぇ 宣言部 #include "stdafx.h" #include "sample2.h" #define MAX_LOADSTRING 100 // グローバル変数 HINSTANCE hInst;// 現在のインターフェイス TCHAR szTitle[MAX_LOADSTRING];// タイトル バーのテキスト TCHAR szWindowClass[MAX_LOADSTRING];// メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します ATOMMyRegisterClass(HINSTANCE hInstance); BOOLInitInstance(HINSTANCE, int); LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM); 解説 変数宣言とプロトタイプ宣言です。見たこと無い型がいっぱいですが、#defineで定義したものなので気にしなくて良いです。 気になる方は型で右クリックで「定義へ移動」をクリックして、確認してください。 _tWinMain関数 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO ここにコードを挿入してください。 MSG msg; HACCEL hAccelTable; // グローバル文字列を初期化しています。 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_SAMPLE2, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // アプリケーションの初期化を実行します if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SAMPLE2)); // メイン メッセージ ループ while (GetMessage( msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, msg)) { TranslateMessage( msg); DispatchMessage( msg); } } return (int) msg.wParam; } 解説 メインループです。一番最初にこれを読み込みます。int main()やvoid main()などと同じです。 引数がたくさんありますが、Windowsプログラミングではこれが標準の引数です。 最初の方は変数宣言だったり、ウィンドウクラスの設定だったりします。 一番大事なところは、「メイン メッセージ ループ」というところです。 ウィンドウからのイベントやメッセージを受け取ります。 そのあと、登録したコールバック関数によって処理することが出来ます。 Windowsプログラムのメインは ウィンドウ監視 → 何かあったらメッセージが伝えられる → それを元にコールバック関数で制御 ってな感じの流れになってます。(違ったらごめんw) コールバック関数については下のほうで定義します。 MyRegisterClass関数 // // 関数 MyRegisterClass() // // 目的 ウィンドウ クラスを登録します。 // // コメント // // この関数および使い方は、 RegisterClassEx 関数が追加された // Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。 // アプリケーションが、関連付けられた // 正しい形式の小さいアイコンを取得できるようにするには、 // この関数を呼び出してください。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc= WndProc; wcex.cbClsExtra= 0; wcex.cbWndExtra= 0; wcex.hInstance= hInstance; wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SAMPLE2)); wcex.hCursor= LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName= MAKEINTRESOURCE(IDC_SAMPLE2); wcex.lpszClassName= szWindowClass; wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx( wcex); } 解説 使用するウィンドウ情報を登録する関数。ウィンドウを作るには情報の登録が必要です。 ここで、ウィンドウのスタイルやアイコンコールバック関数の登録などを行います。 この辺はテンプレなのでいじらない場合はこのままでも構いません。 InitInstance関数 // // 関数 InitInstance(HINSTANCE, int) // // 目的 インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } 解説 登録したウィンドウ情報を元にウィンドウを生成する関数。 先程設定したウィンドウの情報を元にウィンドウを作成します。 CreateWindow関数でウィンドウを作り、ShowWindowでウィンドウを可視化します。 詳しい関数の説明はリファレンス等見てください。 WndProc関数 // // 関数 WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的 メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND- アプリケーション メニューの処理 // WM_PAINT- メイン ウィンドウの描画 // WM_DESTROY- 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 選択されたメニューの解析 switch (wmId) { case IDM_ABOUT DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT DestroyWindow(hWnd); break; default return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT hdc = BeginPaint(hWnd, ps); // TODO 描画コードをここに追加してください... EndPaint(hWnd, ps); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } 説明 コールバック関数です。 ウィンドウから送られてきたメッセージを処理します。 例えば、「右上の×印を押されたときの処理は~しろ。」とか、「ボタン1が押されたときは~」って処理は此処に書きます。 詳しい説明は端折ります。 About関数 // バージョン情報ボックスのメッセージ ハンドラです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG return (INT_PTR)TRUE; case WM_COMMAND if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } 解説 バージョン情報を開いた時のコールバック関数。 おそらく、バージョン情報を開いたときに、コールバック関数を入れ替えてると思われ。 追記情報とか 勝手に追加しちゃいました。迷惑でしたら、言ってください。 -- 村山 (2010-02-15 08 55 00) そんなことないですよ。追記ありがとうございます、助かりました -- 荒川 (2010-02-15 08 59 49) 名前 コメント