如何在Emgu (C#的OpenCV)中将Mat裁剪为ROI

3
我找到的一些答案建议使用:
frame = ...
Rectangle ROI = ...
Mat crop = new Mat(frame, ROI) 

但这在Emgu 3.x中似乎无法工作

3个回答

7

Ahmed,您不必创建一个 Image<> 就可以创建一个 Mat。请尝试以下操作:

Mat myNewMat = new Mat(input, crop_region);

由于您没有旋转矩形,因此无需将旋转矩形转换为正常矩形。 因此,您只需从现有的Mat和矩形创建一个新的Mat即可。

这应该可以工作,并且可以简化您的代码。

Doug


3
我明白了。要剪裁一个Mat,您需要使用Image对象作为缓冲区,并使用它的.ROI属性:
Mat crop_color_frame(Mat input, Rectangle crop_region)
{
  /*
   * TODO(Ahmed): Figure out why I had to copy this into this class.
   * */
  Image<Bgr, Byte> buffer_im = input.ToImage<Bgr, Byte>();
  buffer_im.ROI = crop_region;

  Image<Bgr, Byte> cropped_im = buffer_im.Copy();


  return cropped_im.Mat;

}

嗨,我卡在这里了。在我得到Mat myNewMat = new Mat(input, crop_region);之后,我无法使用VideoWriter保存它,例如writer.Write(myNewMat);。 - golu

0
Ahmed,什么不起作用?你没有得到一个带有数据的Mat吗?“frame”是什么?“frame”是一个Mat吗?你的ROI是否是一个RotatedRect?因为如果你使用RotatedRect,那么你是正确的,它不会起作用。如果frame是一个Mat,那么你所做的应该完全没问题。需要一些关于哪里出了问题的细节。

这只是一个语法错误,但我找到了在C#中裁剪帧的正确方法。 - Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接