Overview
DnnOpenCvDetector C++ library performs automatic detection of objects on videos through the utilization of neural networks. The library is implemented in C++ (C++17 standard) and exclusively relies on OpenCV library (version >=4.5.0). The library supports various neural network models, if only model is supported by OpenCV and has a standard one-batch architecture like in yolov8 models. Neural network model can be specified in detector parameters, library inherits its interface from the ObjectDetector class (provides interface for object detectors, source code included, Apache 2.0 license). Additionally the demo application depends on SimpleFileDialog library (provides function to open video file via file dialog, source code included, Apache 2.0 license).
Documentation
Documentation: GO TO DOCUMENTATION
Simple interface
class DnnOpenCvDetector : public ObjectDetector
{
public:
/// Get string of current library version.
static std::string getVersion();
/// Init object detector.
bool initObjectDetector(ObjectDetectorParams& params) override;
/// Set object detector param.
bool setParam(ObjectDetectorParam id, float value) override;
/// Get object detector param value.
float getParam(ObjectDetectorParam id) override;
/// Get object detector params structure.
void getParams(ObjectDetectorParams& params) override;
/// Get list of objects.
std::vector<Object> getObjects() override;
/// Execute command.
bool executeCommand(ObjectDetectorCommand id) override;
/// Perform detection.
bool detect(cr::video::Frame& frame) override;
/// Set detection mask.
bool setMask(cr::video::Frame mask) override;
/// Decode command and execute command.
bool decodeAndExecuteCommand(uint8_t* data, int size) override;
}
Simple example
#include <opencv2/opencv.hpp>
#include "DnnOpenCvDetector.h"
int main(void)
{
// Open video file "test.mp4".
cv::VideoCapture videoSource;
if (!videoSource.open("test.mp4"))
return -1;
// Create and init detector.
cr::detector::DnnOpenCvDetector detector;
cr::detector::ObjectDetectorParams params;
params.initString = "./yolov7s.onnx;640;640";
params.maxObjectHeight = 96;
params.maxObjectWidth = 96;
params.minObjectHeight = 4;
params.minObjectHeight = 4;
params.type = 0;
detector.initObjectDetector(params);
// Create frames.
cv::Mat frameBgrOpenCv;
// Main loop.
while (true) {
// Capture next video frame.
videoSource >> frameBgrOpenCv;
if (frameBgrOpenCv.empty()) {
// If we have video file we can set initial position to replay.
detector.executeCommand(cr::detector::ObjectDetectorCommand::RESET);
videoSource.set(cv::CAP_PROP_POS_FRAMES, 0);
continue;
}
// Copy frame data from OpenCv frame to Frame.
cr::video::Frame frameBgr;
frameBgr.fourcc = cr::video::Fourcc::BGR24;
frameBgr.width = frameBgrOpenCv.size().width;
frameBgr.height = frameBgrOpenCv.size().height;
frameBgr.size = frameBgr.width * frameBgr.height * 3;
frameBgr.data = frameBgrOpenCv.data;
// Detect objects.
detector.detect(frameBgr);
// Get list of objects.
std::vector<cr::detector::Object> objects = detector.getObjects();
// Draw detected objects.
for (int n = 0; n < objects.size(); ++n) {
rectangle(frameBgrOpenCv, cv::Rect(objects[n].x, objects[n].y,
objects[n].width, objects[n].height),
cv::Scalar(0, 0, 255), 1);
putText(frameBgrOpenCv, std::to_string(objects[n].p),
cv::Point(objects[n].x, objects[n].y),
1, 1, cv::Scalar(0, 0, 255));
}
// Show video.
cv::imshow("VIDEO", frameBgrOpenCv);
// Wait ESC.
if (cv::waitKey(1) == 27)
return -1;
}
return 1;
}