Intel RealSense R200カメラの強化された写真サンプルコード



このドキュメントとサンプルアプリケーションでは、 Intel RealSense R200カメラとIntel RealSense SDKに含まれるEnhanced Photography機能の使用方法を示します

必要条件


ハードウェア要件


ソフトウェア要件


ご注意 この特定のサンプルプロジェクトは、最新の.NETリリースを使用してVisual Studio 2015で作成されました。

プロジェクト構造


このアプリケーションの例では、Intel RealSense SDKの機能をグラフィカルユーザーインターフェイスレベルのコードから分離し、開発者がEnhanced Photography R200の高度な撮影機能に関連する機能に集中できるようにしています。 このため、次のC#ラッパークラスを作成しました。


さらに、簡単にするために、強化された写真機能のタイプごとに個別のフォームのWinFormを作成しました。 これにより、一定量の繰り返しコードが作成されますが、Enhanced Photographyの各機能を示す際に明確になります。

プロジェクト構造には、ここで説明する要素以外の要素が含まれています。 このドキュメントの後半で、すべてのソースコードファイルとその作業を詳しく見ていきます。

インテルRealSense SDKの機能をグラフィカルユーザーインターフェイスのソースコードから最大限に分離する方法を示すために、独自のイベントを作成しています。 このような解決策は、フォーム全体をクラスに渡して、このクラスがフォームのプロパティにアクセスできるようにするよりも、「クリーン」であるように思えます。

また、このサンプルアプリケーションは完璧なプログラムコードのベンチマークではないことに注意してください。 実行時のチェックはほとんどありません; try / catchブロックはありません。 わかりやすいコードでシンプルでわかりやすい例を作成しようとしたため、可能な限り追加の構成のコードを削除しようとしました。

サンプルアプリケーションのフォームはあまり洗練されていませんが、仕事をします。強化された写真の使用方法を示しています。

Visual Studioプロジェクトの構造



上の図は、Visual Studio 2015のソリューションを示しています。さまざまなフォルダーには次のものが含まれています。



簡単な一般的なシーケンス図





サンプルアプリケーションを実行すると、FormMainフォームが表示されます。 このフォームでは、ストリーミングボタンをクリックしてストリーミングを開始できます 。 このボタンを押すと、アプリケーションはRSStreamingクラス機能を使用してストリーミングを開始します

RSStreamingクラスはFormMainフォームを常に更新し、その内部OnNewStreamingSampleイベントを発生させます。 これは、カメラから来る各フレームに対して行われます。

[ストリーミングを停止]をクリックして、ストリーミングを停止できます。 。 その後、ストリーミング転送は単に停止し、再度オンにする以外に使用できるコマンドはありません。 [写真]ボタンをクリックした場合 、画像データがディスクに保存され、ストリーミングが停止します。 ストリーミングを停止して写真をディスクに保存すると、写真を変更するためのボタンがアクティブになります。 これらを使用して、このサンプルアプリケーションに実装されている機能を示す[Enhanced Photography]ダイアログの1つを選択できます。

[拡張写真]ダイアログボックスのいずれかを選択すると、ディスクに保存されているサンプル画像がダウンロードされて使用されます。 これについては、このドキュメントの後半で詳しく説明します。

コード解析


次のセクションでは、アプリケーション全体とその進捗状況について説明し、さまざまなクラスについて説明します。

フォーム


FormDepthEnhance 。 2つの異なる深度品質パラメーターを使用して深度データを表示する方法を示します。 ユーザーは低品質または高品質を選択できます。



FormDepthPasteOnPlane 。 このフォームは、平面上の挿入機能を使用して、平面上の2点をクリックして外部画像をインポートする方法を示しています。



FormDepthRefocus 。 このフォームは、画像の任意の場所をクリックし、その場所で画像をシャープにする方法を示しています。画像の残りの部分はぼやけています。 画像内の任意の場所をクリックできます。 クリックポイントが新しいフォーカスポイントになります。 スライダーを動かして、カメラのレンズのシミュレートされた絞りを調整できます。



FormDepthResize 。 サイズ変更機能を次に示します。深度画像をカラー画像のサイズに拡大できます。



FormMeasure 。 拡張写真測定機能を使用して、距離、精度、信頼性を取得する方法を次に示します。



FormMain 。 これがアプリケーションのメインフォームです。 その中で、ユーザーはIntel RealSenseカメラからのストリーミングデータを有効にし、ストリーミングを停止して写真を撮ることができます。 その後、さまざまな拡張写真機能を結果の画像に適用できます。



