在音乐符号的Opencv等高矩形

时间:2016-04-06 09:17:26

标签: android opencv contour

我试图用分离的乐谱画出画面中每个元素的轮廓。

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;

}

我得到的结果是:

result

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

1 个答案:

答案 0 :(得分:0)

根据来自@DanMaš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