Как исправить ошибку с помощью cv :: boundingRect в OpenCV - PullRequest
1 голос
/ 01 июля 2019

Я использую OpenCV версии 4.0.0. Я пытаюсь сшить несколько изображений и обрезать полученное изображение, и, хотя я могу сшить изображения, я не могу обрезать полученное изображение.

Моя программа продолжает прерываться со следующей ошибкой:

libc ++ abi.dylib: завершение с необработанным исключением типа cv :: Exception: OpenCV (4.0.0) /Users/RAR/opencv/modules/core/src/umatrix.cpp:545: ошибка: (- 215: утверждение не выполнено) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows в функции 'UMat' </p>

Ловушка отмены: 6

Ошибка возникает в строке stitched = stitched(cv::boundingRect(c)); в приведенном ниже коде.

while (cv::countNonZero(sub) > 0) {
            cv::erode(minRect, minRect, cv::Mat());  // Erode the minimum rectangular mask
            cv::subtract(minRect, thresh, sub);  // Subtract the thresholded image from the minmum rectangular mask (count if there are any non-zero pixels left)
            std::vector<std::vector<cv::Point>> cnts4;
            cv::findContours(minRect.clone(), cnts4, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
            c = cnts4[0];
            for (auto iter = cnts4.begin(); iter != cnts4.end(); ++iter) {
                if (cv::contourArea(*iter) > cv::contourArea(c)) { // Finds the largest contour (the contour/outline of the stitched image)
                    c = *iter;
                }
            }

            stitched = stitched(cv::boundingRect(c));  // Extract the bounding box and use the bounding box coordinates to extract the final stitched images
}

Почему я получаю эту ошибку?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Из комментариев ОП:

stitched: cols: 4295 rows: 2867 bounding rect[4274 x 2845 from (11, 12)] 
stitched: cols: 4274 rows: 2845 bounding rect[4272 x 2843 from (12, 13)]

В первом случае прямоугольник пытается извлечь размер (4274, 2845) из (11, 12) в изображении stitched.Это означает, что он принимает пиксели от (11, 12) до (4285, 2857), что находится в пределах изображения stitched, так как изображение stitched имеет размер (4295, 2867). Нет проблем .

Во втором случае прямоугольник пытается извлечь размер (4272, 2843) из (12, 13) в изображении stitched.Это означает, что он принимает пиксели от (12, 13) до (4284, 2856), что выходит за границы сшитого изображения, так как изображение stitched имеет размер (4274, 2845). Проблема .

Подизображение, которое вы пытаетесь извлечь, намного больше, чем большее изображение.

(- 215: подтверждение не выполнено) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y &&0 <= roi.height && roi.y + roi.height <= m.rows </p>

Сообщение об ошибке также указывает на это.roi в сообщении об ошибке относится к подизображению, которое вы пытаетесь извлечь, используя cv::boundingRect(c), а m - это stitched изображение.Координаты этого прямоугольника превышают размер изображения stitched.

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

Вы не должны получить ошибку с stitched(cv::Rect(11, 12, cv::Size(4274, 2845)

Вы получите ошибку с stitched(cv::Rect(12, 13, cv::Size(4272, 2843)

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

Последняя итерация - проблема, так как она не найдет никаких контуров.

Может быть, вы можете попробовать что-то вроде этого:

int nonZeroCount = 1;
while (nonZeroCount) 
{
    cv::erode(minRect, minRect, cv::Mat());
    cv::subtract(minRect, thresh, sub);
    nonZeroCount = cv::countNonZero(sub);
    if (nonZeroCount)
    {
        std::vector< std::vector<cv::Point> > cnts4;
        cv::findContours(minRect.clone(), cnts4, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
        c = cnts4[0];
        for (auto iter = cnts4.begin(); iter != cnts4.end(); ++iter) 
        {
            if (cv::contourArea(*iter) > cv::contourArea(c))
            {
                c = *iter;
            }
        }
        stitched = stitched(cv::boundingRect(c));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...