ソースコード


RSEnhancedPhotography.CS これは、Intel RealSenseカメラの拡張写真のすべての機能を含むラッパークラスです。 このクラスの目的は、できるだけ多くのIntel RealSenseカメラ機能をグラフィカルユーザーインターフェイスレイヤーから分離することです。 このクラスは、カスタムイベントを使用して、データをクライアントアプリケーションに公開します。 RSEnhancedImageArgクラスは、表示する新しい画像を取得します。

RSPaintUtil.CS 。 これは、C#PictureBoxコントロールでマウスクリックと線を描画するために使用される静的ヘルパークラスです。

RSPoints.CS このヘルパークラスは、PXCMPointI32ポイントオブジェクトを囲み、ポイントの保存、ポイントデータの確認、および画面に表示されるポイントデータの送信のための機能を作成します。

RSStreaming.CS 。 これは、Intel RealSenseカメラからのデータフローのラッパークラスです。 データストリームを転送し、クライアントにイベントを公開します。 イベントは、RSSampleArgクラスを使用して、クライアントが使用するデータを保存します。

RSUtility.CS これは、ソースコードを含む静的クラスです。 実装されている機能は、特定のクラスに属していません。

ソース\ CustomEventArgsコード


RSEnhancedImageArgEventArgsを拡張し、 PXCMImageオブジェクトを含みます。 このオブジェクトには、Intel RealSense SDKのEnhanced Photography機能を使用して変更された画像が含まれます。 この画像は、個別のPictureBox WinFormsコントロールに表示されます。

RSMeasureArg.CS EventArgsを拡張し、拡張写真機能によって返された測定データが含まれています。 このデータは、ユーザーに測定データを通知するために、 WinForm FormMeasureフォームで使用されます

RSSampleArg.CSEventArgsを拡張し、 PXCMCapture.Sampleオブジェクトを含みます。 このオブジェクトには、カメラで撮影された最後のフレームが含まれます。 データのストリーミングおよびWinForm FormMainフォームでの表示に使用されます

詳細分析


次に、フォームをサポートするヘルパークラスについて説明します。 フォームの作業だけに焦点を当てるのではなく、基本的なコードがどのように機能するかを学ぶ方が良いと考えています。 最初のクラスであるRSStreamingから始めましょう。
受信および割り当ての機能などの非常に小さな詳細は、考慮しません。それらは完全に理解可能です。 他の明らかなことは説明しません。

RSStreaming


RSStreamingは、Intel RealSense SDKをストリーミングするためのラッパークラスです。 このクラスはそれほど複雑ではありません。 タスクは、Intel RealSenseカメラからのストリーミングデータの簡単な例を提供することです。 画像ストリームを送信するだけでなく、写真を撮影し、イベントを使用して両方をクライアントに転送できます。

public event EventHandler<RSSampleArg> OnNewStreamingSample; 

このドキュメントで前述したように、イベントを使用してデータをクライアントアプリケーションに(フォームで)送信します。 RSStreamingは、 OnNewStreamingSampleイベントを使用して、クライアント(この場合はFormMain)にデータを送信します。 これは、カメラからの最新のサンプルを含む1つのパラメーターRSSampleArgを取ります。

 public bool Initialized 

クラスが初期化されているかどうかを示す単純なゲッターメソッドフラグ。

 public bool IsStreaming 

単純な受信フラグは、クラスが現在データをストリーミングしていることを示します。

 public void StartStreaming( ) 

クライアントがカメラからのデータのストリーミングを開始するために使用する一般的な機能。 クラスが適切に初期化されたかどうかを確認します。 その場合、 InitCamera()関数を呼び出してカメラを初期化します。

私は、通常無視される1つの関数を使用していることに注意してください。 お気づきかもしれませんが、多くのストリーミングの例では、ブールフラグを使用して転送を停止する何らかのメカニズムを備えたwhileループAcquireAccess関数を通常使用します 。 この例では、異なるアプローチを使用しています。

私のアプローチは異なります。PXCMSenseManagerでStreamFrames関数を使用します。 SenseManagerが独自の内部スレッドを開始し、イベント処理を使用してデータを送信するように強制します。 これは、PXCMSenseManager.Handlerオブジェクトを関数に割り当てることで実現されます。 詳細については、 以下のInitCamera()関数の説明を参照してください

 private void InitCamera( ) 

