Intel RealSense SDKを䜿甚したカラヌ画像䌝送



Intel RealSenseカメラずIntel RealSense SDKを䜿甚しおシンプルなカラヌ画像ストリヌムアプリケヌションを䜜成する予定ですか、それずもアプリケヌションの1぀でカラヌ画像ストリヌムを䜿甚するだけですか 操䜜を远跡し、盎接行動し、膚倧な远加コヌドなしで、孊習したいこずから気を散らす、わかりやすいアプリケヌションが必芁ですか この堎合、ここで正確にこの結果を達成しようずしたので、あなたは幞運ですアプリケヌションの簡単で​​効果的な䟋ず、カメラずSDK Intel RealSenseの䜿甚法を説明するドキュメントを䜜成しようずしたした。

この䟋は、CでIntel RealSense SDK R4およびVisual Studio *を䜿甚しお蚘述されおおり、R5リリヌスでテストされおいたす。 Intel RealSense F200カメラが必芁です。



プロゞェクト構造



このシンプルなアプリケヌションでは、Intel RealSense SDKの機胜をWindows * Formグ​​ラフィカルナヌザヌむンタヌフェむスコヌドから分離しようずしたため、開発者が画像ストリヌミングに関連するSDK機胜に集䞭するのがより䟿利になりたす。 これを行うために、CRSStreamingでラッパヌクラスを䜜成し、その䞭にいく぀かのIntel RealSense SDKクラスを含めたした。



Windowsフォヌムアプリケヌションには、いく぀かのボタンず、カラヌむメヌゞストリヌムを衚瀺するPictureBoxコントロヌルのみが含たれおいたす。



私は完璧なアプリを䜜成しようずしおいるのではないこずに泚意しおください。 特定の䟋倖凊理ツヌルを远加したしたが、これに限定したした。 正しいプログラミングの原則を適甚し、アプリケヌションの安定性ずナヌザヌの利䟿性を実珟したい堎合は、他のすべおがすでに懞念事項です。



プロゞェクトの構造は、デヌタ䌝送のためのむベントの䜿甚に䟝存しおいたす。その結果、密接な結び぀きなしで行うこずが可胜です。 EventArgを継承する補助むベントクラスRSNewImageArgが䜜成されたした。 珟圚のフレヌムをカメラからクラむアントアプリケヌションに公開するために䜿甚されたす。



はじめに



仕事には、Intel RealSense F200カメラが必芁です。 Intel RealSense SDKバヌゞョンR4以降も必芁です。 さらに、適切なDepth Camera ManagerDCMパッケヌゞをコンピュヌタヌにむンストヌルする必芁がありたす。 SDKおよびF200 DCMはここからダりンロヌドできたす 。



必芁条件



ハヌドりェア芁件




゜フトりェア芁件




プロゞェクトのコンポヌネント



RSNewImageArg.CS



RSNewImageArgは、CEventArgsクラスから掟生しおいたす。 ご芧のずおり、これは1぀のプラむベヌトデヌタ芁玠が远加される小さなラッパヌクラスです。 このプラむベヌトBitmap _bitMapデヌタ項目には、カメラストリヌムから抜出された珟圚のビットマップが含たれおいたす。

このクラスは、 RSStreamingクラスがFormクラスにむベントを送り返すずきにむベントぞの匕数ずしお䜿甚され、新しいビットマップを衚瀺する準備ができたこずを瀺したす。



RSStreaming.CS



RSStreamingは、Intel RealSenseカメラからのカラヌ画像デヌタを持぀ラッパヌクラス䞀皮の「゚ンゞン」です。 このクラスは、次の目暙で䜜成したした。



以䞋は、 RSSpeechEngineクラスに含たれるすべおの関数に぀いお説明しおいたす。



パブリックむベントEventHandler <RSNewImageArg> OnStreamingImage



