如何替换Mat图像的矩形区域

4
我正在使用opencv图像处理库。我只想用另一张小图片替换原始Mat图像中的矩形区域(小于原始图像)。我找不到如何实现它的方向。
请问是否有人能帮助我?提前谢谢!
3个回答

7

这是一种方式,不自称是最佳方式。

Mat m = ... // your smaller mat
Mat submat= matOrig.submat(new Rect(x,y, m.cols(), m.rows()) );
m.copyTo(submat);

假设m没有超出matOrig的边界,那么这应该可以正常工作。当您获取子矩阵时,它仍然与其源Mat相关联。


这会自动更新原始图像吗 :( 我尝试过了,但原始图像不会改变,它只会更新我们从原始图像中提取的子矩阵.. 无论如何,感谢您的帮助。 - shadee
它应该更新原始数据。你确定你没有先复制子矩阵,然后再复制到副本中吗? - medloh
我刚刚使用Java编写了一个小方法来更新图像的一部分。这是因为Java吗?以下是我的方法:public void ChangeImage(Mat src, Mat small, Rect roi){ Mat subView =src.submat(roi); small.copyTo(subView); Highgui.imwrite("combined-image.png", src); } - shadee
你的代码在我的OpenCV 2.4.9上可以运行。你确定你为Rect roi设置了正确的值吗?这是我在测试中创建roi的方法:Rect rect = new Rect(20, 20, small.cols(), small.rows()); 不确定你做了多少Java,但我建议使用Java约定并将方法命名为小写:changeImage(...) - medloh
抱歉,我做了一些错误的编辑并将其回滚了,我错过了这是Java,它没有运算符重载 :) - Antonio
我在使用small.copyTo(large, mask)时遇到了很大的问题,我认为这可能是openCV 2.4.12中的一些bug。但是,small.copy(mask)却非常顺利地工作了! - Matwosk

0
这是我用Kotlin编写的代码:
    val shifted = Mat.zeros(image.size(), image.type())
    val copiedSize = Size(image.width() - abs(pixelOffset.x), image.height() - abs(pixelOffset.y))

    val fromStartPoint = Point()
    val toStartPoint = pixelOffset.clone()

    val fromRect = Rect(fromStartPoint, copiedSize)
    val toRect = Rect(toStartPoint, copiedSize)
    image.submat(fromRect).copyTo(shifted.submat(toRect))
    return shifted

-1

这是我的代码:

Mat m = new Mat(originalImg,new Rect(x,y,w, h));
double[] size = {w, h};
Imgproc.resize(logo,logo,new Size(size));// make sure your logo is the same size with your roi
Imgproc.cvtColor(logo, logo, Imgproc.COLOR_RGBA2RGB);//make sure your logo has the same channel with your dst img
congrats.copyTo(m);

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