InitCameraは、カメラとストリーミングを初期化するプライベート関数です。 最初に、PXCMSenseManagerおよびPXCMSessionオブジェクトを作成します。 次に、静的関数RSUtility GetDeviceByType()を使用して取得したデバイス(カメラ)に関する情報が必要になり、セッションと目的のカメラのタイプを渡します。

次に、2つのPXCMVideoModule.DataDescオブジェクトを作成します。1つはカラーストリーム用で、もう1つは深度ストリーム用です。 次に、各スレッドを構成します。 ストリームを構成した後、PXCMSenseManagerにストリームを有効にするコマンドを与えます。

StartStreaming()関数の説明で述べたように、イベントベースのアプローチを使用してデータの送受信を制御します。 これを行うには、PXCMSenseManager.Handlerイベントハンドラーオブジェクトを作成して初期化し、 OnNewSample関数に割り当てます。 カメラが新しいフレームを撮影するたびに、 OnNewSampleイベントハンドラーが呼び出されます。

次に、SenseManagerを初期化し、ハンドラーオブジェクトに送信し、このオブジェクトとそのイベントハンドラーを使用するコマンドを渡します。

 private pxcmStatus OnNewSample( int mid, PXCMCapture.Sample sample ) 

OnNewSample-PXCMSenseManager.Handlerオブジェクトのイベントハンドラー。

パラメータ


この関数が呼び出されると、 Sample引数から画像を取得して新しいRSSampleArgオブジェクトに入れ、このクラスのOnNewStreamingSampleイベントを発生させます。 その後、イベントはFormMainクライアントに、新しい画像を表示する準備ができたことを通知します。
フレームを解放し、目的のpxcmStatusを返します。この場合は使用されません。

 public void StopStreaming( ) 

スレッドを閉じてDispose()を呼び出すことにより、ストリーミングを停止します。

 private void Dispose( ) 

ガベージコレクション用のリソースを解放します。

RSEnhancedPhotography


RSEnhancedPhotographyクラスは、すべての拡張写真機能を1つの使いやすいクラスにラップするために作成されました。 イベントの原則に基づいて機能します。 イメージを処理した後、新しく作成されたイメージまたは測定データをクライアントアプリケーションまたはクラスに返すイベントが生成されます。

 public RSEnhancedPhotography( PXCMPhoto photo ) 

コンストラクターは、クラスで使用されるいくつかのグローバル変数を初期化します。 入力パラメータは、メインフォームで撮影された元の写真のみです。 画像データで完全に初期化され、ローカル_colorPhotoオブジェクトの初期化に使用されます。

 public void Dispose( ) 

ガベージコレクターのメモリを解放します。

 public void SendOriginalImage( ) 

OnImageProcessedイベントを使用して、呼び出し元のアプリケーションに元の画像を返します。

 public void MeasurePoints( RSPoints points ) 

MeasurePointsは、塗りつぶされたRSPointsオブジェクトを取得します。 最初に、このオブジェクトに実際に開始点と終了点の2つのポイントがあることを確認します。 このチェックの後、 MeasureDataオブジェクトが作成されMeasureDistance関数のPXCMEnhancedPhotoオブジェクトに送信されます。

次に、入力されたmeasureDataオブジェクトからデータを取得し、 RSMeasureArgオブジェクトにデータを入力します。 値をセンチメートルに変換するパラメーター(mesaureData.distance / 10)に注意してください。 argオブジェクトを埋めた後、 OnImageMeasuredイベントを介してクライアントに送信します。

 public void RefocusOnPoint( RSPoints point, float aperture = 50 ) 

カメラを使用する場合、絞りを調整して被写界深度を調整できます。 小さな開口部では、被写界深度が浅くなります。被写体の正面と背後にあるすべてのオブジェクトがぼやけます。

RefocusOnPointも同じように機能します。 この機能により、画像上の焦点を変更できます。

もちろん、実際の絞りの設定では、0〜100の範囲の値は機能しませんが、この例では非常に適しています。 必要に応じて、適切なアパーチャスケールに変換して、更新されたコードを送ってください。

