You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Kinect-Project/Sources/Lib/InfraredImageStream.cs

97 lines
3.2 KiB

using Microsoft.Kinect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows;
namespace Lib
{
class InfraredImageStream : KinectStream
{
private InfraredFrameReader reader;
private byte[] infraredPixels;
public byte[] InfraredPixels
{
get { return infraredPixels; }
private set { infraredPixels = value; }
}
public InfraredFrameReader Reader
{
get { return reader; }
private set { reader = value; }
}
public InfraredImageStream(KinectManager kinectManager)
: base(kinectManager)
{
var frameDescription = KinectManager.Sensor.InfraredFrameSource.FrameDescription;
this.Bitmap = new WriteableBitmap(
frameDescription.Width,
frameDescription.Height,
96.0,
96.0,
PixelFormats.Gray8,
null
);
reader = KinectManager.Sensor.InfraredFrameSource.OpenReader();
reader.FrameArrived += Reader_InfraredFrameArrived;
infraredPixels = new byte[frameDescription.Width * frameDescription.Height];
}
public override void Stop()
{
if (reader != null)
{
reader.Dispose();
reader = null;
}
}
private void ProcessInfraredFrameData(ushort[] frameData, uint frameDataSize)
{
// Convertir les données infrarouges en niveaux de gris
for (int i = 0; i < frameDataSize; ++i)
{
// Convertir la valeur infrarouge en une intensité lumineuse
byte intensity = (byte)(frameData[i] >> 8);
InfraredPixels[i] = intensity;
}
}
private void Reader_InfraredFrameArrived(object sender, InfraredFrameArrivedEventArgs e)
{
using (InfraredFrame infraredFrame = e.FrameReference.AcquireFrame())
{
if (infraredFrame != null)
{
FrameDescription infraredFrameDescription = infraredFrame.FrameDescription;
// Créez un tableau pour stocker les données infrarouges
ushort[] infraredData = new ushort[infraredFrameDescription.LengthInPixels];
infraredFrame.CopyFrameDataToArray(infraredData);
// Traitez les données infrarouges
ProcessInfraredFrameData(infraredData, infraredFrameDescription.LengthInPixels);
// Mettez à jour le bitmap infrarouge
this.Bitmap.WritePixels(
new Int32Rect(
0,
0,
infraredFrameDescription.Width,
infraredFrameDescription.Height
),
this.infraredPixels,
infraredFrameDescription.Width,
0
);
}
}
}
}
}