Overview
GasLeakDetector C++ library amplifies subtle motion and temporal variations in digital video content. The library implements a video filtering function and can be used not only for Gas Leak Detection but for motion magnification in general. The library is implemented in C++ (C++17 standard). This library is suitable for various types of cameras (daylight, SWIR, MWIR and LWIR). Each instance of the GasLeakDetector C++ class object performs frame-by-frame processing of a video data stream. The image processing kernels are vectorized with SIMD instructions, with back-ends for AVX2, SSE2 and ARM NEON plus a portable scalar fallback, so no external computing library is required. The library is only intended for stationary (or slowly moving) cameras or for PTZ cameras when observing a certain sector. The library depends on the open-source VFilter library (provides interface as well as defines data structures for various video filter implementations, source code included, Apache 2.0 license).
Downloads
Documentation: GO TO DOCUMENTATION
Demo application to check algorithms performance on your video (Windows x64): DOWNLOAD
Demo video
Simple interface
namespace cr
{
namespace video
{
/**
* @brief Gas leak detector class. Implements Eulerian video motion
* magnification to detect subtle intensity changes.
*/
class GasLeakDetector : public VFilter
{
public:
/** @brief Constructor. Creates GasLeakDetector object. */
GasLeakDetector();
/** @brief Destructor. Destroys GasLeakDetector object. */
~GasLeakDetector();
/** @brief Get string of current library version. */
static std::string getVersion();
/** @brief Initialize detector with given parameters. */
bool initVFilter(VFilterParams& params) override;
/** @brief Set detector parameter. */
bool setParam(VFilterParam id, float value) override;
/** @brief Get detector parameter value. */
float getParam(VFilterParam id) override;
/** @brief Get all detector parameters. */
void getParams(VFilterParams& params) override;
/** @brief Execute action command. */
bool executeCommand(VFilterCommand id) override;
/** @brief Process frame. */
bool processFrame(cr::video::Frame& frame) override;
/** @brief Set detector mask. */
bool setMask(cr::video::Frame mask) override;
/** @brief Decode and execute command from serialized data. */
bool decodeAndExecuteCommand(uint8_t* data, int size) override;
};
}
}
Simple example
#include <opencv2/opencv.hpp>
#include "GasLeakDetector.h"
int main(void)
{
// Open video file "test.mp4".
cv::VideoCapture videoSource;
if (!videoSource.open("test.mp4"))
return -1;
// Create frames.
cv::Mat bgrImg;
int width = (int)videoSource.get(cv::CAP_PROP_FRAME_WIDTH);
int height = (int)videoSource.get(cv::CAP_PROP_FRAME_HEIGHT);
cr::video::Frame frameYuv(width, height, cr::video::Fourcc::YUV24);
// Create gas leak detector and set initial params.
cr::video::GasLeakDetector filter;
filter.setParam(cr::video::VFilterParam::MODE, 1); // Enable.
filter.setParam(cr::video::VFilterParam::LEVEL, 50); // 50% level.
// Main loop.
while (true)
{
// Capture next video frame. Default BGR pixel format.
videoSource >> bgrImg;
if (bgrImg.empty())
{
// Set initial video position to replay.
videoSource.set(cv::CAP_PROP_POS_FRAMES, 0);
continue;
}
// Convert BGR to YUV for filter.
cv::Mat yuvImg(height, width, CV_8UC3, frameYuv.data);
cv::cvtColor(bgrImg, yuvImg, cv::COLOR_BGR2YUV);
// Magnify movement with default params.
filter.processFrame(frameYuv);
// Convert result YUV to BGR to display.
cv::cvtColor(yuvImg, bgrImg, cv::COLOR_YUV2BGR);
// Show video.
cv::imshow("VIDEO", bgrImg);
if (cv::waitKey(1) == 27)
return 0;
}
return 1;
}

