Я написал код ниже в своем коде XAML, чтобы показать кадры веб-камеры, полученные как Mat
с помощью метода Opencvsharp VideoCapture.Read()
в моем элементе управления изображением с именем View
.
Mat mat = new Mat();
VideoCapture videoCapture = new VideoCapture(2);
while (true)
{
videoCapture.Read(mat);
viewer.Source = mat.ToBitmapImage();
if (btn_stop.IsPressed)
{
break;
}
}
videoCapture.Release();
Как вы можете видеть, я использовал конвертер для преобразования формы Mat в BitmapImage, чтобы я мог использовать его в качестве источника изображения для моего элемента управления. вот преобразователи, которые я использовал:
static class Converters
{
public static BitmapImage ToBitmapImage(this Bitmap bitmap)
{
BitmapImage bi = new BitmapImage();
MemoryStream ms = new MemoryStream();
bi.BeginInit();
bitmap.Save(ms, ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
return bi;
}
public static BitmapImage ToBitmapImage(this Mat mat)
{
return BitmapConverter.ToBitmap(mat).ToBitmapImage();
}
}
Просто этот код ничего не показывает в моем элементе управления изображением, и приложение зависает. Я знаю, что этот код генерирует слишком много мусора, и я ничего не могу с этим поделать. Любые идеи о моей проблеме? Я также изменил свой код с помощью инструкций, приведенных в этой ссылке, как показано ниже:
viewer.Source = (BitmapSource)new ImageSourceConverter().ConvertFrom(mat.ToBytes());
а также эти преобразователи:
public static BitmapImage ToBitmapImage(this Mat mat)
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = new System.IO.MemoryStream(mat.ToBytes());
image.EndInit();
return image;
}
public static BitmapImage ToBitmapImage(this Mat mat)
{
using (var ms = new System.IO.MemoryStream(mat.ToBytes()))
{
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = ms;
image.EndInit();
return image;
}
}
ни один из них не работал для меня.
bi.CacheOption = BitmapCacheOption.OnLoad;
- person Clemens   schedule 29.01.2018while (true)
блокирует поток пользовательского интерфейса. Вместо этого используйте таймер, например. DispatcherTimer. - person Clemens   schedule 30.01.2018