Google Test for OpenCv c++



我正在尝试为一个openCV函数编写gtest,该函数读取VideoCapture对象并将其作为双精度值返回FPS速率。

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
This is my Header file for the Class Calculate FPS that has the function getFps()
/* Class create to calculate the 
fps value of the video object give*/
class CalculateFps
{
public:
/* return the fps value as
of type double for the video */
double getFps(VideoCapture cap);
};

这是我实现头文件的.cpp文件

#include "CalculateFps.h"
using namespace std;
using namespace cv;

double CalculateFps::getFps(VideoCapture cap)
{
/* Returns the fps value of the video
as of type double */
return cap.get(CAP_PROP_FPS);
}

有人可以帮我如何为这个函数编写一个 gtest 吗,因为该函数可以将任何视频作为参数?

你想在测试中朝哪个方向发展?是否要检查是否为不同的流返回了正确的 FPS (1(,或者是否使用了正确的方法来获取 FPS (2(,或者在其他类中使用CalculateFps(3(?

如果是第一种情况 - 我没有看到这个特定功能增加太多价值。可以安全地假设 openCV 为不同的VideoCapture对象正确返回正确的 FPS 值。我确信openCV对不同类型的视频捕获进行了测试。如果你坚持测试你的实现,我假设你需要创建一个一些已知FPS的测试视频文件,在测试中打开它并馈送到你的方法:

TEST(CalculateFpsTest, ReadFpsFromVideo) {
// I'm not familiar with openCV, but I imagine sth like that:
VideoCapture test_video{"path/to/your/15_fps_video"};
CalculateFps fps_provider{};
ASSERT_NEAR(fps_provider.getFps(test_video), 15.0, 0.1);
}

如果是第二个选项:可以模拟VideoCapture类并在测试中检查get(CAP_PROP_FPS)用于返回正确的 FPS。似乎这种方法是虚拟的,并且类具有虚拟dtor,因此这是可能的。

如果是第 3 个选项,您可以引入纯抽象CalculateFpsInterface类并在其他测试中模拟它(我推荐这种方法(。

这样,您就不必关心fps的实际计算方式 - 在某些时候,您甚至不必为此使用openCV。模拟的用法将允许您轻松地将此方法的实现与接口=分离(将代码与openCV分离(。

最新更新