RefocusOnPointは、 PXCMEnhancedPhotosクラスのDepthRefocus関数を使用して、元のカラー写真、ユーザーがクリックしたポイント、および絞り値を使用して、新しい深度フォーカスで新しい画像を作成します。 PXCMPhotoを受け取ったらQueryReferenceImage()を呼び出してPXCMImageにRSEnahncedImageArgのインスタンスを提供することにより、元の画像を取得します。 その後、 OnImageProcessedイベントを使用してクライアントアプリケーションに渡すだけです。

 public void DepthEnhancement( PXCMEnhancedPhoto.DepthFillQuality quality ) 

2つの値(高または低)の間で画像深度の品質を改善または変更します。 品質は、 DepthFillQualityパラメーターによって示されます。

最初に、 PXCMEnhancedPhotoのEnhanceDepth関数を呼び出してローカルPXCMPhotoイメージを初期化し、元のPXCMPhotoイメージと目的の品質を提供する必要があります。

次に、 PXCMImageを初期化するために、 EnhancedPhotoのQueryDepthImageを使用して、作成したばかりの深度イメージを取得します。

その後、 OnImageProcessedを使用してクライアントに送信する新しいRSEnhancedImageArgオブジェクトを作成します。

 public void DepthResize( ) 

これは、深度画像のサイズを変更する簡単な方法です。 この場合、深度イメージのサイズは、コンストラクターで作成された元のPXCMPhotoオブジェクトのカラーイメージと同じになります。

まず、カラー写真からサイズ情報が必要です。 これを行うには、コンストラクターで指定されたソースPXCMPhotoオブジェクトを要求します。 次に、DepthResize関数を含むPhotoUtilsオブジェクトをインスタンス化します。 元の画像のサイズを受け取ったら、必要なPXCMSizeI32オブジェクトに幅と高さの値を保存します。

簡単なプロセスを次に示します。DepthResize関数を呼び出し、PXCMPhotoオブジェクトと目的のサイズを指定して、PXCMEnhancedPhotoにイメージのサイズを変更するコマンドを与える必要があります。
サイズ変更後、すべてが通常どおりに行われます。 enhancedPhotoをポーリングして画像を作成し、RSEnhancedArgに入力して、 OnImageProcessedを使用してクライアントに送信します

 public void PastOnPlane( RSPoints points ) 

この関数は、PXCMPhotoイメージを平面に挿入する方法を示します。 同時に、挿入された画像は環境に適応します。 たとえば、壁に画像を挿入すると、画像は垂直に見え、同じ角度になります。 テーブルの表面に画像を貼り付けると、テーブルの上にあるように見えます。

最初に、2つの有効なポイントがあることを確認する必要があります。これは機能に必要です。
次に、 RSUtilityのLoadBitmap関数を使用して、挿入する画像を読み込みます。
この主なオブジェクトは、 PXCMEnhancedPhoto.Pasterクラスです。 これは、R5リリースの新しいクラスです。 PasterクラスにはPasteOnPlane関数があります。これは、以前はPXCMEnhancedPhotoクラスに含まれていましたが、この新しいクラスに移動されました。

この関数では、PastOnPlaneから返された値 null でないことを確認します。 実際には、 PasteOnPlane関数アクションを正常に完了できたという保証はありません。 たとえば、2点間の表面が平坦でない場合、関数は期待どおりに機能しません。 nullオブジェクトを使用していないことを確認したいだけです。

成功した結果が返された場合、元の画像を取得して保存し、RSEnhancedImageArgオブジェクトに渡し、クライアントアプリケーションに公開します。

RSUtility


RSUtilityは、他のクラスには適用されない機能を含む静的ヘルパークラスです。

 public static PXCMCapture.DeviceInfo GetDeviceByType(PXCMSession session, PXCMCapture.DeviceModel deviceType) 

これは、デバイス(この場合はR200カメラ)に関する詳細情報を取得するために設計された補助機能です。 この機能は、多くのRealSenseの例で実証されています。

まず、メイングループとしてセンサーが必要であることを示すフィルターを設定し、次にサブグループとしてビデオセンサーを指定します。

1つのシステムに複数のデバイスが存在する可能性があるため、可能なすべてのデバイスを順番に確認する必要があります。 繰り返しごとに、 currentGroupオブジェクトに現在のPXCMSession.ImplDescデータを入力します。 エラーがない場合は、次の手順に進み、 PXCMCaptureオブジェクトを入力します。

PXCMCaptureオブジェクト準備したら 、このオブジェクトに接続されているさまざまなデバイスを繰り返し処理します。 現在のデバイスに関する情報が必要なカメラと一致するかどうかを確認します。 その場合、サイクルは中断されます。 そうでない場合は、すべてのデバイスがチェックされるまで、 PXCMCaptureに接続されている次のデバイスに関する情報に進みます。

