使用EmguCV将图像的一部分复制到另一个图像

时间:2016-05-19 23:43:16

标签: opencv emgucv

我想将图像的中心部分(矩形)复制到完全白色Mat(到同一位置)。

代码:

        Mat src = Image.Mat;
        Mat dst = new Mat(src.Height, src.Width, DepthType.Cv8U, 3);
        dst.SetTo(new Bgr(255, 255, 255).MCvScalar);

        Rectangle roi = new Rectangle((int)(0.1 * src.Width), (int)(0.1 * src.Height), (int)(0.8 * src.Width), (int)(0.8 * src.Height));

        Mat srcROI = new Mat(src, roi);

        Mat dstROI = new Mat(dst, roi);

        srcROI.CopyTo(dstROI);

        //I have dstROI filled well. CopyTo method is doing well. 
        //However I have no changes in my dst file.

但是我只得到白色图片 - dst。里面没什么。

我做错了什么?

使用EmguCV 3.1

修改

我的垫子很dstROI。但是如何将更改应用于原始dst Mat现在存在问题。

像这样更改CopyTo

  srcROI.CopyTo(dst);

导致dst现在用我的src图像填充但不像我想要的那样在中心

编辑2

 src.Depth = Cv8U

正如您所建议,我检查IsSubmatrix属性的值。

   Console.WriteLine(dstROI.IsSubmatrix);         
   srcROI.CopyTo(dstROI);
   Console.WriteLine(dstROI.IsSubmatrix);

给出输出:

   true
   false

那可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

我知道一个古老的问题,但是当我搜索时出现了,因此这里的答案可能仍会在搜索中被找到。我有一个类似的问题,它可能是相同的问题。如果srcdst具有不同数量的通道或不同的深度,则将创建一个新的Mat。我看到它们的深度相同,但就我而言,我只有一个通道进入3通道Mat。如果您的src不是3通道Mat,则可能是问题所在(例如,可能是1(灰色)或4通道(BGRA))。

答案 1 :(得分:-1)

根据operator precedence rules of C#,类型转换的优先级高于乘法。

因此(int)0.8 * src.Width相当于0 * src.Width,同样适用于roi矩形的其他参数。因此,您创建roi的行基本上是

Rectangle roi = new Rectangle(0,0,0,0);

复制0大小的块无效,所以你留下了你之前创建的原始白色图像。

解决方案

正确填充表达式。

Rectangle roi = new Rectangle((int)(0.1 * src.Width)
    , (int)(0.1 * src.Height)
    , (int)(0.8 * src.Width)
    , (int)(0.8 * src.Height));