我目前正在开发一种应用程序,它将扫描图像(包含多张收据)拆分为单独的收据图像。
以下是示例图片:
我能够使用OpenCV的canny功能检测扫描图像中每张收据的边缘。
以下是检测到边缘的样本图像:
sample image with detected edges
...示例代码是
Mat src = Highgui.imread(filename);
Mat gray = new Mat();
int threshold = 12;
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.blur(gray, gray, new Size(3, 3));
Imgproc.Canny(gray, gray, threshold, threshold * 3, 3, true);
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(gray, contours, hierarchy,
Imgproc.RETR_CCOMP,
Imgproc.CHAIN_APPROX_SIMPLE);
if (hierarchy.size().height > 0 && hierarchy.size().width > 0) {
for (int idx = 0; idx >= 0; idx = (int) hierarchy.get(0, idx)[0]) {
Rect rect = Imgproc.boundingRect(contours.get(idx));
Core.rectangle(src, new Point(rect.x, rect.y),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(255, 0, 0));
}
}
现在我的问题是,我不知道如何识别第三张收据,因为与前两张收据不同,它没有被包围在一个矩形形状中,我将用它作为分割图像的基础。
我听说要提取第三张图片,我必须使用像DBSCAN这样的聚类算法,遗憾的是我找不到一张。
任何人都知道如何识别第3张图片?
提前谢谢!