デバイスが見つかったら、それをクライアントに返します。この場合はRSStreamingオブジェクトです。

 public static Bitmap ToRGBBitmap( PXCMCapture.Sample sample ) 

ポリモーフィック関数は、 ToRGBBitmapPXCMImageイメージ)を呼び出すだけで、引数のサンプルのイメージを渡します。

 public static Bitmap ToRGBBitmap( PXCMImage image ) 

PXCMImageオブジェクトの機能を使用して、PXCMImage.ImageDataオブジェクトを使用してラスターデータを取得する単純な関数。 データが取得され、.NETラスターオブジェクトに格納され、クライアントに返されます。

 public static PXCMImage LoadBitmap( PXCMSession session ) 

この関数はPasteOnPlanesをサポートするために使用されます。 定義済みのビットマップをPXCMImageオブジェクトにロードし、クライアントに返します。

まず、ファイルへのパスを取得し、ファイルをチェックします。 そうでない場合は、nullを返します。 ファイルが存在する場合、新しい.NETラスターオブジェクトを作成し、ファイルからロードします。

PXCMImage.ImageInfoオブジェクト 、ビットマップに関する基本情報を保存するために使用されます。 PXCMImageオブジェクトの作成時に使用されます。 これらは、作成するイメージの仕様です。
次に、実際のビットマップデータを含むPXCMImage.ImageDataオブジェクトが必要です。 .NET BitmapDataオブジェクトは、必要なデータの形式と構造を記述するデータで作成および初期化されます。

Bitmap.Lockbitsの仕組みの詳細については、 こちらを参照してください 。 PXCMImageオブジェクトは、画像データへのアクセスを解放して、使用済みメモリを解放します。 ビットマップのロックが解除され、PXCMImageがクライアントに返されます。

 public static int GetDepthAtClickPoint( PXCMPhoto photo, PXCMPointI32 point ) 

この関数は、 PXCMPhotoおよびPXCMPointI32を受け入れます。

 public static bool SavePhoto( PXCMSession session, PXCMCapture.Sample sample ) 

写真をディスクに保存します。 このセッションを使用して、ディスクへの保存機能を備えた新しいPXCMPhotoオブジェクトを作成します。 PXCMPhotoオブジェクトは、プレビューサンプルからのインポートを使用して、画像データを自身にインポートします。 ファイルが存在するかどうかを調べます。 その場合、それを削除し、ファイルを保存します。

 public static PXCMPhoto OpenPhoto( PXCMSession session ) 

単純な機能:XDM写真がハードドライブに存在するかどうかを確認します。 その場合、 PXCMSessionオブジェクトを使用してPXCMPhotoを作成します。 次に、写真オブジェクトはXDMファイルをロードします。 関数は、PXCMPhotoをクライアントに返します。

RSPaintUtil


RSPaintUtilクラスは、写真に点と線を描画するヘルパークラスです。 さらに、このクラスを使用することにより、この機能に基づいた異なるフォーム間のコードの重複が削減されます。

これは便利な出発点です。 存在する場合、開始点のx、y値を指定して、新しい.NET Pointオブジェクトを作成します。

DrawCircle関数を呼び出して、クリックポイントの周りに円を描画します。

 static public void DrawTwoPointsAndLine( RSPoints points, PaintEventArgs e ) 

両方のポイントが有効であることを確認し、2つの新しい.NET Pointオブジェクトを作成します。 この関数は、これらのポイントに円を描き、各ポイントに対してDrawCircleを呼び出します。 次に、DrawLineを使用してそれらの間に線を描画します。

 static private void DrawCircle( Point p, PaintEventArgs e ) 

この関数は、x、y座標で.Net Pointオブジェクトの周りに円を描きます。 これは、新しいペンオブジェクトを作成することで実現されます。 円を描くには、長方形が必要です。 描かれる円のサイズを決定します。 これを行うために、境界ボックスを描画する関数を作成しました。 四角形を作成した後、 DrawEllipse関数と描画イベントの引数を使用して、四角形のサイズの円を描画します。

 static private void DrawLine( Point pointA, Point pointB, PaintEventArgs e ) 

円と同様に、.NET Penオブジェクトを作成し、その動作モードを選択し、 DrawLine関数とイベント引数を使用して、開始点と終了点の間に線を引く必要があります。

 static public Rectangle BuildBoundingRectangle( Point p ) 

