#ifdef _MSC_VER #include #endif #include #include #include #include "time.h" #include #include #include "header.h" #include "mvpt.h" #include "sy_common.h" #include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #ifdef _MSC_VER #include #include #define ACCESS _access #define MKDIR(a) _mkdir((a)) #else #include #include #include #define ACCESS access #define MKDIR(a) mkdir((a),0755) #define TRUE 1 #define FALSE 0 #define Sleep(a) usleep((a)*1000) typedef int BOOL; typedef unsigned int DWORD; typedef void* LPVOID; typedef char _TCHAR; #endif #ifdef _DEBUG #else #pragma comment(lib,"mvpt.lib") //库文件 #endif using namespace std; //行人二次属性分析结果 static std::string head[] = { "长发", "短发", "其他" }; static std::string head_color[] = { "黑", "白", "其他" }; static std::string eye[] = { "未戴眼镜", "戴眼镜" }; static std::string mouth[] = { "未戴口罩", "戴口罩" }; static std::string up[] = { "T恤/背心", "衬衫", "毛衣", "外套", "连衣裙", "其他" }; static std::string up_color[] = { "黑", "白", "灰", "红", "蓝", "黄", "绿", "多色", "其他" }; static std::string clothing_text[] = { "纯色", "碎花", "条纹/格子", "其他" }; static std::string down[] = { "长裤", "短裤", "长裙", "短裙", "连衣裙", "其他" }; static std::string down_color[] = { "黑", "白", "灰", "红", "蓝", "黄", "绿", "多色", "其他" }; static std::string bao[] = { "无包", "有包" }; static std::string sex[] = { "男", "女", "不明" }; static std::string age[] = { "小孩", "成人", "不明" }; static std::string viewpoint[] = { "正面","背面", "侧面" }; static std::string dasan[] = { "未打伞", "打伞" }; static std::string child[] = { "无", "抱小孩" }; static std::string personstate[] = { "行走/站立", "奔跑", "坐/蹲", "推车", "其他" }; static std::string hcp_head[] = { "长发", "短发", "头盔", "其他" }; static std::string hcp_eye[] = { "未戴眼镜", "戴眼镜" }; static std::string hcp_mouth[] = { "未戴口罩", "戴口罩" }; static std::string hcp_weibo[] = { "未戴围巾", "戴围巾" }; static std::string hcp_up[] = { "T恤/背心", "衬衫", "毛衣", "外套", "连衣裙", "其他" }; static std::string hcp_up_color[] = { "黑", "白", "灰", "红", "蓝", "黄", "绿", "多色", "不明" }; static std::string hcp_clothing_text[] = { "纯色", "碎花", "条纹/格子", "其他" }; static std::string hcp_bao[] = { "无包", "背包" }; static std::string hcp_sex[] = { "男", "女", "不明" }; static std::string hcp_age[] = { "小孩", "成人", "其他" }; static std::string hcp_carColor[] = { "黑", "白", "红", "其他" }; static std::string hcp_orient[] = { "正面", "背面", "侧面" }; static std::string hcp_dasan[] = { "无", "有" }; static std::string hcp_take[] = { "无", "有" }; //车辆二次属性分析结果 static char colorLabel[14][8] = { "棕", "橙", "灰", "白", "粉", "紫", "红", "绿", "蓝", "金", "银", "青", "黄", "黑" }; //设置最小检测框,直接指定sy_rect的宽高即可,各种类目标小于最小检测框大小时不进行快照的保存和后续二次属性分析 sy_rect m_boxsize[DETECTTYPE] = { sy_rect(0,0,40, 90), sy_rect(0,0,50, 80), sy_rect(0,0,50, 80), sy_rect(0,0,60, 80), sy_rect(0,0,80, 80), sy_rect(0,0,90, 90), sy_rect(0,0,100, 100), sy_rect(0,0,100, 100), sy_rect(0,0,100, 100) }; //行人 自行车 摩托车 三轮车 小型车 大车 卡车 拖拉机 中巴 //#define PRINTF_ATTRIRES //操作句柄 std::map cur_task_status_; void videoObjInfoCallback(void * handle, video_object_info *obj_info) { //检测结果处理函数 cout << "handle :" << handle << " ObjInfo " << obj_info->task_id << " " << obj_info->task_frame_count << " " << obj_info->object_id << " " << obj_info->left << " " << obj_info->top << " " << obj_info->right << " " << obj_info->bottom << " " << obj_info->index << " " << obj_info->confidence << endl; return; } static int obj_index = 0; void videoObjSnapshotCallback(void * handle, video_object_snapshot *snapshot_info) { //#ifdef PRINTF_ATTRIRES cout << " == handle :" << handle << " snapshot " << snapshot_info->task_id << " " << snapshot_info->object_id << " " << snapshot_info->task_frame_count << " " << snapshot_info->video_image_path << " " << snapshot_info->snapshot_image_path << " " << snapshot_info->object_type_index << " " << snapshot_info->progress << " " << snapshot_info->confidence << " " << snapshot_info->left << " " << snapshot_info->right << " " << snapshot_info->top << " " << snapshot_info->bottom << endl; //#endif //输出二次属性分析结果 if (snapshot_info->analysisRes != NULL) { if (0 == snapshot_info->object_type_index) { hp_result *resHP = (hp_result *)snapshot_info->analysisRes; #ifdef PRINTF_ATTRIRES cv::Mat resImg = cv::imread(snapshot_info->snapshot_image_path); stringstream ss; ss << obj_index++; string resFileName = "picHP/" + ss.str() + "_"; if (resHP->feature != 0) { cout << "feature[0] :" << (int)resHP->feature[0] <feature[1] <feature[2] <feature[3] <feature[4] <res_objs.res_objs[i].res_index; switch (i) { case 0: cout << head[resIndex] << " "; resFileName += head[resIndex]; resFileName += "_"; break; case 1: cout << head_color[resIndex] << " "; resFileName += head_color[resIndex]; resFileName += "_"; break; case 2: cout << eye[resIndex] << " "; resFileName += eye[resIndex]; resFileName += "_"; break; case 3: cout << mouth[resIndex] << " "; resFileName += mouth[resIndex]; resFileName += "_"; break; case 4: cout << up[resIndex] << " "; resFileName += up[resIndex]; resFileName += "_"; break; case 5: cout << up_color[resIndex] << " "; resFileName += up_color[resIndex]; resFileName += "_"; break; case 6: cout << clothing_text[resIndex] << " "; resFileName += clothing_text[resIndex]; resFileName += "_"; break; case 7: cout << down[resIndex] << " "; resFileName += down[resIndex]; resFileName += "_"; break; case 8: cout << down_color[resIndex] << " "; resFileName += down_color[resIndex]; resFileName += "_"; break; case 9: cout << bao[resIndex] << " "; resFileName += bao[resIndex]; resFileName += "_"; break; case 10: cout << sex[resIndex] << " "; resFileName += sex[resIndex]; resFileName += "_"; break; case 11: cout << age[resIndex] << " "; resFileName += age[resIndex]; resFileName += "_"; break; case 12: cout << viewpoint[resIndex] << " "; resFileName += viewpoint[resIndex]; resFileName += "_"; break; case 13: cout << dasan[resIndex] << " "; resFileName += dasan[resIndex]; resFileName += "_"; break; case 14: cout << child[resIndex] << " "; resFileName += child[resIndex]; resFileName += "_"; break; case 15: cout << personstate[resIndex] << " "; resFileName += personstate[resIndex]; resFileName += "_"; break; default: break; } } cout << endl << endl; resFileName += ".jpg"; cv::imwrite(resFileName, resImg); #endif } else if (1 == snapshot_info->object_type_index || 2 == snapshot_info->object_type_index) { hcp_result *resHP = (hcp_result *)snapshot_info->analysisRes; #ifdef PRINTF_ATTRIRES cv::Mat resImg = cv::imread(snapshot_info->snapshot_image_path); stringstream ss; ss << obj_index++; string resFileName = "picHCP/" + ss.str() + "_"; if (resHP->feature != 0) { cout << "feature[0] :" << (int)resHP->feature[0] <feature[1] <feature[2] <feature[3] <feature[4] <res_objs.res_objs[i].res_index; //输出结果 switch (i) { case 0: cerr << "res_index0 = " << resIndex << endl; cout << hcp_head[resIndex] << " "; resFileName += hcp_head[resIndex]; resFileName += "_"; break; case 1: cerr << "res_index1 = " << resIndex << endl; cout << hcp_eye[resIndex] << " "; resFileName += hcp_eye[resIndex]; resFileName += "_"; break; case 2: cerr << "res_index2 = " << resIndex << endl; cout << hcp_mouth[resIndex] << " "; resFileName += hcp_mouth[resIndex]; resFileName += "_"; break; case 3: cerr << "res_index3 = " << resIndex << endl; cout << hcp_weibo[resIndex] << " "; resFileName += hcp_weibo[resIndex]; resFileName += "_"; break; case 4: cerr << "res_index4 = " << resIndex << endl; cout << hcp_up[resIndex] << " "; resFileName += hcp_up[resIndex]; resFileName += "_"; break; case 5: cerr << "res_index5 = " << resIndex << endl; cout << hcp_up_color[resIndex] << " "; resFileName += hcp_up_color[resIndex]; resFileName += "_"; break; case 6: cerr << "res_index6 = " << resIndex << endl; cout << hcp_clothing_text[resIndex] << " "; resFileName += hcp_clothing_text[resIndex]; resFileName += "_"; break; case 7: cerr << "res_index7 = " << resIndex << endl; cout << hcp_bao[resIndex] << " "; resFileName += hcp_bao[resIndex]; resFileName += "_"; break; case 8: cerr << "res_index8 = " << resIndex << endl; cout << hcp_sex[resIndex] << " "; resFileName += hcp_sex[resIndex]; resFileName += "_"; break; case 9: cerr << "res_index9 = " << resIndex << endl; cout << hcp_age[resIndex] << " "; resFileName += hcp_age[resIndex]; resFileName += "_"; break; case 10: cerr << "res_index10 = " << resIndex << endl; cout << hcp_carColor[resIndex] << " "; resFileName += hcp_carColor[resIndex]; resFileName += "_"; break; case 11: cerr << "res_index11 = " << resIndex << endl; cout << hcp_orient[resIndex] << " "; resFileName += hcp_orient[resIndex]; resFileName += "_"; break; case 12: cerr << "res_index12 = " << resIndex << endl; cout << hcp_dasan[resIndex] << " "; resFileName += hcp_dasan[resIndex]; resFileName += "_"; break; case 13: cerr << "res_index13 = " << resIndex << endl; cout << hcp_take[resIndex] << " "; resFileName += hcp_take[resIndex]; resFileName += "_"; break; default: break; } } cout << endl << endl; resFileName += ".jpg"; cv::imwrite(resFileName, resImg); #endif } else if (8 == snapshot_info->object_type_index || (snapshot_info->object_type_index >= 4 && snapshot_info->object_type_index <= 6)) { vehicle_result *resHP = (vehicle_result *)snapshot_info->analysisRes; #ifdef PRINTF_ATTRIRES if (resHP->feature != 0) { cout << "feature :" << (int)resHP->feature[0] <feature[1] <feature[2] <feature[3] <feature[4] <snapshot_image_path); stringstream ss; ss << obj_index++; string resFileName = "picV/" + ss.str() + "_"; //VC cout << "VC: " << resHP->vc_res.res_index << " " << colorLabel[resHP->vc_res.res_index] << " " << resHP->vc_res.res_prob << endl; stringstream sscolor; sscolor << resHP->vc_res.res_prob; resFileName = resFileName + colorLabel[resHP->vc_res.res_index] + "_" + sscolor.str(); //VP if (resHP->vp_res.rect.left_ != -1) { cout << "VP: " << resHP->vp_res.rect.left_ << " " << resHP->vp_res.rect.top_ << " " << resHP->vp_res.rect.width_ << " " << resHP->vp_res.rect.height_ << endl; for (int m = 0; m < 7; m++) { printf("%s", resHP->vp_res.recg[m].character); resFileName += resHP->vp_res.recg[m].character; } printf(" numScore = %.2f, detectScore = %.2f\n", resHP->vp_res.num_score, resHP->vp_res.detect_score); } //VR cout << "VP: " << endl; if (resHP->vr_res.vehicle_brand != NULL) { cout << " 车辆品牌 - " << resHP->vr_res.vehicle_brand << endl; resFileName += resHP->vr_res.vehicle_brand; } if (resHP->vr_res.vehicle_subbrand != NULL) { cout << " 车辆子品牌 - " << resHP->vr_res.vehicle_subbrand << endl; resFileName += resHP->vr_res.vehicle_subbrand; } if (resHP->vr_res.vehicle_issue_year != NULL) { cout << " 车辆年款 - " << resHP->vr_res.vehicle_issue_year << endl; resFileName += resHP->vr_res.vehicle_issue_year; } if (resHP->vr_res.vehicle_type != NULL) { cout << " 车辆类型 - " << resHP->vr_res.vehicle_type << endl; resFileName += resHP->vr_res.vehicle_type; } if (resHP->vr_res.freight_ton != NULL) { cout << " 货车吨级 - " << resHP->vr_res.freight_ton << endl; resFileName += resHP->vr_res.freight_ton; } cout << " " << resHP->vr_res.name_score << endl; cout << endl << endl; resFileName += ".jpg"; cv::imwrite(resFileName, resImg); #endif } } } void videoRTViewCallback(void * handle, unsigned char* imageData, int imageHeight, int imageWiddth) { //实时查看画面处理函数 //--------回调函数串行运行,请勿在此做例如显示等耗时的操作,以下操作仅供测试--------// cv::Mat resultImage(imageHeight, imageWiddth, CV_8UC3, imageData); cv::imwrite("view.jpg", resultImage); return; } #include #include int addTaskCount; std::chrono::time_point beginTime; void videoFinishCallback(void * handle, const int taskID) { cout << "==============================完成任务ID: " << taskID << " ============================" << endl; auto itor = cur_task_status_.find(taskID); if (itor != cur_task_status_.end()) { itor->second = TRUE; } static int finishTaskConut = 0; ++finishTaskConut; if(finishTaskConut >= addTaskCount) { SYSTEMTIME sys; GetLocalTime(&sys); printf("end %4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek); auto endTime = std::chrono::system_clock::now(); auto costTime = std::chrono::duration_cast(endTime - beginTime).count(); printf("all task finish ! cost time = %d ms\n", costTime); } } static int total_index = 0; int main(int argc, char* argv[]) { if (argc<4) { cout << "You must input videoFileName, iAddTaskCount and gpuid." << endl; return -1; } const char * videoFileName = argv[1]; printf("%s\n", videoFileName); addTaskCount = atoi(argv[2]); int gpuID = atoi(argv[3]); //操作句柄 void *handle; //初始化参数设置 mvpt_param vptParam; vptParam.hp_analysis_config = SY_CONFIG_OPEN; vptParam.hcp_analysis_config = SY_CONFIG_OPEN; vptParam.vehicle_analysis_config = SY_CONFIG_CLOSE; vptParam.hf_recg_config = SY_CONFIG_OPEN; vptParam.hcf_recg_config = SY_CONFIG_OPEN; vptParam.vcf_recg_config = SY_CONFIG_OPEN; vptParam.vrdbpath = argv[4]; //vptParam.vrdbpath = "../../db/mvpt.bin"; vptParam.auth_license = nullptr; //通用授权 vptParam.task_obj_info_callback_func = videoObjInfoCallback; vptParam.task_finish_callbackfunc = videoFinishCallback; vptParam.gpuid = gpuID; vptParam.serviceID = 0; vptParam.limitSize = (10 << 20); strcat(vptParam.name, "gbrealtime"); strcat(vptParam.path, "c:/videtek/log/"); int flag = mvpt_init(&handle, vptParam); if (0 != flag) { printf("Init Failed! Error Code: %d\n", flag); system("pause"); return 0; } beginTime = std::chrono::system_clock::now(); SYSTEMTIME sys; GetLocalTime(&sys); printf("begin %4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek); printf("begin add task\n"); for (int i = 0; i < addTaskCount; i++) { //指定检测目标视频抽帧图片(保存时显存占用很大) char resultFolder[260]; sprintf(resultFolder, "F:/test_1108/res/%d", total_index); //指定检测目标快照抠图保存路径 char resultFolderLittle[260]; sprintf(resultFolderLittle, "F:/test_1108/resLittle/%d", total_index++); task_param tparam; tparam.result_folder = resultFolder; tparam.result_folder_little = resultFolderLittle; tparam.video_filename = videoFileName; tparam.on_image_display = true; //tparam.video_filename = argv[total_index%4]; memcpy(tparam.minBoxsize, m_boxsize, sizeof(sy_rect)* DETECTTYPE); tparam.rt_view_callback_func = videoRTViewCallback; tparam.obj_snapshot_callback_func = videoObjSnapshotCallback; int newTaskID = add_task(handle, tparam); cout << "==============================开始任务ID: " << newTaskID << " ============================" << endl; cur_task_status_.insert(make_pair(newTaskID, FALSE)); #ifdef _MSC_VER Sleep(2000); #else usleep(40000); #endif } /* pause_task(handle, 0); Sleep(2000); pause_task(handle, 1); Sleep(2000); pause_task(handle, 2); Sleep(2000); restart_task(handle, 2); Sleep(2000); printf("-------------Begin restart_task 1 !----------------\n"); restart_task(handle, 1); Sleep(2000); restart_task(handle, 0); Sleep(2000); pause_task(handle, 1); Sleep(2000); printf("-------------Begin finish_task!----------------\n"); finish_task(handle, 2); Sleep(2000); printf("-------------Begin restart_task 1 !----------------\n"); restart_task(handle, 1); Sleep(2000); printf("-------------Begin pause_task 1 !----------------\n"); pause_task(handle, 1); Sleep(2000); printf("-------------Begin restart_task 1 !----------------\n"); restart_task(handle, 1); Sleep(2000); printf("-------------------Begin rt_view_task 1 !----------------------\n"); rt_view_task(handle, 1); Sleep(200000); finish_view_task(handle); while (1) { usleep(40000); } */ int task_index = addTaskCount - 1; while (0) { for (auto itor = cur_task_status_.begin(); itor != cur_task_status_.end();) { if (itor->second) { cout << "==============================停止任务ID: " << itor->first << " ============================" << endl; itor = cur_task_status_.erase(itor); //指定检测目标视频抽帧图片(保存时显存占用很大) char resultFolder[260]; sprintf(resultFolder, "F:/test_0723/res/%d", total_index); //指定检测目标快照抠图保存路径 char resultFolderLittle[260]; sprintf(resultFolderLittle, "F:/test_0723/resLittle/%d", total_index++); task_param tparam; tparam.result_folder = resultFolder; tparam.result_folder_little = resultFolderLittle; tparam.video_filename = videoFileName; memcpy(tparam.minBoxsize, m_boxsize, sizeof(sy_rect)* DETECTTYPE); tparam.rt_view_callback_func = videoRTViewCallback; tparam.obj_snapshot_callback_func = videoObjSnapshotCallback; int newTaskID = add_task(handle, tparam); cout << "==============================开始任务ID: " << newTaskID << " ============================" << endl; cur_task_status_.insert(make_pair(newTaskID, FALSE)); #ifdef _MSC_VER Sleep(2000); #else usleep(40000); #endif } else { itor++; } } #ifdef _MSC_VER Sleep(100); #else usleep(2000); #endif } while(1) { #ifdef _MSC_VER Sleep(100); #else usleep(2000); #endif } printf("begin mvpt_release\n"); mvpt_release(&handle); return 0; }