我想将图像的中心部分(矩形)复制到完全白色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
那可能出现什么问题?
答案 0 :(得分:1)
我知道一个古老的问题,但是当我搜索时出现了,因此这里的答案可能仍会在搜索中被找到。我有一个类似的问题,它可能是相同的问题。如果src
和dst
具有不同数量的通道或不同的深度,则将创建一个新的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));