Проблема в тестировании моей функции с Catch2Farmework - PullRequest
1 голос
/ 15 июня 2019

Я написал функцию FindTopEnd, которая принимает некоторые аргументы, как показано.Эта функция перемещается снизу вверх по прямой вертикальной линии и проверяет наличие черного пикселя.Если черный пиксель найден, он проверяет наличие черного пикселя на 3 пикселя выше этой точки.Если там также найден черный пиксель, он сохраняет это начальное значение пикселя в переменных, а также сохраняет длину линии.Иначе он продолжается на изображении. При запуске исходного кода он работает нормально, но при тестировании он останавливается без ошибок и выдает неправильные результаты.

Я пробовал его на разных изображениях и шаг за шагом отлаживал код для вывода, но каждый раз условия 150 (150) выполнялись, и цикл for прерывался, давая неправильный вывод.

ПРИМЕЧАНИЕ. В тестовом случае 280 пикселей задаются в качестве входных данных только для целей тестирования в пустом пространстве.

//This is my function
void FindTopEnd(Mat InputImage, std::int16_t LineBase_x, std::int16_t LineBase_y, std::int64_t* LineHead_x, std::int64_t* LineHead_y, std::int64_t* ArrayBox)
{
    std::int16_t LineLengthFound = 0;       //If length of line is found = 1

    *LineHead_x = LineBase_x;
    *LineHead_y = 299;
    std::int16_t x = InputImage.rows;
    for (std::int16_t LineLength = 0; LineLength < x; LineLength++)
    {
        if (InputImage.at<uint8_t>(((InputImage.rows - 1) - LineLength), *LineHead_x) == 0)// && InputImage.at<uint8_t>(((InputImage.rows - 1) - LineLength - 5), (*LineHead_x)) == 0)
        {
            if (((InputImage.rows - 1) - LineLength - 3) >= 0)
            {
                if (InputImage.at<uint8_t>(((InputImage.rows - 1) - LineLength - 3), (*LineHead_x)) == 0)
                {
                    *LineHead_y = (InputImage.rows - 1) - LineLength;
                    *ArrayBox = LineLength;
                    LineLengthFound = 1;
                    break;
                }
            }
        }
        *LineHead_y = (InputImage.rows - 1) - LineLength;
        line(InputImage, Point(LineBase_x, LineBase_y), Point(*LineHead_x, *LineHead_y), Scalar(0, 90, 0));
        imshow("line", InputImage);
        waitKey(5);

    }
    if (!LineLengthFound)       //If length is not found then the line is of length of frame (no obstacle)
    {
        *ArrayBox = InputImage.rows;
        *LineHead_y = 0;
    }
}


//This is my test case
SECTION("white space")
    {
        std::int64_t LineHead_x, LineHead_y, LineLength;
        FindTopEnd(InputTestImage, 280, 299, &LineHead_x, &LineHead_y, &LineLength);
        std::cout << LineHead_x <<std::endl << LineHead_y << std::endl << LineLength;
        REQUIRE(CIR(280, 0, LineHead_x) == 1);
        CHECK(CIR(0, 3, LineHead_y) == 1);
        CHECK(CIR(300, 2, LineLength) == 1);
        std::cout << LineHead_y;
        std::cout << " " << LineLength;
    }
//CIR function checks that the variable is in the range of +-error allowed.
//You can ignore that

Ожидается вывод - LineHead_x = 280, LineHead_y = 0, LineLength = 300. Фактические результаты - LineHead_x= 280, LineHead_y = 149, LineLength = 150.

Это изображение вывода исходного кода.Это доказывает, что линии создаются так, как они нужны для тестирования.Изображение вывода исходного кода - https://ibb.co/XVCCXFY

Это изображение вывода из контрольного примера, где строка остановлена ​​на 150 пикселей. Изображение вывода контрольного примера - https://ibb.co/qpD1KwS

1 Ответ

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

Во время тестирования я давал 3-канальное изображение в качестве входного, но при запуске исходного кода входное изображение для этой функции представляло собой одноканальное изображение в градациях серого. После исправления тестирование прошло нормально. Но все еще остается вопрос: почему линии останавливались на 150 пикселей каждый раз?

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