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.

80 lines
2.2 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Intel.RealSense;
using UnityEngine;
[ProcessingBlockData(typeof(DepthCutoff))]
public class DepthCutoff : RsProcessingBlock
{
public ushort Distance = 1000;
ushort[] depthData;
void OnDisable()
{
depthData = null;
}
Frame ApplyFilter(DepthFrame depth, FrameSource frameSource)
{
using (var p = depth.Profile)
{
var count = depth.Width * depth.Height;
if (depthData == null || depthData.Length != count)
depthData = new ushort[count];
depth.CopyTo(depthData);
for (int i = 0; i < count; i++)
{
if (depthData[i] > Distance)
depthData[i] = 0;
}
var v = frameSource.AllocateVideoFrame<DepthFrame>(p, depth, depth.BitsPerPixel, depth.Width, depth.Height, depth.Stride, Extension.DepthFrame);
v.CopyFrom(depthData);
return v;
}
}
public override Frame Process(Frame frame, FrameSource frameSource)
{
if (frame.IsComposite)
{
using (var fs = FrameSet.FromFrame(frame))
using (var depth = fs.DepthFrame)
{
var v = ApplyFilter(depth, frameSource);
// return v;
// find and remove the original depth frame
var frames = new List<Frame>();
foreach (var f in fs)
{
using (var p1 = f.Profile)
if (p1.Stream == Stream.Depth && p1.Format == Format.Z16)
{
f.Dispose();
continue;
}
frames.Add(f);
}
frames.Add(v);
var res = frameSource.AllocateCompositeFrame(frames);
frames.ForEach(f => f.Dispose());
using (res)
return res.AsFrame();
}
}
if (frame is DepthFrame)
return ApplyFilter(frame as DepthFrame, frameSource);
return frame;
}
}