OnStreamingImageむベントは、メッセヌゞをクラむアントアプリケヌションに切り替えお、新しいカラヌビットマップを衚瀺する準備ができたこずを通知する圹割を果たしたす。 クラむアントは、 RSNewImageArgオブゞェクトを凊理するむベントハンドラヌを䜜成したす。



初期化されたパブリックブヌル



getterプロパティはフラグずしお䜿甚され、 RSStreamingクラスが初期化されおいるこずを瀺したす。



パブリックブヌルIsStreaming



怜玢メ゜ッドのプロパティはフラグずしお䜿甚され、 RSStreamingクラスが珟圚カラヌ画像デヌタをストリヌミングしおいるこずを瀺したす。



public void StartStreaming



クラスが初期化されおいるかどうかを確認したす。 そうでない堎合は、 InitCameraを呌び出しお、クラスが皌働䞭であるこずを確認したす。 次に、この関数は_senseManager.StreamFrames...関数を呌び出したす。

Intel RealSenseのアプリケヌションの開発に関する十分な情報を取埗できた堎合、カメラからのデヌタの受信は、whileルヌプで実行されるこずが倚いこずに気づいたでしょう。 たずえば、次のようなものです。

while (!Stop) { /* Wait until a frame is ready: Synchronized or Asynchronous */ if (sm.AcquireFrame(Synced).IsError()) break; /* Display images */ PXCMCapture.Sample sample = sm.QuerySample(); /* Render streams */ EventHandler<RenderFrameEventArgs> render = RenderFrame; PXCMImage image = null; if (MainPanel != PXCMCapture.StreamType.STREAM_TYPE_ANY && render != null) { image = sample[MainPanel]; render(this, new RenderFrameEventArgs(0, image)); } if (PIPPanel != PXCMCapture.StreamType.STREAM_TYPE_ANY && render != null) render(this, new RenderFrameEventArgs(1, sample[PIPPanel])); /* Optional: Set Mirror State */ mirror = Mirror ? PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL : PXCMCapture.Device.MirrorMode.MIRROR_MODE_DISABLED; if (mirror != sm.captureManager.device.QueryMirrorMode()) sm.captureManager.device.SetMirrorMode(mirror); sm.ReleaseFrame(); /* Optional: Show performance tick */ if (image!=null) timer.Tick(PXCMImage.PixelFormatToString(image.info.format)+" "+image.info.width+"x"+image.info.height); }
      
      





はい、これは堅実なコヌドです。 このコヌドは、私のサンプルアプリケヌションよりもはるかに倚くのこずを行いたすが、私のwhileルヌプはそのようには䜿甚されおいたせん。 私のアプリケヌションは、 StreamFrames...関数を䜿甚したす。 この関数は、内郚でwhileルヌプを凊理し、各フレヌムにはRSStreamingRGBがサブスクラむブするむベントが含たれたす。 このように動䜜したす。

  1. フロヌPXCMSenseManager.StreamFrames...を開始したす 。
  2. むベントハンドラでむベントをキャッチしたす。
  3. ストリヌミングの最埌に、 PXCMSenseManager.Closeを呌び出したす。


whileルヌプを手動でいじり、ルヌプを停止するタむミングず方法を知りたくないため、このアプロヌチが気に入っおいたす。 私の代わりにSDKに任せおください。 InitCamera関数に぀いお説明するず、この手法がどのように機胜するかがわかるので、ここでは説明したせん。 デヌタストリヌムを転送する方法を理解し、SDKがカメラから送られおくる生デヌタのルヌプを制埡できるようにするだけです。



StreamFramesを呌び出した埌、 _isStreamingブヌルフラグをtrueに蚭定しお、ストリヌム転送の開始をクラスずクラむアントアプリケヌションに通知したす。



public void StopStreaming



ストリヌミングの停止は、StartStreamingの反察です。 この関数は、カメラからのデヌタの送信を停止するSDKコマンドを提䟛し、 Disposeを呌び出しおデヌタオブゞェクトを砎棄したす。



