mirror of
https://github.com/Motion-Project/motion.git
synced 2026-02-05 12:31:43 -05:00
Revisions for alg timing and secondary detection
This commit is contained in:
@@ -897,7 +897,7 @@ void cls_alg::lightswitch()
|
||||
|
||||
void cls_alg::ref_frame_update()
|
||||
{
|
||||
int accept_timer = cam->lastrate * cam->cfg->static_object_time;
|
||||
int accept_timer;
|
||||
int i, threshold_ref;
|
||||
int *ref_dyn = cam->imgs.ref_dyn;
|
||||
u_char *image_virgin = cam->imgs.image_vprvcy;
|
||||
@@ -905,11 +905,7 @@ void cls_alg::ref_frame_update()
|
||||
u_char *mask_final = smartmask_final;
|
||||
u_char *out = cam->imgs.image_motion.image_norm;
|
||||
|
||||
if (cam->lastrate > 5) {
|
||||
/* Match rate limit */
|
||||
accept_timer /= (cam->lastrate / 3);
|
||||
}
|
||||
|
||||
accept_timer = cam->cfg->static_object_time * cam->cfg->framerate;
|
||||
threshold_ref = cam->noise * EXCLUDE_LEVEL_PERCENT / 100;
|
||||
|
||||
for (i = cam->imgs.motionsize; i > 0; i--) {
|
||||
|
||||
132
src/alg_sec.cpp
132
src/alg_sec.cpp
@@ -45,12 +45,40 @@ static void *algsec_handler(void *arg)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void cls_algsec::debug_notice(Mat &mat_dst, bool isdetect)
|
||||
{
|
||||
if (handler_stop == true) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cfg_log_level >= DBG) {
|
||||
if (first_pass == true) {
|
||||
MOTPLS_LOG(DBG, TYPE_ALL, NO_ERRNO
|
||||
, "Secondary detect and debug enabled.");
|
||||
MOTPLS_LOG(DBG, TYPE_ALL, NO_ERRNO
|
||||
, "Saving source and detected images to %s"
|
||||
, cfg_target_dir.c_str());
|
||||
first_pass = false;
|
||||
}
|
||||
if (isdetect == true) {
|
||||
imwrite(cfg_target_dir + "/detect_" + method + ".jpg"
|
||||
, mat_dst);
|
||||
} else {
|
||||
imwrite(cfg_target_dir + "/src_" + method + ".jpg"
|
||||
, mat_dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cls_algsec::image_show(Mat &mat_dst)
|
||||
{
|
||||
//std::string testdir;
|
||||
std::vector<uchar> buff; //buffer for coding
|
||||
std::vector<uchar> buff;
|
||||
std::vector<int> param(2);
|
||||
|
||||
if (handler_stop == true) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* We check the size so that we at least fill in the first image so the
|
||||
* web stream will have something to start with. After feeding in at least
|
||||
* the first image, we rely upon the connection count to tell us whether we
|
||||
@@ -59,16 +87,7 @@ void cls_algsec::image_show(Mat &mat_dst)
|
||||
(cam->imgs.size_secondary == 0) ||
|
||||
(cfg_log_level >= DBG)) {
|
||||
|
||||
if ((cfg_log_level >= DBG) &&
|
||||
(detected == true)) {
|
||||
MOTPLS_LOG(DBG, TYPE_ALL, NO_ERRNO, "Saved detected image: %s%s%s%s"
|
||||
, cfg_target_dir.c_str()
|
||||
, "/detect_"
|
||||
, method.c_str()
|
||||
, ".jpg");
|
||||
imwrite(cfg_target_dir + "/detect_" + method + ".jpg"
|
||||
, mat_dst);
|
||||
}
|
||||
debug_notice(mat_dst, detected);
|
||||
|
||||
param[0] = cv::IMWRITE_JPEG_QUALITY;
|
||||
param[1] = 75;
|
||||
@@ -88,22 +107,14 @@ void cls_algsec::label_image(Mat &mat_dst
|
||||
std::vector<double> fltr_weights;
|
||||
std::string testdir;
|
||||
std::size_t indx0, indx1;
|
||||
std::vector<uchar> buff; //buffer for coding
|
||||
std::vector<uchar> buff;
|
||||
std::vector<int> param(2);
|
||||
char wstr[10];
|
||||
|
||||
try {
|
||||
detected = false;
|
||||
|
||||
if (cfg_log_level >= DBG) {
|
||||
imwrite(cfg_target_dir + "/src_" + method + ".jpg"
|
||||
, mat_dst);
|
||||
MOTPLS_LOG(DBG, TYPE_ALL, NO_ERRNO, "Saved source image: %s%s%s%s"
|
||||
, cfg_target_dir.c_str()
|
||||
, "/src_"
|
||||
, method.c_str()
|
||||
, ".jpg");
|
||||
}
|
||||
debug_notice(mat_dst, detected);
|
||||
|
||||
for (indx0=0; indx0<src_pos.size(); indx0++) {
|
||||
Rect r = src_pos[indx0];
|
||||
@@ -151,16 +162,7 @@ void cls_algsec::label_image(Mat &mat_dst, double confidence, Point classIdPoint
|
||||
|
||||
try {
|
||||
detected = false;
|
||||
|
||||
if (cfg_log_level >= DBG) {
|
||||
imwrite(cfg_target_dir + "/src_" + method + ".jpg"
|
||||
, mat_dst);
|
||||
MOTPLS_LOG(DBG, TYPE_ALL, NO_ERRNO, "Saved source image: %s%s%s%s"
|
||||
, cfg_target_dir.c_str()
|
||||
, "/src_"
|
||||
, method.c_str()
|
||||
, ".jpg");
|
||||
}
|
||||
debug_notice(mat_dst, detected);
|
||||
|
||||
if (confidence < threshold) {
|
||||
return;
|
||||
@@ -196,13 +198,27 @@ void cls_algsec::get_image_roi(Mat &mat_src, Mat &mat_dst)
|
||||
roi.width = cam->current_image->location.width;
|
||||
roi.height = cam->current_image->location.height;
|
||||
|
||||
if ((roi.y + roi.height) > height) {
|
||||
/* Images smaller than 100 cause seg faults. 112 is the nearest
|
||||
multiple of 16 greater than 100*/
|
||||
if (roi.height < 112) {
|
||||
roi.height = 112;
|
||||
}
|
||||
if ((roi.y + roi.height) > (height-112)) {
|
||||
roi.y = height - roi.height;
|
||||
} else if ((roi.y + roi.height) > height) {
|
||||
roi.height = height - roi.y;
|
||||
}
|
||||
if ((roi.x + roi.width) > width) {
|
||||
|
||||
if (roi.width < 112) {
|
||||
roi.width = 112;
|
||||
}
|
||||
if ((roi.x + roi.width) > (width-112)) {
|
||||
roi.x = width - roi.width;
|
||||
} else {
|
||||
roi.width = width - roi.x;
|
||||
}
|
||||
|
||||
/*
|
||||
MOTPLS_LOG(INF, TYPE_ALL, NO_ERRNO, "Base %d %d (%dx%d) img(%dx%d)"
|
||||
,cam->current_image->location.minx
|
||||
,cam->current_image->location.miny
|
||||
@@ -211,17 +227,19 @@ void cls_algsec::get_image_roi(Mat &mat_src, Mat &mat_dst)
|
||||
,width,height);
|
||||
MOTPLS_LOG(INF, TYPE_ALL, NO_ERRNO, "Opencv %d %d %d %d"
|
||||
,roi.x,roi.y,roi.width,roi.height);
|
||||
|
||||
*/
|
||||
mat_dst = mat_src(roi);
|
||||
|
||||
}
|
||||
|
||||
void cls_algsec::get_image(Mat &mat_dst)
|
||||
{
|
||||
if ((image_type == "gray") || (image_type == "grey")) {
|
||||
Mat mat_src;
|
||||
|
||||
if (image_type == "grey") {
|
||||
mat_dst = Mat(cam->imgs.height, cam->imgs.width
|
||||
, CV_8UC1, (void*)image_norm);
|
||||
} else if (image_type == "roi") {
|
||||
} else if ((image_type == "roi") || (image_type == "greyroi")) {
|
||||
/*Discard really small and large images */
|
||||
if ((cam->current_image->location.width < 64) ||
|
||||
(cam->current_image->location.height < 64) ||
|
||||
@@ -229,16 +247,20 @@ void cls_algsec::get_image(Mat &mat_dst)
|
||||
((cam->current_image->location.height/cam->imgs.height) > 0.7)) {
|
||||
return;
|
||||
}
|
||||
Mat mat_src = Mat(cam->imgs.height*3/2, cam->imgs.width
|
||||
, CV_8UC1, (void*)image_norm);
|
||||
cvtColor(mat_src, mat_src, COLOR_YUV2RGB_YV12);
|
||||
if (image_type == "roi") {
|
||||
mat_src = Mat(cam->imgs.height*3/2, cam->imgs.width
|
||||
, CV_8UC1, (void*)image_norm);
|
||||
cvtColor(mat_src, mat_src, COLOR_YUV2RGB_YV12);
|
||||
} else {
|
||||
mat_src = Mat(cam->imgs.height, cam->imgs.width
|
||||
, CV_8UC1, (void*)image_norm);
|
||||
}
|
||||
get_image_roi(mat_src, mat_dst);
|
||||
} else {
|
||||
Mat mat_src = Mat(cam->imgs.height*3/2, cam->imgs.width
|
||||
mat_src = Mat(cam->imgs.height*3/2, cam->imgs.width
|
||||
, CV_8UC1, (void*)image_norm);
|
||||
cvtColor(mat_src, mat_dst, COLOR_YUV2RGB_YV12);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cls_algsec::detect_hog()
|
||||
@@ -327,7 +349,7 @@ void cls_algsec::detect_dnn()
|
||||
cv::exp(prob-maxProb, softmaxProb);
|
||||
sum = (float)cv::sum(softmaxProb)[0];
|
||||
softmaxProb /= sum;
|
||||
minMaxLoc(softmaxProb.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
|
||||
cv::minMaxLoc(softmaxProb.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
|
||||
|
||||
label_image(mat_dst, confidence, classIdPoint);
|
||||
|
||||
@@ -362,6 +384,17 @@ void cls_algsec::load_haar()
|
||||
}
|
||||
}
|
||||
|
||||
void cls_algsec::load_hog()
|
||||
{
|
||||
if (image_type == "roi") {
|
||||
image_type = "greyroi";
|
||||
} else if (
|
||||
(image_type != "grey") &&
|
||||
(image_type != "greyroi")) {
|
||||
image_type = "grey";
|
||||
}
|
||||
}
|
||||
|
||||
void cls_algsec::load_dnn()
|
||||
{
|
||||
std::string line;
|
||||
@@ -515,9 +548,12 @@ void cls_algsec::load_params()
|
||||
height = cam->imgs.height;
|
||||
width = cam->imgs.width;
|
||||
frame_missed = 0;
|
||||
frame_cnt = 0;
|
||||
too_slow = 0;
|
||||
in_process = false;
|
||||
first_pass = true;
|
||||
handler_stop = false;
|
||||
|
||||
cfg_framerate = cam->cfg->framerate;
|
||||
cfg_log_level = cam->app->cfg->log_level;
|
||||
cfg_target_dir = cam->cfg->target_dir;
|
||||
@@ -544,7 +580,7 @@ void cls_algsec::load_params()
|
||||
if (method == "haar") {
|
||||
load_haar();
|
||||
} else if (method == "hog") {
|
||||
//load_hog(models);
|
||||
load_hog();
|
||||
} else if (method == "dnn") {
|
||||
load_dnn();
|
||||
} else {
|
||||
@@ -568,7 +604,7 @@ void cls_algsec::handler()
|
||||
load_params();
|
||||
|
||||
interval = 1000000L / cfg_framerate;
|
||||
|
||||
is_started = true;
|
||||
while ((handler_stop == false) && (method != "none")) {
|
||||
if (in_process){
|
||||
if (method == "haar") {
|
||||
@@ -583,7 +619,7 @@ void cls_algsec::handler()
|
||||
SLEEP(0,interval)
|
||||
}
|
||||
}
|
||||
|
||||
is_started = false;
|
||||
handler_stop = false;
|
||||
handler_finished = true;
|
||||
MOTPLS_LOG(INF, TYPE_ALL, NO_ERRNO,_("Secondary detection stopped."));
|
||||
@@ -669,6 +705,9 @@ void cls_algsec::detect()
|
||||
if (method == "none") {
|
||||
return;
|
||||
}
|
||||
if (is_started == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (frame_cnt > 0) {
|
||||
frame_cnt--;
|
||||
@@ -718,6 +757,7 @@ cls_algsec::cls_algsec(cls_camera *p_cam)
|
||||
image_norm = nullptr;
|
||||
params = nullptr;
|
||||
method = "none";
|
||||
is_started = false;
|
||||
pthread_mutex_init(&mutex, NULL);
|
||||
handler_startup();
|
||||
#else
|
||||
|
||||
@@ -23,10 +23,13 @@
|
||||
#ifdef HAVE_OPENCV
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wconversion"
|
||||
#include "opencv2/objdetect.hpp"
|
||||
#include "opencv2/dnn.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include <opencv2/objdetect.hpp>
|
||||
#include <opencv2/dnn.hpp>
|
||||
#include <opencv2/highgui.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
#include <opencv2/imgcodecs.hpp>
|
||||
#include <opencv2/videoio.hpp>
|
||||
#include <opencv2/video.hpp>
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
@@ -50,6 +53,8 @@ class cls_algsec {
|
||||
#ifdef HAVE_OPENCV
|
||||
cls_camera *cam;
|
||||
bool in_process;
|
||||
bool is_started;
|
||||
bool first_pass;
|
||||
int frame_cnt;
|
||||
int frame_missed;
|
||||
int too_slow;
|
||||
@@ -70,6 +75,7 @@ class cls_algsec {
|
||||
|
||||
void load_dnn();
|
||||
void load_haar();
|
||||
void load_hog();
|
||||
void detect_dnn();
|
||||
void detect_haar();
|
||||
void detect_hog();
|
||||
@@ -79,13 +85,13 @@ class cls_algsec {
|
||||
void label_image(cv::Mat &mat_dst, std::vector<cv::Rect> &src_pos
|
||||
, std::vector<double> &src_weights);
|
||||
void image_show(cv::Mat &mat_dst);
|
||||
void debug_notice(cv::Mat &mat_dst,bool isdetect);
|
||||
|
||||
std::string config;
|
||||
ctx_params *params;
|
||||
|
||||
std::string model_file;
|
||||
int frame_interval;
|
||||
|
||||
std::string image_type;
|
||||
int rotate;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user