中心がpのx、y座標を持つ点である.NET長方形オブジェクトを作成します。 これを行うために、新しいRectangleオブジェクトが作成されます。 境界ボックスを10 x 10ピクセルにしたかった。 値10 x 10は任意に選択しました。

Rspoints


RSPointsは、2つの異なるポイントを管理するためのシンプルなシェルです。 ドットは、ユーザーが.NET PictureBoxコントロールに表示されるPXCMPhoto写真をクリックした場所を示します。

開始点と終了点を表す2つのPXCMPointI32オブジェクトを使用します。 場合によっては、 RSPointsインスタンスは、たとえばRefocusOnPoint機能の開始点のみを必要とします。 それ以外の場合、MeasurePointsなど、開始点と終了点が必要なさまざまな機能に2つの有効な点が必要です。

このクラスは、2つのモードで動作します。1つの有効なポイントだけで十分なアクションが実行される場合はシングルポイントモードで、 MeasuPointsなどのアクセス可能な開始ポイントと終了ポイントが必要な場合はマルチポイントモードで動作します。

 public RSPoints( ) 

コンストラクターはシングルポイントモードをオンにし、 ResetPointsを呼び出してすべてのx、y値をリセットします。

 public void AddPoint( int x, int y ) 

これは、オブジェクトを配列またはリストに追加するのとほぼ同じです。 ただし、ご覧のとおり、ここには配列やリストはありません。 2点のみ。 このクラスをリストのように見せることにしたので、ポイントの配列を追加することにしました。 このクラスはよく考えられていますか? おそらくそれほどではないかもしれませんが、これまでのところあまり気にしません。これは単なるサポートクラスであり、必要なことを実行するなど、それほど重要ではありません。

シングルポイントモードでは、 AddPointsは常に開始点を置き換えます。 これはResetPointsオブジェクトを使用して行われます。

シングルポイントモードで作業する場合、他のポイントを追加する必要はありません。 既存の開始点をクリアして、新しい開始点を設定することをお勧めします。

RSSampleArg


RSSAmpleArgはEventArgsを継承します。 このクラスは、 RSStreamingで使用するためのものです。 RSStreamingがストリーミングしている場合、このクラスのインスタンスは新しいフレームごとに作成され、カメラからのデータが入力され、イベントクラスを使用してクライアントに送信されます。

 public RSSampleArg( PXCMCapture.Sample sample ) 

コンストラクターは、このパラメーターを使用してローカルPXCMCapture.Sample _sampleクラスオブジェクトを初期化します。

 public PXCMCapture.Sample Sample 

簡単な取得メソッドは、ローカルのPXCMCapture.Sampleオブジェクトを返します。

RSEnhancedImageArg


RSEnhancedImageArgはEventArgsを継承します。 このクラスは、 RSEnhancedPhotographyで使用するためのものです。 RSEnhancedPhotographyが画像の変更を完了すると、 RSEnhancedImageArgのインスタンスが作成され、新しく作成された画像が取り込まれ、クライアントがサブスクライブするイベントのクラスを介してクライアントに送信されます。

 public RSEnhancedImageArg( PXCMImage image ) 

フォームデザイナは、このクラスの唯一の変数であるPXCMImageオブジェクトを初期化します。

 public PXCMImage EnhancedImage 

簡単な取得メソッドは、PXCMImageのインスタンスを返します。

RSMeasureArg


RSMeasureArgはEventArgsを継承します。 このイベントは、 RSEnhancedPhotographyクラスのMeasurePoints関数で使用されます。 MeasurePoints関数距離を計算した後、このクラスのインスタンスを使用して、返された距離、精度、および精度データを格納します。 このオブジェクトを埋めた後、 Eventオブジェクトとともに使用して、クライアントアプリケーションにデータを送信します。

 public RSMeasureArg(float distance, float confidence, float precision) 

パラメータ


コンストラクターは、ローカルデータに入力パラメーターを設定します。

 public float Distance 

簡単な取得方法は、2つのポイント間の距離を返します。

 public float Confidence 

簡単な取得方法は、SDKの2つのポイント間の距離を処理して計算された信頼レベルを返します。

 public float Precision 

簡単な取得方法は、SDKの2点間の距離を処理することで計算された精度のレベルを返します。

フォームメイン


