added -P for should_do_judge_according_time()
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include "myrga.h"
|
#include "myrga.h"
|
||||||
#include "pose_body.h"
|
#include "pose_body.h"
|
||||||
#include "rknn.h"
|
#include "rknn.h"
|
||||||
|
#include "vertix.h"
|
||||||
|
|
||||||
extern long max_time_elapsed;
|
extern long max_time_elapsed;
|
||||||
|
|
||||||
@@ -92,6 +93,11 @@ void convert_a_frame(MppFrame frame)
|
|||||||
{
|
{
|
||||||
// lock acquired, should create thread and use pose_body
|
// lock acquired, should create thread and use pose_body
|
||||||
|
|
||||||
|
if (!should_do_judge_according_time()) {
|
||||||
|
pthread_mutex_unlock(&frame_mutex);
|
||||||
|
free(out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
pthread_t pose_body_handler;
|
pthread_t pose_body_handler;
|
||||||
pthread_create(&pose_body_handler, NULL, pose_body_thread, (void *)out);
|
pthread_create(&pose_body_handler, NULL, pose_body_thread, (void *)out);
|
||||||
pthread_detach(pose_body_handler);
|
pthread_detach(pose_body_handler);
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ static struct option long_options[] = {
|
|||||||
{"upload-port", required_argument, NULL, 'p'},
|
{"upload-port", required_argument, NULL, 'p'},
|
||||||
{"workspace", required_argument, NULL, 'w'},
|
{"workspace", required_argument, NULL, 'w'},
|
||||||
{"threshold", required_argument, NULL, 'r'},
|
{"threshold", required_argument, NULL, 'r'},
|
||||||
|
{"time-period", required_argument, NULL, 'P'},
|
||||||
{0, 0, 0}};
|
{0, 0, 0}};
|
||||||
|
|
||||||
void print_usage(char *cmd)
|
void print_usage(char *cmd)
|
||||||
@@ -154,10 +155,11 @@ void parse_options(int argc, char **argv)
|
|||||||
int thresh;
|
int thresh;
|
||||||
conf_threshold = DEFAULT_CONF_THRESHOLD;
|
conf_threshold = DEFAULT_CONF_THRESHOLD;
|
||||||
char *cmd = argv[0];
|
char *cmd = argv[0];
|
||||||
|
int ok;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
c = getopt_long_only(argc, argv, "es:m:w:c:t:p:r:", long_options, &option_index);
|
c = getopt_long_only(argc, argv, "es:m:w:c:t:p:r:P:", long_options, &option_index);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -200,6 +202,13 @@ void parse_options(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
conf_threshold = (float)thresh / 100.0;
|
conf_threshold = (float)thresh / 100.0;
|
||||||
break;
|
break;
|
||||||
|
case 'P':
|
||||||
|
ok = get_all_time_period_from_arguments(optarg);
|
||||||
|
if (ok != 0) {
|
||||||
|
printf("failed to parse time period\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_usage(cmd);
|
print_usage(cmd);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ int print_object_detect_result(rknn_app_context_t *rknn, object_detect_result_li
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
char *label = labels[group->results[i].cls_id];
|
char *label = labels[group->results[i].cls_id];
|
||||||
if (group->results[i].cls_id != 4 && group->results[i].prop < conf_threshold) {
|
if (group->results[i].prop < conf_threshold) {
|
||||||
printf("skip prop = %f for class %s\n", group->results[i].prop, label);
|
printf("skip prop = %f for class %s\n", group->results[i].prop, label);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
+153
@@ -1,8 +1,11 @@
|
|||||||
#include "vertix.h"
|
#include "vertix.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include "pose_body.h"
|
#include "pose_body.h"
|
||||||
|
|
||||||
Polygon workspace;
|
Polygon workspace;
|
||||||
|
time_gap_t global_time_gap;
|
||||||
|
|
||||||
void dump_polygon_to_file(char *filename) {
|
void dump_polygon_to_file(char *filename) {
|
||||||
FILE *fp = fopen(filename, "w+");
|
FILE *fp = fopen(filename, "w+");
|
||||||
@@ -135,3 +138,153 @@ bool is_point_in_workspace(int left, int top, int right, int bottom)
|
|||||||
#endif
|
#endif
|
||||||
return inside;
|
return inside;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取今天的秒数
|
||||||
|
int get_today_seconds() {
|
||||||
|
time_t current_time;
|
||||||
|
struct tm time_info;
|
||||||
|
int total_seconds;
|
||||||
|
|
||||||
|
time(¤t_time);
|
||||||
|
localtime_r(¤t_time, &time_info);
|
||||||
|
total_seconds = time_info.tm_hour * 3600 + time_info.tm_min * 60 + time_info.tm_sec;
|
||||||
|
return total_seconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
int should_do_judge_according_time() {
|
||||||
|
int now = get_today_seconds();
|
||||||
|
int ok = false;
|
||||||
|
if (global_time_gap.in) {
|
||||||
|
for (int i = 0; i < global_time_gap.size; i++) {
|
||||||
|
if (global_time_gap.periods[i].from <= now && global_time_gap.periods[i].to >= now) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// not in
|
||||||
|
for (int i = 0; i < global_time_gap.size; i++) {
|
||||||
|
if (global_time_gap.periods[i].from > now || global_time_gap.periods[i].to < now) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_today_seconds_from_string(const char *str) {
|
||||||
|
char *token;
|
||||||
|
char *rest = (char*)str;
|
||||||
|
int hour = 0, minute = 0, second = 0;
|
||||||
|
|
||||||
|
char *origin = (char*)malloc(sizeof(char)*(strlen(str)+1));
|
||||||
|
strncpy(origin, str, strlen(str));
|
||||||
|
origin[strlen(str)] = '\0';
|
||||||
|
|
||||||
|
token = strtok_r(origin, ":", &rest);
|
||||||
|
|
||||||
|
if (token != NULL) {
|
||||||
|
hour = atoi(token);
|
||||||
|
} else {
|
||||||
|
free(origin);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
token = strtok_r(NULL, ":", &rest);
|
||||||
|
if (token != NULL) {
|
||||||
|
minute = atoi(token);
|
||||||
|
}
|
||||||
|
token = strtok_r(NULL, ":", &rest);
|
||||||
|
if (token != NULL) {
|
||||||
|
second = atoi(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(origin);
|
||||||
|
return hour * 3600 + minute * 60 + second;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_period_t* get_time_period_from_string(char *str) {
|
||||||
|
char *token;
|
||||||
|
char *rest = str;
|
||||||
|
char *origin = (char*)malloc(sizeof(char)*(strlen(str)+1));
|
||||||
|
strncpy(origin, str, strlen(str));
|
||||||
|
origin[strlen(str)] = '\0';
|
||||||
|
|
||||||
|
printf("\norigin=%s\n", origin);
|
||||||
|
token = strtok_r(origin, "-", &rest);
|
||||||
|
printf("token1 = %s\n", token);
|
||||||
|
if (token == NULL) {
|
||||||
|
printf("token1 is null\n");
|
||||||
|
free(origin);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
printf("start_token = %s\n", token);
|
||||||
|
int start = get_today_seconds_from_string(token);
|
||||||
|
if (start < 0) {
|
||||||
|
free(origin);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
printf("rest = \"%s\"", rest);
|
||||||
|
if (strlen(rest) == 0) {
|
||||||
|
token = "23:59:59";
|
||||||
|
} else {
|
||||||
|
token = rest;
|
||||||
|
}
|
||||||
|
printf("end_token = %s\n", token);
|
||||||
|
int end = get_today_seconds_from_string(token);
|
||||||
|
|
||||||
|
printf("start = %d, end = %d\n", start, end);
|
||||||
|
free(origin);
|
||||||
|
|
||||||
|
time_period_t *result = (time_period_t*)malloc(sizeof(time_period_t));
|
||||||
|
result->from = start;
|
||||||
|
result->to = end;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_all_time_period_from_arguments(const char *str) {
|
||||||
|
if (strlen(str) == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char in = 1;
|
||||||
|
|
||||||
|
char *origin = (char*)malloc(sizeof(char)*(strlen(str)+1));
|
||||||
|
strncpy(origin, str, strlen(str));
|
||||||
|
origin[strlen(str)] = '\0';
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
if (str[0] == '!') {
|
||||||
|
offset = 1;
|
||||||
|
in = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *rest;
|
||||||
|
char *info;
|
||||||
|
char *start = origin;
|
||||||
|
printf(in ? "in" : "not in ");
|
||||||
|
|
||||||
|
global_time_gap.periods = (time_period_t*) malloc(sizeof(time_period_t)*64);
|
||||||
|
|
||||||
|
int size = 0;
|
||||||
|
while ((info = strtok_r(start, ",", &rest)) != NULL) {
|
||||||
|
time_period_t* period = get_time_period_from_string(info);
|
||||||
|
if (period == NULL) {
|
||||||
|
printf("failed to parse gap: %s\n", info);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
global_time_gap.periods[size].from = period->from;
|
||||||
|
global_time_gap.periods[size].from = period->to;
|
||||||
|
free(period);
|
||||||
|
size++;
|
||||||
|
if (size >= 64) {
|
||||||
|
printf("too many periods specified: > 64\n");
|
||||||
|
free(global_time_gap.periods);
|
||||||
|
free(origin);
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
start = NULL;
|
||||||
|
}
|
||||||
|
global_time_gap.size = size;
|
||||||
|
free(origin);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
#ifndef __MY_VERTIX_H__
|
#ifndef __MY_VERTIX_H__
|
||||||
#define __MY_VERTIX_H__
|
#define __MY_VERTIX_H__
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int from;
|
||||||
|
int to;
|
||||||
|
} time_period_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
// 如果in为0,则表示需要再这段时间,否则,表示在这段时间之外
|
||||||
|
bool in;
|
||||||
|
int size;
|
||||||
|
time_period_t *periods;
|
||||||
|
} time_gap_t;
|
||||||
|
|
||||||
|
extern time_gap_t global_time_gap;
|
||||||
|
|
||||||
|
|
||||||
|
int should_do_judge_according_time();
|
||||||
|
|
||||||
|
// 获取今天的秒数
|
||||||
|
int get_today_seconds();
|
||||||
|
|
||||||
|
// 将16:05:00类似的字符串,转换成一天的秒数
|
||||||
|
int get_all_time_period_from_arguments(const char *str);
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float x;
|
float x;
|
||||||
|
|||||||
Reference in New Issue
Block a user