Блоки изображений OpenCv, ошибка размера?

У меня есть функция, которая разбивает изображение на блоки для дальнейшей обработки, используя C++ и OpenCv.

Это мой код:

  void imageSplit(Mat image)
    {
        int blockNumber = 8;

        // get the image data
        int height = image.rows;
        int width = image.cols;


        //set how many blocks and create vector to store
        cv::Size smallSize(height / blockNumber, width / blockNumber);

        std::vector < Mat > smallImages;

        for (int y = 0; y < image.rows; y += smallSize.height)
        {
            for (int x = 0; x < image.cols; x += smallSize.width)
            {

                cv::Rect rect = cv::Rect(x, y, smallSize.width, smallSize.height);
                //cout << x << " " << y << " " << smallSize.width << " " << smallSize.height << endl;
                smallImages.push_back(cv::Mat(image, rect));
            }

        }
    }

Он отлично работает с большей областью (работает 512 x 512). Но когда я перехожу к размерам, например, 100 x 100 пикселей, это дает мне:

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.widt
h <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in
 cv::Mat::Mat, file src\matrix.cpp, line 323
default exception.

Проблема связана с размером? И если да, то есть ли обходной путь?


person anti    schedule 16.04.2015    source источник
comment
for (int y = 0; y < image.rows-smallSize.height; y += smallSize.height) то же самое для х   -  person berak    schedule 16.04.2015
comment
Спасибо! это работает. Должны ли эти значения быть высотой? или должна быть ширина?   -  person anti    schedule 16.04.2015
comment
Такое ощущение, что вам нужно использовать метод copymakeborder, чтобы расширить ваш мат, чтобы он был кратен размеру блока, иначе последний фрагмент может быть меньше или пропущен.   -  person kiranpradeep    schedule 16.04.2015
comment
smallSize.width для x , ofc.   -  person berak    schedule 16.04.2015
comment
конечно. Я идиот. Спасибо еще раз!   -  person anti    schedule 16.04.2015


Ответы (1)


Поскольку берак печально известен тем, что фактически не отправляет ответы на вопросы.

Ваш код должен быть:

    for (int y = 0; y < image.rows-smallSize.height; y += smallSize.height)
    {
        for (int x = 0; x < image.cols-smallSize.width; x += smallSize.width)
        {

            cv::Rect rect = cv::Rect(x, y, smallSize.width, smallSize.height);
            //cout << x << " " << y << " " << smallSize.width << " " << smallSize.height << endl;
            smallImages.push_back(cv::Mat(image, rect));
        }

    }
}

Это сделано для того, чтобы вы не увеличивали размер до областей, где у вас на самом деле нет изображения.

person GPPK    schedule 16.04.2015
comment
Вероятно, это потому, что он уже написал много ответов, и этот явно просто логическая ошибка.. ;) - person a-Jays; 16.04.2015