提交 2ea0fac0 authored 作者: blu's avatar blu

motion detect: new alg

上级 4a093a7a
......@@ -85,6 +85,8 @@ private:
long long packetTsDelta = 0;
float pps = 0, imgScalor = 1;
int pktLag = 0;
int fps = 18;
uint64_t pktCnt = 0;
//
int handleCloudMsg(vector<vector<uint8_t> > v)
......@@ -520,6 +522,9 @@ private:
return response;
}
static long long called = 0;
static int factor = 0;
while (response >= 0) {
response = avcodec_receive_frame(pCodecContext, pFrame);
if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) {
......@@ -540,46 +545,25 @@ private:
pFrame->key_frame,
pFrame->coded_picture_number
);
break;
}
}
static long long called = 0;
static int factor = 0;
called++;
bool proc = true;
if(this->pps != 0 && factor == 0) {
// lock the value
factor = int(int(this->pps) / this->detPara.fpsProc); // regulator to 0 if it was set inresonably high
if(factor > 8) {
factor = 8;
}
}
if(factor != 0 ) {
if(called % factor == 0) {
proc = true;
//factor = 0; // reset it open to change
}
else {
proc = false;
}
}
if(!proc) {
if(this->pps != 0 && (called %180) == 0) {
spdlog::info("{} pps {}, fpsFactor {}, called {}, lag {}, skip processing", this->selfId, this->pps, factor, called, this->pktLag);
}
// detectMotion(pCodecContext->pix_fmt, pFrame, false);
}
else {
if((called % (180*4)) == 0) {
spdlog::info("{} pps {}, fpsFactor {}, called {}, lag {}", this->selfId, this->pps, factor, called, this->pktLag);
}
detectMotion(pCodecContext->pix_fmt, pFrame, detect);
factor = 0; // refresh to latest value
}
bool proc = false;
if(pktCnt % (this->fps / detPara.fpsProc + 1) == 0) {
proc = true;
}
break;
if(!proc) {
if(pktCnt %18 == 0)
spdlog::info("{} pps {}, lag {}, skip processing", this->selfId, this->pps, this->pktLag);
}
else {
if(detect) {
detectMotion(pCodecContext->pix_fmt, pFrame, detect);
}
}
return 0;
}
......@@ -651,7 +635,7 @@ private:
}
cv::threshold(thresh, gray, detPara.thre, 255, cv::THRESH_BINARY);
cv::dilate(gray, thresh, cv::Mat(), cv::Point(-1,-1), 2);
//cv::dilate(gray, thresh, cv::Mat(), cv::Point(-1,-1), 2);
#ifdef DEBUG
matShow1 = thresh.clone();
......@@ -686,10 +670,7 @@ private:
// business logic for event
// auto dura = chrono::duration_cast<chrono::seconds>(packetTm - evtStartTmLast).count();
if(hasEvent){
evtStartTmLast = packetTm;
}
long long dura = 0;
if(evtStartTmLast != 0) {
dura = packetTm - evtStartTmLast;
......@@ -700,73 +681,64 @@ private:
if(hasEvent) {
evtState = PRE;
spdlog::info("{} state: NONE->PRE ({}, {})", selfId, dura, evtCnt);
evtCnt = 0;
evtStartTmOrig = packetTm;
evtStartTmLast = packetTm;
}
break;
}
case PRE: {
if(hasEvent) {
if(dura > detPara.pre /*&& evtCnt < detPara.pre*/) {
spdlog::info("state: PRE->PRE ({}, {})", dura, evtCnt);
evtState = PRE;
if(dura >= detPara.pre) {
if(evtCnt < detPara.fpsProc * dura/2) {
spdlog::info("state: PRE->NONE ({}, {})", dura, evtCnt);
evtState = NONE;
evtStartTmOrig = packetTm;
evtCnt = 0;
}
else if (true/*dura > detPara.pre && evtCnt >= detPara.pre*/) {
}else{
evtState = IN;
json p;
spdlog::info("{} state: PRE->IN ({}, {})", selfId, dura, evtCnt);
evtCnt = 0;
makeEvent(EV_MSG_EVENT_MOTION_START, evtStartTmOrig);
auto tmp = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
packetTsDelta = tmp - packetTm;
spdlog::info("{} packet ts delta: {}", selfId, packetTsDelta);
}
}
else {
if(dura > detPara.pre) {
evtState= NONE;
spdlog::info("{} state: PRE->NONE ({}, {})", selfId, dura, evtCnt);
evtCnt = 0;
}
evtCnt = 0;
evtStartTmLast = packetTm;
}
break;
}
case IN: {
if(!hasEvent) {
if(dura > (int)(detPara.post/2)) {
if( packetTm - evtStartTmOrig > 60 *detPara.maxDuration ) {
evtStartTmOrig = packetTm;
makeEvent(EV_MSG_EVENT_MOTION_END, packetTs);
makeEvent(EV_MSG_EVENT_MOTION_START, packetTs);
spdlog::warn("{} event video continued over {} minutes, force segmenting and continue", devSn, detPara.maxDuration);
spdlog::debug("{} state: IN->IN ({}, {})",selfId, dura, evtCnt);
evtCnt = 0;
evtStartTmLast = packetTm;
}else if(dura >= detPara.post/2){
if(evtCnt < detPara.fpsProc * dura/5){
evtState = POST;
spdlog::info("{} state: IN->POST ({}, {})", selfId, dura, evtCnt);
evtCnt = 0;
}
}
else {
if( (packetTm - evtStartTmOrig) > (60 *detPara.maxDuration) ) {
evtStartTmOrig = packetTm;
makeEvent(EV_MSG_EVENT_MOTION_END, packetTs);
evtCnt = 0;
makeEvent(EV_MSG_EVENT_MOTION_START, packetTs);
spdlog::warn("{} event video continued over {} minutes, force segmenting and continue", devSn, detPara.maxDuration);
}else{
spdlog::debug("{} state: IN->IN ({}, {})", selfId, dura, evtCnt);
}
spdlog::debug("{} state: IN->IN ({}, {})",selfId, dura, evtCnt);
evtCnt = 0;
evtStartTmLast = packetTm;
}
break;
}
case POST: {
if(!hasEvent) {
if(dura > detPara.post) {
if(dura >= detPara.post/2){
if(evtCnt < detPara.fpsProc * dura/5){
spdlog::info("state: POST->NONE ({}, {})", dura, evtCnt);
evtState = NONE;
evtCnt = 0;
makeEvent(EV_MSG_EVENT_MOTION_END, packetTs);
}else{
spdlog::info("state: POST->IN ({}, {})", dura, evtCnt);
evtState = IN;
}
}
else {
spdlog::info("state: POST->IN ({}, {})", dura, evtCnt);
evtState=IN;
evtCnt = 0;
evtStartTmLast = packetTm;
}
break;
}
......@@ -777,7 +749,6 @@ protected:
void run()
{
bool bStopSig = false;
uint64_t pktCnt = 0;
zmq_msg_t msg;
AVPacket packet;
json eventToSlicer;
......@@ -877,6 +848,31 @@ protected:
}
}
zmq_msg_close(&msg);
static int _fpsDetectCnt = 0;
static auto _pts = packet.pts;
if(pAVFormatInput->streams[packet.stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
static auto num = pAVFormatInput->streams[packet.stream_index]->time_base.num;
static auto den = pAVFormatInput->streams[packet.stream_index]->time_base.den;
_fpsDetectCnt++;
if(_fpsDetectCnt < 20){
if(_fpsDetectCnt == 1) {
_pts = packet.pts;
}
}
else{
_pts = packet.pts - _pts;
auto ts = _pts * 1.0* num/den;
this->fps = int(20/ts);
if(this->fps <=5) {
this->fps = 18;
}
spdlog::info("{} calc fps in 20 frame: ts: {}, fps: {}", selfId, ts, this->fps);
_fpsDetectCnt = 0;
_pts = packet.pts;
}
}
if(pktCnt % EV_LOG_PACKET_CNT == 0) {
spdlog::info("{} seq: {}, pts: {}, dts: {}, idx: {}", selfId, pktCnt, packet.pts, packet.dts, packet.stream_index);
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论