// Save raw debug frame to dump dir, and the following metadata: // Frame timestamp in micros // Face detection status // sensorID , led , projector public void DumpRawImage(rsid.PreviewImage image) { string filename; var timestamp_available = image.metadata.timestamp != 0; var prefix = timestamp_available ? $"timestamp_{image.metadata.timestamp}" : $"frame_{image.number}"; if (timestamp_available) { uint status = image.metadata.status; var sensorStr = (image.metadata.sensor_id != 0) ? "right" : "left"; var ledStr = (image.metadata.led) ? "led_on" : "led_off"; var projectorStr = (image.metadata.projector) ? "projector_on" : "projector_off"; filename = $"{prefix}_status_{status}_{sensorStr}_{projectorStr}_{ledStr}{Raw10Extension}"; } else // metadata isn't valid { filename = $"{prefix}{Raw10Extension}"; } var byteArray = new Byte[image.size]; Marshal.Copy(image.buffer, byteArray, 0, image.size); var fullPath = Path.Combine(_dumpDir, filename); using (var fs = new FileStream(fullPath, FileMode.Create, FileAccess.Write)) { fs.Write(byteArray, 0, byteArray.Length); } // clean old dumps every 100 frames if (image.number % 100 == 0) { CleanOldDumps(MaxFrameAge); } }
// Handle preview callback. private void OnPreview(rsid.PreviewImage image, IntPtr ctx) { if (image.height < 2) { return; } Dispatcher.Invoke(() => { var targetWidth = (int)PreviewImage.Width; var targetHeight = (int)PreviewImage.Height; //creae writable bitmap if not exists or if image size changed if (_previewBitmap == null || targetWidth != image.width || targetHeight != image.height) { PreviewImage.Width = image.width; PreviewImage.Height = image.height; Console.WriteLine($"Creating new WriteableBitmap preview buffer {image.width}x{image.height}"); _previewBitmap = new WriteableBitmap(image.width, image.height, 96, 96, PixelFormats.Bgr24, null); PreviewImage.Source = _previewBitmap; LabelPreview.Visibility = Visibility.Collapsed; // Hide preview placeholder once we have first frame } Int32Rect sourceRect = new Int32Rect(0, 0, image.width, image.height); _previewBitmap.WritePixels(sourceRect, image.buffer, image.size, image.stride); }, DispatcherPriority.Render); }
public void DumpPreviewImage(rsid.PreviewImage image) { using (var bmp = new Bitmap(image.width, image.height, image.stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, image.buffer)) { var bmpSrc = ToBitmapSource(bmp); var timestamp_available = image.metadata.timestamp != 0; var filename = timestamp_available ? $"timestamp_{image.metadata.timestamp}" : $"frame_{image.number}"; var fullPath = Path.Combine(_dumpDir, filename + ImageExtension); DumpBitmapImage(bmpSrc, image.metadata, fullPath); } // clean old dumps and mark algo images every 900 frames (~1/min on 15 fps) if (image.number % 900 == 0) { CleanOldDumps(MaxFrameAge); } }