Intel RealSense最基本的功能就是『彩色影像』,
其實Intel的SDK都有相當多Sample可以參考,
不過小弟資質駑鈍看不懂,所以爬文後才做出此功能。
其實Intel的SDK都有相當多Sample可以參考,
不過小弟資質駑鈍看不懂,所以爬文後才做出此功能。
![]() |
| 成果圖 |
if "$(Platform)" == "x86" ( copy /y "$(RSSDK_DIR)\bin\win32\libpxccpp2c.dll" "$(TargetDir)" ) else (copy /y "$(RSSDK_DIR)\bin\x64\libpxccpp2c.dll" "$(TargetDir)" )
(二)、加入參考 libpxcclr.cs.dll
※注意是\\...\x64 ,而不是\\...\win32
(三)、人機介面
- StackPanel
- Image:imgColorStream
- Label:lblMessag
Mainwindow.xml
<Window x:Class="ColorRealSense.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ColorRealSense"
mc:Ignorable="d"
Title="ColorRealSense" Height="635" Width="715"
WindowStartupLocation="CenterScreen"
Closing="Window_Closing"
Loaded="Window_Loaded"
ResizeMode="CanMinimize">
<Grid>
<StackPanel>
<Image x:Name="imgColorStream" />
<Label x:Name="lblMessage" Content="Label" HorizontalAlignment="Center" FontSize="24" />
</StackPanel>
<Image x:Name="image" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="260" Source="D:\C#\ColorRealSense\ColorRealSense\logo\logo.png"/>
</Grid>
</Window>
- Right-click ColorRealSensein Solution Explorer.
- Select Add, New Item…
- Select Class and name it ConvertBitmap.cs.
- Click the Add button.
using System;
using System.Windows.Media.Imaging;
namespace ColorRealSense
{
class ConvertBitmap
{
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr handle);
public static IntPtr intPointer;
private static BitmapSource bitmapSource;
public static BitmapSource BitmapToBitmapSource(System.Drawing.Bitmap bitmap)
{
intPointer = bitmap.GetHbitmap();
bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(intPointer,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
DeleteObject(intPointer);
return bitmapSource;
}
}
}
(五)、後版設計
Mainwindow.xml.cs
using System;
using System.Windows;
using System.Windows.Media;
using System.Threading;
using System.Drawing;
namespace ColorRealSense
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
private Thread processingThread;
private PXCMSenseManager senseManager;
private PXCMHandModule hand;
private PXCMHandConfiguration handConfig;
private PXCMHandData handData;
private PXCMHandData.GestureData gestureData;
private bool handWaving;
private bool handTrigger;
private int msgTimer;
public MainWindow()
{
InitializeComponent();
handWaving = false;
handTrigger = false;
msgTimer = 0;
// Instantiate and initialize the SenseManager
senseManager = PXCMSenseManager.CreateInstance();
senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 640, 480, 30);
senseManager.EnableHand();
senseManager.Init();
// Configure the Hand Module
hand = senseManager.QueryHand();
handConfig = hand.CreateActiveConfiguration();
handConfig.EnableGesture("wave");
handConfig.EnableAllAlerts();
handConfig.ApplyChanges();
// Start the worker thread
processingThread = new Thread(new ThreadStart(ProcessingThread));
processingThread.Start();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
processingThread.Abort();
if (handData != null) handData.Dispose();
handConfig.Dispose();
senseManager.Dispose();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
lblMessage.Content = "(RealSense)";
}
private void ProcessingThread()
{
// Start AcquireFrame/ReleaseFrame loop
while (senseManager.AcquireFrame(true) >= pxcmStatus.PXCM_STATUS_NO_ERROR)
{
PXCMCapture.Sample sample = senseManager.QuerySample();
Bitmap colorBitmap;
PXCMImage.ImageData colorData;
// Get color image data
sample.color.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB24, out colorData);
colorBitmap = colorData.ToBitmap(0, sample.color.info.width, sample.color.info.height);
// Retrieve gesture data
hand = senseManager.QueryHand();
if (hand != null)
{
// Retrieve the most recent processed data
handData = hand.CreateOutput();
handData.Update();
handWaving = handData.IsGestureFired("wave", out gestureData);
}
// Update the user interface
UpdateUI(colorBitmap);
// Release the frame
if (handData != null) handData.Dispose();
colorBitmap.Dispose();
sample.color.ReleaseAccess(colorData);
senseManager.ReleaseFrame();
}
}
private void UpdateUI(Bitmap bitmap)
{
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate ()
{
if (bitmap != null)
{
// Mirror the color stream Image control
imgColorStream.RenderTransformOrigin = new System.Windows.Point(0.5, 0.5);
ScaleTransform mainTransform = new ScaleTransform();
mainTransform.ScaleX = -1;
mainTransform.ScaleY = 1;
imgColorStream.RenderTransform = mainTransform;
// Display the color stream
imgColorStream.Source = ConvertBitmap.BitmapToBitmapSource(bitmap);
// Update the screen message
if (handWaving)
{
lblMessage.Content = "Hello World!";
handTrigger = true;
}
// Reset the screen message after ~50 frames
if (handTrigger)
{
msgTimer++;
if (msgTimer >= 50)
{
lblMessage.Content = "(Wave Your Hand)";
msgTimer = 0;
handTrigger = false;
}
}
}
}));
}
}
}




沒有留言:
張貼留言