本篇主要解决物体越线问题,当运行代码时,视频会停在第一帧,这时可以用鼠标划出一条线段,作为越界的标准线。
当画完之后视频自动运行,有行人或者物体运动时会被检测出来并标出外接矩形框,当外接矩形框与画出线段相交时,会显示物体越界或物体越线,本产品用于公共场所的行为规范安全问题。
#include<iostream>
#include <windows.h>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <cmath>
#include<vector>
#include <opencv2/opencv.hpp>
#include<map>
#include<algorithm>
#include<functional>
using namespace cv;
using namespace std;
/*--------------------------------定义鼠标事件--画直线--------------------------*/
bool got_line = false;
//全局变量
Point beginPoint = Point(0, 0);//--注意这个有一个初始化的(0,0)
bool got_beigin_point = false;
Point endPoint = Point(0, 0);//--注意这个有一个自己默认的初始化(0,0)
void mouseLineHandler(int event, int x, int y, int flags, void *param)
{
switch (event)
{
case CV_EVENT_LBUTTONDOWN:
beginPoint = Point(x, y);
endPoint = beginPoint;
got_beigin_point = true;
break;
case CV_EVENT_MOUSEMOVE:
if (got_beigin_point)
{
endPoint = Point(x, y);
}
break;
case CV_EVENT_LBUTTONUP:
got_line = true;
endPoint = Point(x, y);
break;
default:
break;
}
}
//判断两条线段相交
bool intersection(const vector<Point> & line1, const vector<Point> &line2)//vector<Point> line(2),代表一线段
{
CV_Assert(line1.size() == line2.size());
CV_Assert(line1.size() == 2);
Point point1_11, point1_12, point1_21, point1_22;
//首先判断line1的两个端点,在line2的两侧
point1_11 = line2[0] - line1[0];
point1_12 = line2[1] - line1[0];
point1_21 = line2[0] - line1[1];
point1_22 = line2[1] - line1[1];
//point1_11.cross(point