Есть ли более эффективный способ отображения изображений с камеры в реальном времени в настольном приложении C#?C#

Место общения программистов C#
Anonymous
Есть ли более эффективный способ отображения изображений с камеры в реальном времени в настольном приложении C#?

Сообщение Anonymous »

Я пытаюсь отобразить изображения с камеры LUCID в настольном приложении C#. Камера поставляется с SDK, и получение изображения занимает от 20 до 35 мс на одно изображение. Проблема в том, что у меня очень мало (2-5) FPS и я не знаю, как увеличить их примерно до 10-15. Когда я запускаю программу, мой процессор загружен примерно на 30%. Это заставляет меня думать, что я делаю что-то не так. Разрешение камеры также невелико: около 2400x1500 пикселей.
Мой вопрос: знаете ли вы, ребята, лучший способ отображения/рендеринга изображений в настольном приложении C#?
Заранее спасибо!
Сначала я создал приложение Windows Forms на C# с графическим полем, которое обновил после получения текущего изображения (изменив интервал таймера). ФПС не менялся). Я пробовал такие варианты, как двойная буферизация или повторная обработка только изображения вместо всей формы.
Мой текущий подход использует WPF, но производительность такая же низкая.
Этот вызов возвращает текущее изображение с камеры в виде System.Drawing.Image
myCameraManager.getImageById(serialNumber);

А вот мой текущий код WPF:
MainWindow.xaml.cs:
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using System.Drawing;
using System.IO;
using System.Diagnostics;
using StrelenViewerWPF;

namespace CameraApp
{
public partial class MainWindow : Window
{
private DispatcherTimer imageTimer;
private DispatcherTimer fpsTimer;
private CameraManager myCameraManager;

private Stopwatch frameStopwatch;
private int frameCount;
private double fpsValue;

// Stopwatches for performance measurement
private Stopwatch fetchStopwatch;
private Stopwatch conversionStopwatch;
private Stopwatch uiUpdateStopwatch;

public MainWindow()
{
InitializeComponent();
myCameraManager = new CameraManager();
InitializeCameraFeed();
}

private void InitializeCameraFeed()
{
// Initialize the DispatcherTimer for image updates
imageTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(50) // 20 FPS
};
imageTimer.Tick += ImageTimer_Tick;
imageTimer.Start();

// Initialize the DispatcherTimer for FPS updates
fpsTimer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(1) // Update FPS every second
};
fpsTimer.Tick += FpsTimer_Tick;
fpsTimer.Start();

// Initialize performance tracking
frameStopwatch = new Stopwatch();
frameStopwatch.Start();

fetchStopwatch = new Stopwatch();
conversionStopwatch = new Stopwatch();
uiUpdateStopwatch = new Stopwatch();
}

private void ImageTimer_Tick(object sender, EventArgs e)
{
// Fetch images from the camera and update the UI
UpdateImage(Camera1, myCameraManager.allCameras[0].serialNumber);
}

private void UpdateImage(System.Windows.Controls.Image imageControl, string serialNumber)
{
fetchStopwatch.Restart();
var image = myCameraManager.getImageById(serialNumber);
fetchStopwatch.Stop();

if (image != null)
{
// Convert image to BitmapImage
conversionStopwatch.Restart();
var bitmapImage = BitmapToImageSource(image);
conversionStopwatch.Stop();

// Update UI
Dispatcher.Invoke(() =>
{
uiUpdateStopwatch.Restart();
imageControl.Source = bitmapImage; // Update UI on the UI thread
uiUpdateStopwatch.Stop();

// Increment frame count for FPS calculation
frameCount++;
});
}
}

private BitmapImage BitmapToImageSource(System.Drawing.Image image)
{
using (var memory = new MemoryStream())
{
image.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;

var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();

return bitmapImage;
}
}

private void FpsTimer_Tick(object sender, EventArgs e)
{
// Calculate FPS
double elapsedSeconds = frameStopwatch.Elapsed.TotalSeconds;
fpsValue = frameCount / elapsedSeconds;

// Reset for next interval
frameCount = 0;
frameStopwatch.Restart();

// Update FPS display
FpsLabel1.Text = $"{fpsValue:0.0} FPS";
}

protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
imageTimer.Stop();
fpsTimer.Stop();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... rp-desktop

Вернуться в «C#»