Я написал функцию 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