3

我试图弄清楚如何在 Android 上的 OpenCV 中为图像设置 ROI。我在其他操作系统上做过这个,所以我认为我是怎么做的在语义上是正确的,但是某处有错误。

到目前为止,我已经尝试过了

Rect roi = new Rect(0, 0, inputFrame.cols(), inputFrame.rows());
Mat cropped = new Mat(inputFrame, roi);

但是我在 OpenCV 类中的某个地方出现了一个错误,看起来像这样

Utils.matToBitmap() throws an exception:/home/reports/ci/slave/opencv/modules/java/generator/src/cpp/utils.cpp:107: 
error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width ==
(uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2
(JNIEnv*, jclass, jlong, jobject, jboolean)

我在 opencv 包装类提供的 onCameraFrame 回调中调用它

不知道该怎么做,有没有人成功做到这一点?

4

2 回答 2

8

OpenCV for Android(和新的 Java API)有自己的方式来创建 ROI。

您所要做的就是调用 Mat 对象的 submat 方法。如果我没记错的话,调用 submat 不会创建该图像区域的副本,如果您想要一个副本,您可以为此目的在 submat 上使用 copyTo。

Mat roi = inputFrame.submat(rowStart, rowEnd, colStart, colEnd);

您可以通过 3 种不同的方式调用 submat,查看链接了解更多详情:

  • submat(int rowStart,int rowEnd,int colStart,int colEnd)

子垫 1

  • submat(范围行范围,范围 colRange)

子垫 2

  • 子垫(矩形投资回报率)

子垫 3

于 2013-02-13T19:25:54.797 回答
2

该错误表明您正在尝试设置具有相同图像尺寸的 ROI,因此在这种情况下不需要 ROI。

为了确保这是问题所在,以下应该有效:

Rect roi = new Rect(0, 0, inputFrame.cols() - 1, inputFrame.rows() - 1);
Mat cropped = new Mat(inputFrame, roi);
于 2013-02-04T22:08:16.460 回答