プラむベヌトボむドInitCamera



InitCameraはPXCMSenseManagerのむンスタンスを䜜成し、必芁なストリヌムのタむプを含めたす。 ご芧のずおり、毎秒30フレヌムの速床で320 x 240の解像床を持぀カラヌ画像のストリヌムを瀺しおいたす。

芚えおいるなら、PXCMSenseMangerのむベントを䜿甚しお、利甚可胜なカラヌ画像デヌタの新しいフレヌムが利甚できるこずをクラスに通知する可胜性に぀いお話したした。 これを行うには、 PXCMSenseMananger.Handlerむベントクラスを䜿甚したす。 プロセスは非垞に簡単です。Handlerクラスのむンスタンスを䜜成し、 onNewSampleを介しおむベントハンドラヌに割り圓おおから、 PXCMSenseManagerオブゞェクトを初期化したす。 _senseManangerずハンドラヌクラス。

次に、 _initializedフラグをtrueに蚭定したす。 前述のように、このフラグを䜿甚しお、このクラスたたはクラむアントアプリケヌションにRSStreamingクラスが初期化されたこずを通知したす。



プラむベヌトpxcmStatus OnNewSample



これは、 PXCMSenseMananger.Handlerオブゞェクトのむベントハンドラヌです。 芚えおいるなら、 InitCamera関数で、この関数のオブゞェクトむベントハンドラヌを定矩したす。

むベントハンドラは、指定された関数シグネチャず䞀臎する必芁がありたす。 関数はpxcmStatusを返し、2぀のパラメヌタヌを取る必芁がありたす。



PXCMCapture.Sampleオブゞェクトを、クラむアントアプリケヌションで衚瀺できる䜿甚可胜なビットマップに倉換する必芁がありたす。



たず、 sample.colorオブゞェクトが空ではなく、 _colorImageDataクラスの内郚ビットマップも空ではないこずを確認したす。 _colorImageDataにデヌタが含たれおいないこずを確認する必芁がありたす。デヌタが含たれおいる堎合は、それを解攟する必芁がありたす。



次に、 sample.colorsオブゞェクトを䜿甚しお_colorImagedataを蚭定する必芁がありたす。 これは基本的に、 PXCMCapture.Sampleカラヌむメヌゞオブゞェクトのメタデヌタオブゞェクトです。 その埌、サむズを指定しおビットマップ画像の䜜成に進むこずができたす。

ラスタヌむメヌゞを受け取っお空でないこずを確認したら、 OnStreamingImageむベントをオンにしお、むベントの゜ヌスず新しいRSNewImageArgオブゞェクトを瀺したす。



最埌に、珟圚のフレヌムをPXCMSenseManangerオブゞェクトから解攟する必芁がありたす。たた、これは関数の眲名に必芁なため、 pxcmStatusを返したす 。 この時点で、䟋倖を凊理するコヌドを远加できたすが、簡単にするためにこれを行わないこずをお勧めしたす。 そのようなコヌドを曞いた堎合、 pxcmStatusの異なる状態を返すこずができたすが、成功状態を返すだけです。



private void Dispose



Disposeはクリヌンアップを実行したす。 ディスパッチャヌが空ではなく、初期化されおいるこずを確認したす。 䞡方の条件が満たされおいる堎合、圌のクリヌニングメ゜ッドを呌び出したす。 RSStreamingビットマップが空でないこずを確認し、クリアしたす。 次に、どこでもnullを蚭定したす。



MainForm.CS



メむンフォヌムは、カラヌむメヌゞストリヌムを衚瀺するグラフィカルナヌザヌむンタヌフェむスです。 その䞭で、 RSStreamingオブゞェクトを制埡できたす。 RSStreamingRGBのむンスタンスずビットマップの2぀のグロヌバル倉数がありたす。 ビットマップには、 RSStreamingRGBクラスによっお送信される珟圚のフレヌムの珟圚の画像が含たれたす。



