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

Я пытаюсь разработать приложение, которое обнаруживает карты «мастер-карты, визы, кутомерные карты и т. д.» с помощью камеры 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

введите описание изображения здесь

исходные изображения:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


person user2121    schedule 14.10.2016    source источник
comment
Вы можете попробовать обнаружение структурированного края. Размещайте также оригинальные изображения   -  person Miki    schedule 14.10.2016
comment
Опубликованы оригинальные изображения @Miki   -  person user2121    schedule 14.10.2016
comment
@Miki кажется, чтоstructuredEdgeDetection недоступен в openCV4Android версии 3.0.0. такого класса нет. Пожалуйста, сообщите мне, если у вас есть какая-либо информация   -  person user2121    schedule 14.10.2016
comment
Это в модулях contributo. Я не знаю, доступен ли он в оболочке java или вам нужно использовать вызовы JNI. Попробую и отпишусь о результатах, а вы уже решите, целесообразен этот вариант или нет.   -  person Miki    schedule 14.10.2016


Ответы (1)


Вы можете использовать структурированное обнаружение границ.

Я получил эти результаты, запустив код C++ в это мой другой ответ. Мне кажется, это хороший и надежный результат.

введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения

Чтобы использовать это в Java, вы должны знать, что Structured Edge Detection находится в модуле contrib ximgproc. Вам, вероятно, потребуется перекомпилировать OpenCV, чтобы использовать его: Java-оболочка

person Miki    schedule 14.10.2016
comment
я ссылался на эту ссылку github.com/opencv/opencv_contrib/blob/master/README .md, чтобы узнать, как собрать opencv contrib . в разделе Как собрать OpenCV с дополнительными модулями есть команда, начинающаяся с $, что это? это обычный cmd в windows??!! - person user2121; 14.10.2016
comment
Это шелл, линукс или винда... Я обычно использую cmake-gui, так будет намного проще - person Miki; 14.10.2016
comment
скажите, пожалуйста, в чем разница между 2‹opencv_source_directory› и ‹opencv_build_directory›? оба упомянуты в той же ссылке. - person user2121; 14.10.2016
comment
source — это папка, в которой у вас есть исходный код обычного opencv, который вы собираетесь скомпилировать (тот, который вы скачали). contrib — исходная папка для модулей contrib, build — папка, в которой будет храниться ваша скомпилированная библиотека. - person Miki; 14.10.2016
comment
на самом деле, у меня нет в папке opencv, я скачал какую-либо папку с именем build. это может быть jni или libs?? - person user2121; 14.10.2016
comment
Я слишком много скомпилировал OpenCV, но у меня нет опыта работы с Java-оболочкой. build — это папка, которую вы создаете - person Miki; 14.10.2016
comment
на самом деле, я пытался установить модули opencv contrib в android, но это не работает... не знаю почему... у вас нет другой идеи решить эту проблему с помощью обычного opencv3.0.0?? спасибо - person user2121; 18.10.2016