关于乐谱的 Opencv 轮廓矩形

Opencv contour rectangle on musical notations

我正在尝试用分离的音符绘制图片中每个元素的轮廓。

这是我在android/java中运行的代码:

public static Bitmap findNotationContours(Bitmap inputImage) {
Mat inputImageMat = new Mat();
Utils.bitmapToMat(inputImage, inputImageMat);

Imgproc.cvtColor(inputImageMat, inputImageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(inputImageMat, inputImageMat, new Size(5, 5), 0);
Imgproc.adaptiveThreshold(inputImageMat, inputImageMat, 255, 1, 1, 11, 2);

List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(inputImageMat, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

int contourColor = android.R.color.holo_red_dark;
Scalar contourScalar = new Scalar(Color.red(contourColor), Color.green(contourColor), Color.blue(contourColor));

for (int i = 0; i < contours.size(); i++) {
  Rect rect = Imgproc.boundingRect(contours.get(i));
  Imgproc.rectangle(inputImageMat,
          new Point(rect.x, rect.y),
          new Point(rect.x + rect.width, rect.y + rect.height),
          contourScalar, 3);
}


Utils.matToBitmap(inputImageMat, inputImage);
return inputImage;

}

我得到的结果是:

如果你足够放大,你可以看到符号的轮廓在那里,但我需要保留原始图片,每个符号周围只有一个矩形轮廓,所以我可以将它们保存为图案。 你能告诉我我做错了什么吗?

根据 @Dan Mašek 提供的重要信息 问题已解决,我将添加修改后的代码,不需要解释,只是我们保留一个带有初始 3- 的 Mat我们用来绘制轮廓矩形的通道图像。

public static Bitmap findNotationContours(Bitmap inputImage) {
Mat inputImageMat = new Mat();
Mat resultImageMat = new Mat();
Utils.bitmapToMat(inputImage, inputImageMat);
Utils.bitmapToMat(inputImage, resultImageMat);

Imgproc.cvtColor(inputImageMat, inputImageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(inputImageMat, inputImageMat, new Size(5, 5), 0);
Imgproc.adaptiveThreshold(inputImageMat, inputImageMat, 255, 1, 1, 11, 2);

List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(inputImageMat, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

Scalar contourScalar = new Scalar(255,0,0);

for (int i = 0; i < contours.size(); i++) {
  Rect rect = Imgproc.boundingRect(contours.get(i));
  Imgproc.rectangle(resultImageMat,
          new Point(rect.x, rect.y),
          new Point(rect.x + rect.width, rect.y + rect.height),
          contourScalar, 3);
  Log.i("contour", "contour" + i + " x:" + rect.x + " y:" + rect.y);
}


Utils.matToBitmap(resultImageMat, inputImage);
return inputImage;

}

final result