FormMainは、アプリケーションのメインフォームです。 これにより、ユーザーはストリーミングを有効または停止したり、他のフォームで拡張写真のさまざまな機能に使用される写真を撮ることができます。

このフォームは、 RSStreamingRGBオブジェクトを使用してカメラからデータをストリーミングします。 その後、D2D1Renderと呼ばれるIntel RealSense SDKヘルパーオブジェクトを使用して、.NET PictureBoxコントロールにデータが表示されます。

フォームは、 OnNewStreamingSample RSStreamingイベントにサブスクライブすることにより、 RSStreamingRGBから更新を受け取ります。

 public MainForm( ) 

これは一種のフォームデザイナーです。 グローバルフォームオブジェクトを初期化し、 RSStreamingRGBからのデータのイベントハンドラーを設定し、ボタンの目的の状態を設定します。

 private void rsRGBStream_NewSample( object sender, RSSampleArg sampleArg ) 

RSStreamingRGBオブジェクトのイベントハンドラー。 カラー画像を表示するかどうかを確認し、対応する選択を_renderオブジェクトに渡します。

次に、新しい写真を撮るためにチェックします。 必要に応じて、 RSUtilityを使用して写真をディスクに保存します。

 private void btnStream_Click( object sender, EventArgs e ) 

[ストリーム]ボタンをクリックしたときのイベントハンドラー。 RSStreamingRGBオブジェクトにストリーミングを開始するよう指示し 、アプリケーションの状態に応じてボタンを設定します。

 private void btnStopStream_Click( object sender, EventArgs e ) 

Stop Streamingボタンイベントハンドラーは、 StopStreaming関数を呼び出します。

 private void btnTakeDepthPhoto_Click( object sender, EventArgs e ) 

スナップショットボタンのイベントハンドラー。 スナップショットフラグをtrueに設定して、ストリーミングイベントハンドラーが現在の画像をディスクに保存し、フォームにストリーミングを停止するよう指示します。

 private void EnableEnhancedPhotoButtons( bool enable ) 

enable値を使用して、アプリケーションの状態に応じてボタンを設定します。
マルチスレッド処理がないため、おそらくこの機能は驚くでしょう。 . ? , ( RSStreamingRGB ), , .

StartStreaming RSStreaming .

 _senseManager.StreamFrames( false ); 

( Intel RealSense SDK) . - .

, , . Windows . , . EnableEnhancedButtons , . , . EnableEnhancedPhotobuttons . .

, InvokeRequired else, . , .

 private void EnableStreamButtons( bool enable ) 

, EnableEnhancedPhotoButtons , : .

 private void StopStreaming( ) 

, RSStreaming . , . .

.

 private void btnExit_Click( object sender, EventArgs e ) 

Exit. Close() .

 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 

FormClosing . , RSStreaming . , .

 private void btnDepthResize_Click( object sender, EventArgs e ) private void btnDepthEnhance_Click( object sender, EventArgs e ) private void btnRefocus_Click( object sender, EventArgs e ) private void btnPasteOnPlane_Click( object sender, EventArgs e ) private void btnBlending_Click( object sender, EventArgs e ) 

. , , . , RSUtility.OpenPhoto . OpenPhoto , . , , . すべてが非常に簡単です。

 private void btn_MouseEnter( object sender, EventArgs e ) 

Start Streaming, Take Photo Stop Streaming. , , Tag. , , , .

 private void btn_MouseLeave( object sender, EventArgs e ) 

.

FormMeasure


FormMeasure , Enhanced Photography. RSEnhancedPhotography Enhanced Photography Intel RealSense SDK.

 public FormMeasure( PXCMPhoto photo ) 

. PXCMPhoto, . OnImageMeasured .

 private void InitStatStrip( ) 

. 0, 0 x, y.

 private void rsEnhanced_OnImageMeasured(object sender, RSMeasureArg e) 

OnImageMeasured RSEnhancedPhotography . RSMeasuredArg , . .

 private void pictureBox1_MouseClick( object sender, MouseEventArgs e ) 

. , . , , /. . , . , .

, UpdatePointsStatus .

( ), MeasurePoints(…) RSEnhancedPhoto , . , , ResetPoints() RSPoint .

invalidate picturebox, . , . .

 private void UpdatePointStatus( ) 

; .

 private void pictureBox1_MouseMove( object sender, MouseEventArgs e ) 

; , . x, y .

 private void pictureBox1_Paint( object sender, PaintEventArgs e ) 

