使用 Catch2Farmework 测试我的功能时出现问题
Problem in testing my function with Catch2Farmework
我写了一个 FindTopEnd 函数,它带有一些参数,如图所示。此函数以垂直直线从底部向上移动并检查黑色像素。如果发现黑色像素,则它会检查该点上方 3 个像素的黑色像素。如果在那里也发现了黑色像素,那么它会将初始像素值存储在变量中,并且还会存储线条的长度。否则它继续 image.On 运行 源代码,它工作正常但在测试中,它在中间停止而没有任何错误并给出错误的输出。
我已经在不同的图像上尝试过,并逐步调试输出代码,但每次 if() 条件在 150 个像素上都满足并且 for 循环中断时给出错误的输出。
注意:在测试用例中,280 像素作为输入仅用于空白 space 中的测试目的。
//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,线长 = 300。
实际结果 -
LineHead_x = 280,LineHead_y = 149,线长 = 150。
这是源代码输出的图像。这证明了这些线路是按照需要进行测试的方式创建的。
源代码输出图像 - https://ibb.co/XVCCXFY
这是测试用例的输出图像,其中线条在 150 像素处停止
测试用例的输出图像 - https://ibb.co/qpD1KwS
在测试期间,我给出了一个 3 通道图像作为输入,但是 运行 源代码中,此函数的输入图像是单通道灰度图像。改正后,测试正常。但仍然存在一个问题,即为什么线条每次都停在 150 像素处。
我写了一个 FindTopEnd 函数,它带有一些参数,如图所示。此函数以垂直直线从底部向上移动并检查黑色像素。如果发现黑色像素,则它会检查该点上方 3 个像素的黑色像素。如果在那里也发现了黑色像素,那么它会将初始像素值存储在变量中,并且还会存储线条的长度。否则它继续 image.On 运行 源代码,它工作正常但在测试中,它在中间停止而没有任何错误并给出错误的输出。
我已经在不同的图像上尝试过,并逐步调试输出代码,但每次 if() 条件在 150 个像素上都满足并且 for 循环中断时给出错误的输出。
注意:在测试用例中,280 像素作为输入仅用于空白 space 中的测试目的。
//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,线长 = 300。 实际结果 - LineHead_x = 280,LineHead_y = 149,线长 = 150。
这是源代码输出的图像。这证明了这些线路是按照需要进行测试的方式创建的。 源代码输出图像 - https://ibb.co/XVCCXFY
这是测试用例的输出图像,其中线条在 150 像素处停止 测试用例的输出图像 - https://ibb.co/qpD1KwS
在测试期间,我给出了一个 3 通道图像作为输入,但是 运行 源代码中,此函数的输入图像是单通道灰度图像。改正后,测试正常。但仍然存在一个问题,即为什么线条每次都停在 150 像素处。