从this post我拿了以下代码。它使用OpenCV4Android从原始图像中裁剪区域。
Mat uncropped = getUncroppedImage();
Rect roi = new Rect(x, y, width, height);
Mat cropped = new Mat(uncropped, roi);
工作正常,但想象一下getUncroppedImage返回的Mat的内存只分配一次。但是裁剪图像的内存会一直重新分配。有没有办法从OpenCV中裁剪区域:Mat而不使用Mat构造函数?
答案 0 :(得分:3)
@Matthias,代码中的'裁剪'图像指向与'未剪切'相同的内存。没有重新分配内存。要对此进行测试,您可以更改裁剪图像的内容(例如将其设置为白色),您将看到未裁剪的内容也将更改。
在OpenCV中,如果要使两个图像具有相同的内容但内存不同,则应明确说明,即使用copy,copyTo或clone等功能。 OpenCV尝试尽可能避免重新分配和复制。
答案 1 :(得分:0)
是的,您可以使用子图像:
Mat uncropped = getUncroppedImage();
Rect roi = new Rect(x, y, width, height);
Mat cropped = uncropped(roi);
这样,裁剪使用与未裁剪相同的图像数组数据,但仅在子图像区域中使用。创建矩阵标头,但像素数据数组(价格昂贵)不是。
几乎所有openCV函数都可以处理子图像,因为它们就像普通图像一样,具有另一个widthstep(单行的字节长度)
编辑:这是我的c ++语法,不确定android openCV有何不同!