Overview
DnnOpenVinoDetector C++ library performs automatic detection of objects in videos through the utilization of neural networks. The library is implemented in C++17 standard and uses Intel’s OpenVINO™. It is optimized and tested for Ultralytics YOLOv8neural network model and provides a simple interface. The library configures OpenVINO™ runtime, performs frame preprocessing (pixel format conversion and scaling), passes the frame to OpenVINO™ for computation and interprets the results. The library inherits interface from the ObjectDetectorclass (provides interface for object detectors, source code included, Apache 2.0 license).
Documentation
Documentation: GO TO DOCUMENTATION
Simple interface
class DnnOpenVinoDetector : public ObjectDetector
{
public:
/// Class constructor.
DnnOpenVinoDetector();
/// Class destructor.
~DnnOpenVinoDetector();
/// 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 "DnnOpenVinoDetector.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::DnnOpenVinoDetector 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 = 1;
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;
}

