Функция drawContours в OpenCV приводит к сбою приложения Android - PullRequest
0 голосов
/ 06 июля 2019

Я хочу нарисовать самый большой контур, обнаруженный Imgproc.findContours в моем приложении для Android.Кажется, что Imgproc.findContours находит несколько контуров, но код падает при попытке выполнить функцию Imgproc.drawContours.

Вот код Java:

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(result, contours, hierarchy, Imgproc.RETR_FLOODFILL, Imgproc.CHAIN_APPROX_SIMPLE);

largest_area = 0;
largest_contour_index = -1;

for(int i = 0; i<contours.size(); i++){
    double area = Imgproc.contourArea(contours.get(i));
    if(area > largest_area){
        largest_area = area;
        largest_contour_index = i;
    }
}

Mat contourDrawing = Mat.zeros(result.rows(), result.cols(),  CvType.CV_8UC3);

Log.d("contours.size()", Integer.toString(contours.size()));
Log.d("largest_area", Double.toString(largest_area));
Log.d("largest_contour_index", Integer.toString(largest_contour_index));

Imgproc.drawContours(contourDrawing, contours, largest_contour_index, new Scalar(255, 0, 0), 2);

Вывод Logcat выглядит следующим образом, показывающий, что контуры обнаружены:

D / contours.size (): 1901

D / large_area: 343974.0

D / large_contour_index: 825

Но когда дело доходит до рисования контура с помощью Imgproc.drawContours, приложение вылетает.Я использую OpenCV версии 3.4.3.Кто-нибудь знает, что здесь может быть не так?Большое спасибо!

Вот журнал ошибок:

Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb930b93 in tid 30396 (Thread-2), pid 30213

/lib/arm64/libopencv_java3.so (cv::drawContours(cv::_InputOutputArray const&, cv::_InputArray const&, int, cv::Scalar_<double> const&, int, int, cv::_InputArray const&, int, cv::Point_<int>)+2124)

/lib/arm64/libopencv_java3.so (Java_org_opencv_imgproc_Imgproc_drawContours_11+252)

/dev/ashmem/dalvik-classes.dex extracted in memory from ==/base.apk (deleted) (org.opencv.imgproc.Imgproc.drawContours+102)

1 Ответ

0 голосов
/ 06 июля 2019

Я действительно не знаю Java, но, может быть, я могу чем-то помочь?

предложения: 1. как насчет использования numpy's zeros_like(image) вместо использования строк и столбцов просто для упрощения вещей и уменьшения вероятности ошибок там?

рисовать контуры, по моему опыту, измененияизображение, которое вы рисуете навсегда.Но вы создаете изображение только для контуров, так что вы уже знаете это ...

мое предположение о проблеме:

Для ваших входов в функцию drawContoursВаш второй параметр должен быть 'обнаруженными контурами' из вашего findContours ... Я не могу сказать, но похоже, что это может быть result для вас.Вы пытались использовать result в параметрах контуров (в данном случае как contours_to_draw)?

в Python Я использую это так:

cv.drawContours(copy__of_image, contours_to_draw, -1, color=desired_color, thickness=2)

-1 для рисованиявсе контуры.Если вы хотите нарисовать только некоторые, вы можете нарисовать первое или второе и т. Д., Изменив это значение, но если вы знаете, какие контуры вы хотите нарисовать, я бы предложил передать их в contours_to_draw вместо использования этого параметра, чтобы определить, какие контурырисовать.Полагаю, вы уже все это знали, но пересказывать эти вещи не повредит.

Помогает ли это вообще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...