Я пытаюсь разработать приложение, которое обнаруживает карты «мастер-карты, визы, кутомерные карты и т. д.» с помощью камеры Android, для этой цели я использовал OpenCV4Android версии 3.0.0. Для выполнения этой задачи я сделал следующее:
1- преобразовал кадр, снятый с камеры, в оттенки серого, используя
Imgproc.cvtColor(this.mMatInputFrame, this.mMatGray, Imgproc.COLOR_BGR2GRAY);
2- размытие кадра с помощью
Imgproc.blur(this.mMatGray, this.mMatEdges, new Size(7, 7));
3- примените детектор края Canny следующим образом
Imgproc.Canny(this.mMatEdges, this.mMatEdges, 2, 900, 7, true);
4- чтобы показать результат Canny на реальном изображении, я сделал следующее
this.mDest = new Mat(new Size(this.mMatInputFrame.width(), this.mMatInputFrame.height()), CvType.CV_8U, Scalar.all(0));
this.mMatInputFrame.copyTo(this.mDest, this.mMatEdges);
5- набрал изображение с помощью
dilated = new Mat();
Mat dilateElement = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3, 3));
Imgproc.dilate(mMatEdges, dilated, dilateElement);
6- нахождение контура обнаруженной карты следующим образом:
ArrayList<MatOfPoint> contours = new ArrayList<>();
hierachy = new Mat();
Imgproc.findContours(dilated, contours, hierachy, Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
if (Imgproc.contourArea(contours.get(i), true) > 90000) {
Rect rect = Imgproc.boundingRect(contours.get(i));
if (rect.height > 60) {
Imgproc.rectangle(mMatInputFrame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0));
}
}
}
Когда я запускаю приложение,
Случай 1
если обнаруживаемая карта имеет однородный цвет, «вся карта окрашена одним цветом», Canny создает четко очерченные края, которые можно легко обнаружить, как показано на изображении «одинаковый цвет-0» и «одинаковый цвет- 1". более того, когда я кладу карту однородного цвета на стол и перемещаю камеру вокруг нее, края обнаруживаются правильно, несмотря на то, что я перемещаю камеру. или другими словами, красная рамка, которая окружает края карты, всегда фиксируется по краям и никогда не исчезает
случай 2
если карта неоднородного цвета «смешанных цветов», то определение края плохое, как показано на изображении «смешанный-цвет-0» и «смешанный-цвет-1», и, кроме того, красная рамка вокруг края карты исчезают так часто. Другой случай, расширенный из этого случая, - это когда карта имеет два цвета, один светлый, а другой темный, в этом случае детектор краев обнаруживает только темную часть карты, потому что ее края четко определены, как показано на рисунке " смешанный цвет-2"
Пожалуйста, дайте мне знать, как получить четкие края карт размером с карту независимо от цвета? есть ли другой более точный способ обнаружения края?
тот же цвет-0:
тот же цвет-1
смешанный цвет-0
смешанный цвет-1
смешанный цвет-2
исходные изображения: