#ifdef _MSC_VER #include #endif #include #include #include #include "time.h" #include #include #include "header.h" #include "../VPT/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] = { "棕", "橙", "灰", "白", "粉", "紫", "红", "绿", "蓝", "金", "银", "青", "黄", "黑" }; #define PRINTF_ATTRIRES 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) { /*if (snapshot_info->object_id == 1) cout << "handle :" << handle << " snapshot " << snapshot_info->task_id << " " << snapshot_info->object_id << " " << 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;*/ //输出二次属性分析结果 if (snapshot_info->analysisRes != NULL) { /*cout << "snapshot_info->object_type_index :" << snapshot_info->object_type_index <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; printf("obj id: %d\n", snapshot_info->object_id); ss << snapshot_info->object_id; string resFileName = "picHP/" + ss.str() + "_"; if (resHP->feature != 0) { cout << "feature[0] :" << resHP->feature[0] << endl; cout << "feature[1] :" << resHP->feature[1] << endl; cout << "feature[2] :" << resHP->feature[2] << endl; cout << "feature[3] :" << resHP->feature[3] << endl; cout << "feature[4] :" << resHP->feature[4] << endl; } for (int i = 0; i < HP_FIR_INDEX_SIZE; i++) { int resIndex = resHP->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"; //if(snapshot_info->task_id == 0) // 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] :" << resHP->feature[0] << endl; cout << "feature[1] :" << resHP->feature[1] << endl; cout << "feature[2] :" << resHP->feature[2] << endl; cout << "feature[3] :" << resHP->feature[3] << endl; cout << "feature[4] :" << resHP->feature[4] << endl; } for (int i = 0; i < HCP_FIR_INDEX_SIZE; i++) { int resIndex = resHP->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"; //if(snapshot_info->task_id ==0) // 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 :" << resHP->feature[0] << endl; cout << "feature :" << resHP->feature[1] << endl; cout << "feature :" << resHP->feature[2] << endl; cout << "feature :" << resHP->feature[3] << endl; cout << "feature :" << resHP->feature[4] << endl; } cv::Mat resImg = cv::imread(snapshot_info->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"; //if(snapshot_info->task_id ==0) // cv::imwrite(resFileName, resImg); #endif } } } void videoRTViewCallback(void * handle, unsigned char* imageData, int imageHeight, int imageWiddth) { //实时查看画面处理函数 //--------回调函数串行运行,请勿在此做例如显示等耗时的操作,以下操作仅供测试--------// #ifdef _MSC_VER cv::Mat resultImage(imageHeight, imageWiddth, CV_8UC3, imageData); cv::imshow("view", resultImage); cv::waitKey(1); #endif return; } int curFinishTask = -1; void videoFinishCallback(void * handle, const int taskID) { curFinishTask++; cout << taskID << endl; if (taskID == 19) { return; } return; } static int total_index = 0; int main(int argc, char* argv[]) { //操作句柄 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_OPEN; vptParam.hf_recg_config = SY_CONFIG_OPEN; vptParam.hcf_recg_config = SY_CONFIG_OPEN; vptParam.vcf_recg_config = SY_CONFIG_OPEN; #ifdef _MSC_VER vptParam.vrdbpath = argv[3]; #else vptParam.vrdbpath = argv[3]; #endif vptParam.task_obj_info_callback_func = videoObjInfoCallback; vptParam.task_finish_callbackfunc = videoFinishCallback; vptParam.gpuid = atoi(argv[1]); int flag = mvpt_init(&handle, vptParam); if (0 != flag) { printf("Init Failed! Error Code: %d\n", flag); system("pause"); return 0; } time_t tt; time(&tt); tt = tt + 8 * 3600; // transform the time zone tm* t = gmtime(&tt); cout << tt << endl; printf("begin: %d-%02d-%02d %02d:%02d:%02d\n", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); string file[10] = { "/mnt/data/sy_vpt_test_data/people_1.avi", "/mnt/data/sy_vpt_test_data/test6.avi", "/mnt/data/sy_vpt_test_data/test4.avi", "/mnt/data/sy_vpt_test_data/test7.avi", "/mnt/data/sy_vpt_test_data/test9.mp4","/mnt/data/sy_vpt_test_data/people_1.avi", "/mnt/data/sy_vpt_test_data/test6.avi", "/mnt/data/sy_vpt_test_data/test4.avi", "/mnt/data/sy_vpt_test_data/test7.avi", "/mnt/data/sy_vpt_test_data/test9.mp4" }; for (int i = 0; i < 12; i++) { //指定检测目标视频抽帧图片(保存时显存占用很大) char resultFolder[260]; sprintf(resultFolder, "res/%d", total_index); //指定检测目标快照抠图保存路径 char resultFolderLittle[260]; sprintf(resultFolderLittle, "resLittle1121/%d", total_index++); //设置最小检测框,直接指定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) }; //行人 自行车 摩托车 三轮车 小型车 大车 卡车 拖拉机 中巴 task_param tparam; tparam.result_folder = NULL;//resultFolder; tparam.result_folder_little = resultFolderLittle; tparam.video_filename = argv[2];// "/mnt/data/mliu/TestData/vpt1.avi";// file[i].c_str();// argv[2]; 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); //rt_view_task(handle, newTaskID); #ifdef _MSC_VER Sleep(4000); #else usleep(40000); #endif } while (1) { if (curFinishTask >= 0) { //指定检测目标视频抽帧图片(保存时显存占用很大) char resultFolder[260]; sprintf(resultFolder, "res/%d", total_index); //指定检测目标快照抠图保存路径 char resultFolderLittle[260]; sprintf(resultFolderLittle, "resLittle1121/%d", total_index++); //设置最小检测框,直接指定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) }; //行人 自行车 摩托车 三轮车 小型车 大车 卡车 拖拉机 中巴 task_param tparam; tparam.result_folder = NULL;//resultFolder; tparam.result_folder_little = resultFolderLittle; tparam.video_filename = argv[2];//"/mnt/data/mliu/TestData/vpt1.avi";//"D:/TestData/人车物/测试视频7.mp4"; ;// argv[1]; 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); Sleep(2000); curFinishTask--; } Sleep(2000); } while (1) { #ifdef _MSC_VER Sleep(2000); #else usleep(40000); #endif } mvpt_release(&handle); return 0; }