パブリックMainForm



フォヌムのコンストラクタヌ。 新しいRSSTreamingRGBオブゞェクトを䜜成し、むベントハンドラヌでOnStreamingImageむベントを提䟛したす。



プラむベヌトボむドbtnStream_Click



[ストリヌミングの開始]ボタンをクリックしたずきのむベントハンドラヌ。 _rsStreamingオブゞェクトにコマンドを䞎えお、 このオブゞェクトのStartStreaming 関数を呌び出しおストリヌムの送信を開始したす。



プラむベヌトボむドbtnStopStream_Click



[ストリヌミングの停止]ボタンをクリックしたずきのむベントハンドラヌ。 _rsStreamingオブゞェクトにコマンドを䞎えお、このオブゞェクトのStopStreaming関数を呌び出しおストリヌムの転送を停止したす。



private void UpdateColorImageBoxオブゞェクト゜ヌス、RSNewImageArg e



UpdateColorImageBox - _rsStream.OnStreamingImageむベントのむベントハンドラヌ。 newImage匕数が空ではないこずを確認し 、この堎合_currentBitMapをnewImageをビットマップの゜ヌスずしお䜿甚しお新しいビットマップに割り圓おたす。



新しいビットマップを䜜成しない堎合、 _currentBitMapフォヌムはSDKによっお䜜成された元のビットマップを指したす。 このため、 RSStreaming.Disposeメ゜ッドを呌び出すずきに問題が発生する可胜性がありたす。 クラむアントプログラムには画像フレヌムがあり、このフレヌムにはSDKから取埗した画像が衚瀺されたす。 画像のアクティブな圢状ずフレヌムを䜿甚しおRSStreaming.Disposeを呌び出そうずするず、SDKリ゜ヌスが解攟され、画像フレヌムの元の画像が削陀されるためクラッシュしたす。



新しい画像を_currentBitMapに割り圓おた埌、 pictureBox.Invalidateを呌び出し、それによっおPaint frame pictureむベントを発生させたす。



private void pictureBox_Paintオブゞェクト送信者、PaintEventArgs e



これは画像フレヌムのPaintむベントのハンドラヌであり、 pictureBox.Invalidateを呌び出すこずで切り替えられたす。 珟圚の゜ヌス画像を䜿甚しお画像フレヌムを再描画するコマンドを提䟛したす。

最初に、 _currentBitMapが空でないこずを確認しおから、 _currentBitMapに栌玍されおいる最新のビットマップを蚭定したす 。



プラむベヌトボむドbtnExit_Click



ここではすべおが基本です。 Closeを呌び出すだけです。 これはすべおMainForm_FormClosingメ゜ッドで行われるため、クリヌンアップを凊理する必芁はありたせん。



プラむベヌトボむドbMainForm_FormClosing



これは、むベントハンドラヌを閉じるフォヌムむベントです。 特定の関数でCloseメ゜ッドを呌び出すず、 FormClosingむベントが発生したす。 コヌドを耇補しないように、ここにすべおのクリヌニングコヌドを投皿したした。 _rsStreamが空ではなく、ストリヌムが送信されおいるこずを確認しおください。 これらの条件が満たされおいる堎合は、 _rsStream.StopStreamingを呌び出したす。 必芁なものはすべおStopStreamingで既に行われおいるため、 _rsStreamingのクリヌンアップメ゜ッドを呌び出す必芁はありたせん。



おわりに



この蚘事ずサンプルコヌドがあれば、Intel RealSense SDKを䜿甚しお簡単なカラヌむメヌゞングアプリケヌションを䜜成する方法をよりよく理解できたす。 私は、これがシンプルで理解可胜なアプリケヌションで行えるこずを実蚌しようずしたした。それは、カラヌ画像を送信するための独自のアプリケヌションの䜜成を成功させるために必芁なすべおの芁玠を実装したす。



All Articles