我正在调试我在CLion中使用C ++编写的应用程序,并使用Google Test对其进行测试。它是我发现的计算机视觉论文的一个实现,我使用OpenCV作为它的Mat类和图像处理函数。
我的三个测试功能表现得非常不稳定;这是一个。
/**
* Create a flat point cloud and flip it horizontally
*/
TEST_F(PointCloudTest, FlipHorizontal) {
// load image & set constants
cv::Mat image = omar::imreadAsGrayDouble(dirname + "uttower.png");
cv::Mat flippedImage = omar::imreadAsGrayDouble(dirname + "uttower_horz.png");
double fLength = 200.0; // for this, the flength is arbitrary as long as it's the same.
// build point cloud
omar::PointCloud pc(image, fLength);
/* Build the other camera pose
* Specifically, rotated pi over Y
* and 2 focal lengths out into Z+ space.
* It's written as 2.001 to test whether small variations affect point placement*/
omar::Pose otherCamera(0.0, 0.0, 2.001, 0.0, M_PI, 0.0);
// flip horizontally
omar::PointCloud newPc = pc.viewPoints(otherCamera);
cv::Mat newImage = newPc.renderToImage(fLength, image.rows, image.cols);
omar::assertMatEquals(flippedImage, newImage, 10 * DBL_EPSILON);
}
并且GTest调试系统将提供输出,就好像它已完成:
[ OK ] PointCloudTest.FlipHorizontal (205 ms)
但是图标从未改变为表明测试结束的信号。
当我去调试它时,如果我在函数的底部设置一个断点,它会停止,然后每次我按下" Step Over,"它会一个接一个地跳过 up 其余行,然后完成。这结果证明是所有测试的调试行为。
悬挂测试与通过的不同测试略有不同。具体来说,该行是viewPoints
行。以下是相关代码:
PointCloud::PointCloud(const PointCloud& other) {
pointsAndIntensities = other.pointsAndIntensities.clone();
}
PointCloud PointCloud::viewPoints(omar::Pose otherCameraPose) {
PointCloud otherPointCloud = PointCloud(*this);
otherPointCloud.transform(otherCameraPose);
return otherPointCloud;
}
void PointCloud::transform(omar::Pose otherCameraPose) {
cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all()));
cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3));
transformedPoints.copyTo(replaceablePoints);
}
我想了解这种排序的原因,但它可能与真正的问题有关,也可能与此无关,即悬挂测试。从技术上讲,所有三项测试都通过了,但我认为这个问题将会导致很多问题。我在我的智慧结束。感谢帮助和跟进问题!
答案 0 :(得分:1)
TL; DR:确保用新行结束打印报表。
当我描述问题时,我遗漏了一个非常非常重要的细节。我决定在这里删除我用来调试描述中的一些信息的cout
行。原始代码是:
void PointCloud::transform(omar::Pose otherCameraPose) {
//cv::Mat oldPoints(pointsAndIntensities, cv::Range(0, 3));
cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all()));
cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3));
std::cout << "Transformed: " << transformedPoints.col(3) << std::endl;
std::cout << "Original: " << replaceablePoints.col(3) << std::endl;
transformedPoints.copyTo(replaceablePoints);
std::cout << "Replaced?: " << pointsAndIntensities.col(3);
}
我决定在代码中挖掘更多内容,以找到导致挂起的确切行,以防内存中出现错误。我将其跟踪到上面的transform
方法,结果证明是我在那里的std::cout
行。我不知道使用流中测试是否会造成一些问题。事实证明,我没有用std::endl
结束我的最后一次打印声明。
我的预感是,CLion依赖于GTest的cout
输出来查找测试是通过还是失败,并且因为[ OK ] PointCloudTest.FlipHorizontal (205 ms)
不在新行上,所以它无法识别测试成功完成。