Как получить четкие края независимо от цвета

Я пытаюсь разработать приложение, которое распознает карты «MasterCard, Visa, Cutomer Card и т. Д.» С помощью камеры 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 - чтобы показать результат Кэнни на реальном изображении, я сделал следующее

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 создает четко определенные края, которые можно легко обнаружить, как показано на изображениях "same-color-0" и "same-color- 1" . Более того, когда я кладу карту однородного цвета на стол и перемещаю камеру вокруг нее, края обнаруживаются правильно, несмотря на то, что я перемещаю камеру. или, другими словами, красная рамка, которая окружает края карты, всегда фиксируется по краям и никогда не исчезает

случай 2

если карта не имеет однородного цвета "смешанных цветов", то обнаружение края является плохим, как показано на изображениях "mixed-color-0" и "mixed-color-1", и, кроме того, красная рамка, которая окружает края карты исчезают так часто. Другой случай, расширенный из этого случая, когда карта имеет два цвета, один светлый, а другой темный, в этом случае детектор краев обнаруживает только темную часть карты, потому что ее края четко определены, как показано на рисунке " смешанные цвета-2"

Пожалуйста, дайте мне знать, как получить четкие края карт размером с карточку независимо от цвета? Есть ли другой, более точный способ обнаружения краев?

в тот же цвет, 0:

в тот же цвет-1

смешанные цвета-0

смешанные цвета-1

смешанные цвета-2

оригинальные изображения:

Ответы на вопрос(1)

Ваш ответ на вопрос