opencvsharp BitmapSource图片截取问题

private BitmapSource GetUiImage(FrameworkElement ui)
{
RenderTargetBitmap bmp=new RenderTargetBitmap((int)ui.ActualWidth,(int)ui.ActualHeight,96d,96d, PixelFormats.Default);
bmp.Render(ui);
return bmp;
}

获取控件当前呈现的图像,然后从这个图像中截取一部分区域,我这边先用的方法如下:

using (Mat mat = bmp.ToMat())
{
  Rect rect1 = new Rect((int) rect.Left, (int) rect.Top, (int) rect.Width, (int) rect.Height);
  using (Mat mat8U = mat[rect1])
  {
    return mat8U.ToBitmap();
  }
}

但是在执行的时候一直抱如下错误:

Depth of the image must be CV_8U

原来bmp.ToMat()转换后的mat是一个CV_32U的,在执行ROI区域截取时就会出错。

那么看来是不能直接用tomat方法,只能换个方法转换,如下:

BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (Stream sr = new MemoryStream())
{
    encoder.Save(sr);
    using (Mat mat = Mat.FromStream(sr, ImreadModes.Color))
    {
        Rect rect1 = new Rect((int) rect.Left, (int) rect.Top, (int) rect.Width, (int) rect.Height);
        using (var mat1 = mat[rect1])
        {
            return mat1.ToBitmap();
        }

    }
}
View Code

执行,完美通过。

原文地址:https://www.cnblogs.com/sczmzx/p/10997693.html