Opencv javacpp-presets findContours выдает ошибку: нераспознанный или неподдерживаемый тип массива в cvGetMat

Я пытаюсь извлечь текст из изображения (бинаризировать), используя предустановки opencv javacpp (версия 3.0.0-1.0) и фрагмент кода ниже. Фрагмент представляет собой перевод этой версии кода на Python. .

Входное изображение взято из файла и загружается через imread, но код завершается сбоем в findContours со следующим сообщением об ошибке:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file src\array.cpp, line 2494

Предлагаемые решения из здесь не т работать на меня. Любая помощь очень ценится!

    // Load the image
    Mat image_orig = imread(inputFile);
    if ( image_orig.empty() ) { LOGGER.error("Empty image!");}

    this.image = new Mat();
    //Add a border to the image for processing sake
    copyMakeBorder(image_orig, this.image, 50, 50, 50, 50, BORDER_CONSTANT);

    //# Calculate the width and height of the image

    this.img_y = this.image.arrayHeight();
    this.img_x = this.image.arrayWidth();

    if (DEBUG)
        LOGGER.info("Image is " + this.img_x + "x" + this.img_x);

    //Split out each channel
    Mat red = new Mat();
    Mat green = new Mat();
    Mat blue = new Mat();

    MatVector v = new MatVector(blue, green, red);
    split(image, v);

    //Run canny edge detection on each channel
    Mat blue_edges = new Mat();
    Canny(blue, blue_edges, 200, 250);

    Mat green_edges = new Mat();
    Canny(green, green_edges, 200, 250);

    Mat red_edges = new Mat();
    Canny(red, red_edges, 200, 250);

    //Join edges back into image
    Mat edges = new Mat();
    MatVector vEdges = new MatVector(red_edges, green_edges, blue_edges);
    merge(vEdges, edges);

    //Find the contours
    Mat edgesCopy = new Mat();
    edges.copyTo(edgesCopy);

    Mat hierarchy = new Mat();
    MatVector contours = new MatVector();
    findContours(edgesCopy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);

person s.ijpma    schedule 12.08.2015    source источник
comment
Попробуйте преобразовать мат edgeCopy в оттенки серого перед вызовом findContours. Требуется, чтобы вход был 8-битным изображением с одним каналом.   -  person user3510227    schedule 12.08.2015
comment
Спасибо за ваш ответ. я попробовал ваше предложение с: //convert to grayscale Mat gray = new Mat(); cvtColor(edges, gray, COLOR_BGR2GRAY); Mat blur = new Mat(); GaussianBlur(gray, blur, new Size(5,5), 0); Mat edgesCopy = new Mat(); adaptiveThreshold(blur, edgesCopy, 255,1,1,11,2);, но я получаю то же сообщение об ошибке в findContours   -  person s.ijpma    schedule 12.08.2015
comment
Вы уверены, что изображение читается правильно? Попробуйте проверить тип после того, как он будет прочитан, и непосредственно перед тем, как передать его findContours(). Я думаю, что Mat.type() - это вызов функции в Java API.   -  person user3510227    schedule 12.08.2015
comment
edgesCopy.type() равно 16 перед преобразованием в оттенки серого и после равно 0   -  person s.ijpma    schedule 12.08.2015
comment
Я предполагаю, что разделение на многоканальность не работает?   -  person s.ijpma    schedule 12.08.2015
comment
Если я правильно помню, тип 0 — это 8-битное изображение, можете ли вы его отобразить (попробуйте imshow())? Возможно, что-то запуталось в вашем разделении каналов, поэтому я бы попробовал более простой процесс: прочитать изображение, преобразовать в оттенки серого, а затем найти контуры. Я могу написать быстрый пример, если вы застряли, но это будет на C++.   -  person user3510227    schedule 12.08.2015


Ответы (1)


Господи, глупый я. Я должен был использовать ввод из MatVector i.s.o. пустой мат для обнаружения Canny. Затем, используя оттенки серого, как @user3510227, я получаю следующий рабочий код:

    // Load the image
    Mat image_orig = imread(inputFile);
    if ( image_orig.empty() ) { LOGGER.error("Empty image!");}

    this.image = new Mat();
    //Add a border to the image for processing sake
    copyMakeBorder(image_orig, this.image, 50, 50, 50, 50, BORDER_CONSTANT);

    //# Calculate the width and height of the image

    this.img_y = this.image.arrayHeight();
    this.img_x = this.image.arrayWidth();

    if (DEBUG)
        LOGGER.info("Image is " + this.img_x + "x" + this.img_x);

    //Split out each channel
    Mat red = new Mat();
    Mat green = new Mat();
    Mat blue = new Mat();

    MatVector v = new MatVector(red, green, blue);
    split(image, v);

    //Run canny edge detection on each channel
    Mat blue_edges = new Mat();
    Canny(v.get(0), blue_edges, 200, 250);
    Mat green_edges = new Mat();
    Canny(v.get(1), green_edges, 200, 250);
    Mat red_edges = new Mat();
    Canny(v.get(2), red_edges, 200, 250);

    //Join edges back into image
    Mat edges = new Mat();
    MatVector vEdges = new MatVector(red_edges, green_edges, blue_edges);
    merge(vEdges, edges);
    LOGGER.info("Type: " + edges.type());


    //convert to grayscale
    Mat gray = new Mat();
    cvtColor(edges, gray, COLOR_BGR2GRAY);
    Mat blur = new Mat();
    GaussianBlur(gray, blur, new Size(5,5), 0);
    Mat edgesCopy = new Mat();
    adaptiveThreshold(blur, edgesCopy, 255,1,1,11,2);


    //Find the contours        
    Mat hierarchy = new Mat();
    MatVector contours = new MatVector();

    findContours(edgesCopy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);
person s.ijpma    schedule 12.08.2015