Simd Library Documentation.

Home | Release Notes | Download | Documentation | Issues | GitHub | SourceForge
Simd::Motion Namespace Reference

Contains Framework for motion detection. More...

Data Structures

class  Detector
 Class Detector. More...
 
struct  Event
 Event structure. More...
 
struct  Metadata
 Metadata structure. More...
 
struct  Model
 Model structure. More...
 
struct  Object
 Object structure. More...
 
struct  Options
 Options structure. More...
 
struct  Position
 Position structure. More...
 

Typedefs

typedef double Time
 Time type.
 
typedef int Id
 ID type.
 
typedef std::string String
 String type.
 
typedef Simd::Point< ptrdiff_t > Size
 screen 2D-size (width and height).
 
typedef Simd::Point< ptrdiff_t > Point
 screen point (x and y).
 
typedef std::vector< PointPoints
 Vector of screen 2D-points.
 
typedef Simd::Rectangle< ptrdiff_t > Rect
 Screen rectangle.
 
typedef Simd::Point< double > FSize
 ONVIF 2D-size (width and height). ONVIF size is restricted by range [0, 2].
 
typedef Simd::Point< double > FPoint
 ONVIF 2D-point (x and y). ONVIF coordinates are restricted by range [-1, 1].
 
typedef std::vector< FPointFPoints
 Vector of ONVIF 2D-points.
 
typedef Simd::View< Simd::AllocatorView
 Image type.
 
typedef Simd::Frame< Simd::AllocatorFrame
 Frame type.
 
typedef std::vector< PositionPositions
 Vector of object positions.
 
typedef std::vector< ObjectObjects
 Vector of objects.
 
typedef std::vector< EventEvents
 Vector of events.
 

Functions

SIMD_INLINE double ScreenToOnvifX (ptrdiff_t x, ptrdiff_t screenWidth)
 Converts screen X-coordinate to ONVIF X-coordinate. More...
 
SIMD_INLINE double ScreenToOnvifY (ptrdiff_t y, ptrdiff_t screenHeight)
 Converts screen Y-coordinate to ONVIF Y-coordinate. More...
 
SIMD_INLINE FPoint ScreenToOnvif (const Point &point, const Point &screenSize)
 Converts screen 2D-coordinates to ONVIF 2D-coordinates. More...
 
SIMD_INLINE FSize ScreenToOnvifSize (const Size &size, const Point &screenSize)
 Converts screen 2D-size to ONVIF 2D-size. More...
 
SIMD_INLINE ptrdiff_t OnvifToScreenX (double x, ptrdiff_t screenWidth)
 Converts ONVIF X-coordinate to screen X-coordinate. More...
 
SIMD_INLINE ptrdiff_t OnvifToScreenY (double y, ptrdiff_t screenHeight)
 Converts ONVIF Y-coordinate to screen Y-coordinate. More...
 
SIMD_INLINE Point OnvifToScreen (const FPoint &point, const Point &screenSize)
 Converts ONVIF 2D-coordinates to screen 2D-coordinates. More...
 
SIMD_INLINE Size OnvifToScreenSize (const FSize &size, const Point &screenSize)
 Converts ONVIF 2D-size to screen 2D-size. More...
 
SIMD_INLINE String ToString (Id id)
 Converts ID to string. More...
 

Detailed Description

Contains Framework for motion detection.

Note
This is wrapper around low-level Motion Detection API.

Using example (motion detection in the video captured by OpenCV):

#include <iostream>
#include <string>
#include <list>
#include "opencv2/opencv.hpp"
#ifndef SIMD_OPENCV_ENABLE
#define SIMD_OPENCV_ENABLE
#endif
#include "Simd/SimdMotion.hpp"
using namespace Simd::Motion;
typedef std::list<Event> EventList;
typedef Simd::Pixel::Bgr24 Color;
const Color Red(0, 0, 255), Yellow(0, 255, 255), White(0, 255, 255);
void Annotate(const Metadata & metadata, const Simd::Font & font, EventList & events, View & image)
{
for (size_t i = 0; i < metadata.objects.size(); i++)
{
const Object & object = metadata.objects[i];
bool alarmed = false;
for (size_t j = 0; j < metadata.events.size(); ++j)
{
const Event & event = metadata.events[j];
if (event.objectId == object.id)
{
alarmed = true;
break;
}
}
Color color = alarmed ? Red : Yellow;
int width = alarmed ? 2 : 1;
Simd::DrawRectangle(image, object.rect, color, width);
font.Draw(image, ToString(object.id), Point(object.rect.left, object.rect.top - font.Height()), color);
for (size_t j = 1; j < object.trajectory.size(); ++j)
Simd::DrawLine(image, object.trajectory[j - 1].point, object.trajectory[j].point, color, width);
}
for (size_t i = 0; i < metadata.events.size(); ++i)
{
events.push_front(metadata.events[i]);
if (events.size()*font.Height() > image.height)
events.pop_back();
}
Point location;
for (EventList::const_iterator it = events.begin(); it != events.end(); ++it)
{
std::stringstream ss;
Color color = White;
switch (it->type)
{
ss << "in " << it->objectId;
break;
ss << "out " << it->objectId;
break;
ss << "SABOTAGE ON";
color = Red;
break;
ss << "SABOTAGE OFF";
color = Red;
break;
};
font.Draw(image, ss.str(), location, color);
location.y += font.Height();
}
}
int main(int argc, char * argv[])
{
if (argc < 2)
{
std::cout << "You have to set video source! It can be 0 for camera or video file name." << std::endl;
return 1;
}
std::string source = argv[1];
cv::VideoCapture capture;
if (source == "0")
capture.open(0);
else
capture.open(source);
if (!capture.isOpened())
{
std::cout << "Can't capture '" << source << "' !" << std::endl;
return 1;
}
EventList events;
Detector detector;
Simd::Font font;
const char * WINDOW_NAME = "MotionDetector";
cv::namedWindow(WINDOW_NAME, 1);
double time = 0;
for (;;)
{
cv::Mat frame;
capture >> frame;
View image = frame;
Frame input(image, false, time);
Metadata metadata;
detector.NextFrame(input, metadata);
font.Resize(image.height / 32);
Annotate(metadata, font, events, image);
cv::imshow(WINDOW_NAME, frame);
if (cvWaitKey(1) == 27)// "press 'Esc' to break video";
break;
time += 0.040;
}
return 0;
}