picturebox. .

, . , .

 private void Cleanup( ) 

.

 private void btnExit_Click( object sender, EventArgs e ) 

Exit .

 private void FormMeasure_FormClosing( object sender, FormClosingEventArgs e ) 

. .

FormDepthEnhance


, ; picturebox . .

 public FormDepthEnhance( PXCMPhoto photo ) 

, , picturebox , .

 private void rdo_Click( object sender, System.EventArgs e ) 

. DepthEnhancement(…) RSEnhancedPhoto, , .

 private void _rsEnhanced_OnImageProcessed( object sender, RSEnhancedImageArg e ) 

OnImageProcessed , RSEnhancedPhotography . picturebox renderer.

 private void btnExit_Click( object sender, System.EventArgs e ) 

Exit .

 private void Cleanup( ) 

, .

 private void FormDepthScaling_FormClosing( object sender, FormClosingEventArgs e ) 

. .

FormDepthResize


. PXCMPhoto.

 public FormDepthResize( PXCMPhoto photo ) 

. , , , OnImageProcessed .

 private void btnResize_Click( object sender, System.EventArgs e ) 

DepthResize(…) RSEnahancedPhoto .

 private void _rsEnhanced_OnImageProcessed( object sender, RSEnhancedImageArg e ) 

OnImageProcessed picturebox , renderer.

 private void btnExit_Click( object sender, System.EventArgs e ) 

Exit. .

 private void Cleanup( ) 

, .

 private void FormDepthResize_FormClosing( object sender, FormClosingEventArgs e ) 

Cleanup.

FormDepthRefocus


FormDepthRefocus Enhanced Photography Intel RealSense SDK. , : , .

, .

 public FormDepthRefocus( PXCMPhoto photo ) 

, . OnImageProcessed picturebox.

 private void pictureBox1_MouseClick( object sender, MouseEventArgs e ) 

picturebox. , RefocusOnPoint(…) . RSPoints ResPoints() .

 private void tbAperture_Scroll( object sender, System.EventArgs e ) 

. , , , RefocusOnPoint , : .

 private void _rsEnhanced_OnImageProcessed( object sender, RSEnhancedImageArg e ) 

OnImageProcessed RSEnhancedObjects . renderer picturebox.

 private void btnExit_Click( object sender, System.EventArgs e ) 

Exit. .

 private void Cleanup( ) 

, .

 private void FormDepthResize_FormClosing( object sender, FormClosingEventArgs e ) 

Cleanup.

FormDepthPasteOnPlane


: , . . Intel RealSense SDK , .

 public FormDepthPasteOnPlane( PXCMPhoto photo ) 

, . OnImageProcessed picturebox.

 private void _rsEnhanced_OnImageProcessed( object sender, RSEnhancedImageArg e ) 

OnImageProcessed RSEnhancedObjects . renderer picturebox.

 private void pictureBox1_MouseClick( object sender, MouseEventArgs e ) 

. , . , , /. . picturebox, .
, . , .

( ), MeasurePasteOnPlane(…) RSEnhancedPhoto, . , , ResetPoints() RSPoint.

 private void btnExit_Click( object sender, System.EventArgs e ) 

Exit. .

 private void Cleanup( ) 

, .

 private void FormDepthPasteOnPlane_FormClosing( object sender, FormClosingEventArgs e ) 

Cleanup.

FormDepthBlending


FormDepthBlending . , , , , Z , .

 public FormDepthBlending( PXCMPhoto photo ) 

, . OnImageProcessed picturebox.

 private void pictureBox1_MouseClick( object sender, MouseEventArgs e ) 

picturebox. , — . , . , Blend(), PXCMPhoto.

 private void Blend( ) 

, , DepthBlend RSEnhancedPhotograpy .

 private void tbBlend_Scroll( object sender, EventArgs e ) 

. Blend() .

 private void _rsEnhanced_OnImageProcessed( object sender, RSEnhancedImageArg e ) 

OnImageProcessed RSEnhancedObjects . renderer picturebox.

 private void btnExit_Click( object sender, System.EventArgs e ) 

Exit. .

 private void Cleanup( ) 

, .

 private void FormDepthBlending_FormClosing( object sender, FormClosingEventArgs e ) 

Cleanup.

おわりに


, Enhanced Photography, SDK. , . ご清聴ありがとうございました。

Source: https://habr.com/ru/post/J310804/


All Articles