Commit cefa38a2f691ec3884a5c11ce95faa67578b7b34
1 parent
922efde7
重新编译子库;
删除无用代码
Showing
24 changed files
with
98 additions
and
6042 deletions
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/ImageSaveCache.cpp
@@ -165,7 +165,7 @@ void ImageSaveCache::insert(const OBJ_KEY &snaphot_id, const FRAME_KEY & frame_i | @@ -165,7 +165,7 @@ void ImageSaveCache::insert(const OBJ_KEY &snaphot_id, const FRAME_KEY & frame_i | ||
165 | fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); | 165 | fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); |
166 | } | 166 | } |
167 | 167 | ||
168 | - dx_frame.height = frame.height; //�����ͼû���棬����Ҳû�д�ͼ�����ܱ��������ã���ô���½�һ����ͼ���ݣ������ͼvector | 168 | + dx_frame.height = frame.height; |
169 | dx_frame.width = frame.width; | 169 | dx_frame.width = frame.width; |
170 | dx_frame.size = frame.size; | 170 | dx_frame.size = frame.size; |
171 | 171 |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/Makefile deleted
1 | - | ||
2 | -CC = gcc | ||
3 | -XX = g++ | ||
4 | -AR = ar | ||
5 | -NVCC=nvcc | ||
6 | - | ||
7 | -PROJ_HOME = /mnt/data/cmhu/Project_VideoStructure | ||
8 | - | ||
9 | -TARGET = $(DES_BIN)/libVPT.so | ||
10 | - | ||
11 | -NVDECODE_ROOT=../DxDecoder | ||
12 | -DEPEND_DIR = $(STATIC_RELEASE_ROOT) | ||
13 | -#UTOOLS_ROOT = /home/xzhao_aic/MCaffe2/linux/utools | ||
14 | -UTOOLS_ROOT=/home/xzhao_aic/lib_video_structure_190123.old/utools/ | ||
15 | -UTOOLS_SRC = $(UTOOLS_SSD_ROOT) | ||
16 | - | ||
17 | -SDK_ROOT = $(PROJ_HOME)/Linux_3rdparty/video_structure_sdk_20220512 | ||
18 | - | ||
19 | -INCLUDE =-I $(OPENCV_ROOT)/include \ | ||
20 | - -I $(OPENCV_ROOT)/include/opencv \ | ||
21 | - -I $(OPENCV_ROOT)/include/opencv2 \ | ||
22 | - -I /home/xzhao_aic/local/include \ | ||
23 | - -I $(BOOST_ROOT)/include \ | ||
24 | - -I /usr/local/cuda/include \ | ||
25 | - -I $(UTOOLS_SRC) \ | ||
26 | - -I $(NVDECODE_ROOT) \ | ||
27 | - -I $(NVDECODE_ROOT)/common/inc \ | ||
28 | - -I /usr/include/cairo \ | ||
29 | - -I $(SDK_ROOT) \ | ||
30 | - | ||
31 | -#-I $(VPT_ROOT)/vpt \ | ||
32 | - | ||
33 | -# -I ./MD5 \ | ||
34 | - | ||
35 | -#CFLAGS =-g -Wall -O3 $(INCLUDE) # -std=c++11 | ||
36 | -CFLAGS = $(CFLAGS_LIB) $(INCLUDE) -std=c++11 | ||
37 | -NFLAGS = $(NFLAGS_LIB) $(INCLUDE) -std=c++11 | ||
38 | - | ||
39 | - | ||
40 | -LIBSPATH=-L$(UTOOLS_ROOT) -lutools \ | ||
41 | - -L$(NVDECODE_ROOT) -lDxDecoder \ | ||
42 | - -L$(HP_ROOT) -lhp \ | ||
43 | - -L$(HCP_ROOT) -lhcp \ | ||
44 | - -L$(VC_ROOT) -lvcolor \ | ||
45 | - -L$(VR_ROOT) -lvr \ | ||
46 | - -L$(VP_ROOT) -lvp \ | ||
47 | - -L/usr/local/cuda/lib64 -lcuda -lcudart -lnvcuvid -lnppi -lnppc -lcurand -lcublas -lcusolver \ | ||
48 | - -L/usr/local/lib -ldl -ldl -lm \ | ||
49 | - -l:libjasper.so.1 -l:libIlmImf.so.7 \ | ||
50 | - -L$(DES_BIN) \ | ||
51 | - | ||
52 | -LIBS= -ldl -lpthread -lcairo | ||
53 | - | ||
54 | -#SRCS:=$(wildcard *.cpp) | ||
55 | -#OBJS:=$(patsubst %cpp, %o, $(SRCS)) | ||
56 | - | ||
57 | -SRCS:=$(wildcard *.cpp) $(wildcard $(VPT_ROOT)/sort/*.cpp) $(wildcard $(VPT_ROOT)/MD5/mID.cpp) | ||
58 | -DIRS:=$(notdir $(SRCS)) | ||
59 | -OBJS:=$(patsubst %cpp, %o, $(DIRS)) | ||
60 | - | ||
61 | -CU_SOURCES = $(shell ls *.cu) | ||
62 | -CU_OBJS=$(CU_SOURCES:.cu=.o) | ||
63 | - | ||
64 | -STATICLIBS:=$(wildcard $(UTOOLS_ROOT)/*.a) | ||
65 | - | ||
66 | -all:$(TARGET) | ||
67 | - | ||
68 | -$(TARGET):$(addprefix $(BUILD_DIR)/, $(OBJS)) $(addprefix $(BUILD_DIR)/, $(CU_OBJS)) | ||
69 | - $(XX) $(CFLAGS) -shared -o $@ $^ $(LIBSPATH) $(LIBS) | ||
70 | - chmod 777 $(TARGET) | ||
71 | - $(STRIP) $(TARGET) | ||
72 | - | ||
73 | -$(BUILD_DIR)/%.o:%.cpp | $(BUILD_DIR) | ||
74 | - @echo "##############################$@##############################" | ||
75 | - $(XX) $(CFLAGS) -c $< -o $@ | ||
76 | -$(BUILD_DIR)/%.o:$(VPT_ROOT)/sort/%.cpp | $(BUILD_DIR) | ||
77 | - @echo "##############################$@###############################" | ||
78 | - $(XX) $(CFLAGS) -c $< -o $@ | ||
79 | -$(BUILD_DIR)/%.o:$(VPT_ROOT)/MD5/%.cpp | $(BUILD_DIR) | ||
80 | - @echo "##############################$@###############################" | ||
81 | - $(XX) $(CFLAGS) -c $< -o $@ | ||
82 | -$(BUILD_DIR)/%.o:%.cu | $(BUILD_DIR) | ||
83 | - @echo "#######################CU_OBJS:$@###############" | ||
84 | - $(NVCC) $(NFLAGS) -o $@ $< | ||
85 | - | ||
86 | -$(BUILD_DIR): | ||
87 | - mkdir $@ | ||
88 | - | ||
89 | -.PHONY:clean | ||
90 | -clean: | ||
91 | - $(RM) $(BUILD_DIR)/* | ||
92 | - $(RM) $(TARGET) | ||
93 | - |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/Makefile-bin deleted
1 | - | ||
2 | -CC = gcc | ||
3 | -XX = g++ | ||
4 | -AR = ar | ||
5 | -NVCC=nvcc | ||
6 | - | ||
7 | -TARGET = vpt_test | ||
8 | - | ||
9 | -NVDECODE_ROOT=../NvDecode | ||
10 | -UTOOLS_ROOT = $(UTOOLS_SSD_ROOT)/utools | ||
11 | -UTOOLS_SRC = $(UTOOLS_SSD_ROOT)/../src | ||
12 | -VPT_ROOT = . | ||
13 | -INCLUDE =-I $(OPENCV_ROOT)/include \ | ||
14 | - -I $(OPENCV_ROOT)/include/opencv \ | ||
15 | - -I $(OPENCV_ROOT)/include/opencv2 \ | ||
16 | - -I $(BOOST_ROOT)/include \ | ||
17 | - -I /usr/local/cuda/include \ | ||
18 | - -I $(UTOOLS_SRC) \ | ||
19 | - -I $(NVDECODE_ROOT) \ | ||
20 | - -I $(NVDECODE_ROOT)/common/inc \ | ||
21 | - -I $(VPT_ROOT)/sort \ | ||
22 | - | ||
23 | -#-I $(VPT_ROOT)/vpt \ | ||
24 | - | ||
25 | -# -I ./MD5 \ | ||
26 | - | ||
27 | -#CFLAGS =-g -Wall -O3 $(INCLUDE) # -std=c++11 | ||
28 | -CFLAGS = $(CFLAGS_APP) $(INCLUDE) -std=c++11 | ||
29 | - | ||
30 | -LIBSPATH=-L$(UTOOLS_ROOT) -lustools \ | ||
31 | - -L$(NVDECODE_ROOT) -lNvDecode \ | ||
32 | - -L/usr/local/cuda/lib64 -lcuda -lcudart -lnvcuvid -lnppi -lnppc -lcurand -lcublas -lcusolver \ | ||
33 | - -L/usr/local/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice -lyasm -ldl -ldl -lm \ | ||
34 | - | ||
35 | -LIBS= -ldl -lpthread | ||
36 | - | ||
37 | -#SRCS:=$(wildcard *.cpp) | ||
38 | -#OBJS:=$(patsubst %cpp, %o, $(SRCS)) | ||
39 | - | ||
40 | -SRCS:=$(wildcard *.cpp) $(wildcard $(VPT_ROOT)/sort/*.cpp) $(wildcard $(VPT_ROOT)/MD5/mID.cpp) | ||
41 | -DIRS:=$(notdir $(SRCS)) | ||
42 | -OBJS:=$(patsubst %cpp, %o, $(DIRS)) | ||
43 | - | ||
44 | - | ||
45 | -all:$(TARGET) | ||
46 | - | ||
47 | -$(TARGET):$(OBJS) | ||
48 | - $(XX) $(CFLAGS) -Wl,-rpath=./ -o $@ $^ $(LIBSPATH) $(LIBS) | ||
49 | - rm -f *.o | ||
50 | - cp $(TARGET) $(DES_BIN) | ||
51 | -%.o:%.cpp | ||
52 | - @echo "##############################$@##############################" | ||
53 | - $(XX) $(CFLAGS) -c $< | ||
54 | -%.o:$(VPT_ROOT)/sort/%.cpp | ||
55 | - @echo "##############################$@###############################" | ||
56 | - $(XX) $(CFLAGS) -c $< | ||
57 | -%.o:$(VPT_ROOT)/MD5/%.cpp | ||
58 | - @echo "##############################$@###############################" | ||
59 | - $(XX) $(CFLAGS) -c $< | ||
60 | - | ||
61 | - | ||
62 | -.PHONY:clean | ||
63 | -clean: | ||
64 | - $(RM) $(OBJS) | ||
65 | - $(RM) $(TARGET) | ||
66 | - $(RM) $(DES_BIN)/$(TARGET) | ||
67 | - $(RM) *~ | ||
68 | - |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/Makefile-lib deleted
1 | - | ||
2 | -CC = gcc | ||
3 | -XX = g++ | ||
4 | -AR = ar | ||
5 | -NVCC=nvcc | ||
6 | - | ||
7 | -TARGET = libVPT.a | ||
8 | - | ||
9 | -NVDECODE_ROOT=../NvDecode | ||
10 | -DEPEND_DIR = $(STATIC_RELEASE_ROOT) | ||
11 | -UTOOLS_ROOT = $(UTOOLS_SSD_ROOT)/utools | ||
12 | -UTOOLS_SRC = $(UTOOLS_SSD_ROOT)/../src | ||
13 | -VPT_ROOT = . | ||
14 | -INCLUDE =-I $(OPENCV_ROOT)/include \ | ||
15 | - -I $(OPENCV_ROOT)/include/opencv \ | ||
16 | - -I $(OPENCV_ROOT)/include/opencv2 \ | ||
17 | - -I $(BOOST_ROOT)/include \ | ||
18 | - -I /usr/local/cuda/include \ | ||
19 | - -I $(UTOOLS_SRC) \ | ||
20 | - -I $(NVDECODE_ROOT) \ | ||
21 | - -I $(NVDECODE_ROOT)/common/inc \ | ||
22 | - -I $(VPT_ROOT)/sort \ | ||
23 | - | ||
24 | -#-I $(VPT_ROOT)/vpt \ | ||
25 | - | ||
26 | -# -I ./MD5 \ | ||
27 | - | ||
28 | -#CFLAGS =-g -Wall -O3 $(INCLUDE) # -std=c++11 | ||
29 | -CFLAGS = $(CFLAGS_LIB) $(INCLUDE) -std=c++11 | ||
30 | -NFLAGS = $(NFLAGS_LIB) $(INCLUDE) -std=c++11 | ||
31 | - | ||
32 | - | ||
33 | -LIBSPATH=-L $(UTOOLS_ROOT) \ | ||
34 | - -L/usr/local/cuda/lib64 -lcudart -lcublas -lcusolver -lcurand | ||
35 | - | ||
36 | -LIBS=-lustools -ldl -lpthread | ||
37 | - | ||
38 | -#SRCS:=$(wildcard *.cpp) | ||
39 | -#OBJS:=$(patsubst %cpp, %o, $(SRCS)) | ||
40 | - | ||
41 | -SRCS:=$(wildcard *.cpp) $(wildcard $(VPT_ROOT)/sort/*.cpp) $(wildcard $(VPT_ROOT)/MD5/mID.cpp) | ||
42 | -DIRS:=$(notdir $(SRCS)) | ||
43 | -OBJS:=$(patsubst %cpp, %o, $(DIRS)) | ||
44 | - | ||
45 | -CU_SOURCES = $(shell ls *.cu) | ||
46 | -CU_OBJS=$(CU_SOURCES:.cu=.o) | ||
47 | - | ||
48 | -STATICLIBS:=$(wildcard $(UTOOLS_ROOT)/*.a) | ||
49 | - | ||
50 | -all:$(TARGET) | ||
51 | - | ||
52 | -$(TARGET):$(OBJS) $(CU_OBJS) | ||
53 | - rm -f $(TARGET) | ||
54 | - $(AR) crs $@ $(OBJS) $(CU_OBJS) | ||
55 | - ranlib $(TARGET) | ||
56 | - rm -f *.o | ||
57 | - echo create $(TARGET) > script.mri; | ||
58 | - echo addlib $(TARGET) >> script.mri; | ||
59 | - @for alib in `echo $(STATICLIBS) | cut -d' ' -f 1-`; \ | ||
60 | - do \ | ||
61 | - echo addlib $$alib >> script.mri; \ | ||
62 | - done | ||
63 | - echo save >> script.mri; | ||
64 | - echo end >> script.mri; | ||
65 | - ar -M < script.mri | ||
66 | -# $(foreach alib, $(STATICLIBS), $(AR) x $(alib)) | ||
67 | -# ar cru $(TARGET) *.o | ||
68 | - ranlib $(TARGET) | ||
69 | - rm -f *.o | ||
70 | - cp $(TARGET) $(DES_LIB) | ||
71 | - chmod 777 $(DES_LIB)/$(TARGET) | ||
72 | -%.o:%.cpp | ||
73 | - @echo "##############################$@##############################" | ||
74 | - $(XX) $(CFLAGS) -c $< | ||
75 | -%.o:$(VPT_ROOT)/sort/%.cpp | ||
76 | - @echo "##############################$@###############################" | ||
77 | - $(XX) $(CFLAGS) -c $< | ||
78 | -%.o:$(VPT_ROOT)/MD5/%.cpp | ||
79 | - @echo "##############################$@###############################" | ||
80 | - $(XX) $(CFLAGS) -c $< | ||
81 | -$(CU_OBJS):%.o:%.cu | ||
82 | - @echo "#######################CU_OBJS###############" | ||
83 | - @echo $@ | ||
84 | - $(NVCC) $(NFLAGS) -o $@ $< | ||
85 | - | ||
86 | - | ||
87 | -.PHONY:clean | ||
88 | -clean: | ||
89 | - $(RM) $(OBJS) | ||
90 | - $(RM) $(TARGET) | ||
91 | - $(RM) $(DES_LIB)/$(TARGET) | ||
92 | - $(RM) *~ | ||
93 | - |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp.qx deleted
1 | -#include "MutliSourceVideoProcess.h" | ||
2 | - | ||
3 | -#ifdef _MSC_VER | ||
4 | -#include <io.h> | ||
5 | -#include <direct.h> | ||
6 | -#include "../putText.h" | ||
7 | -#endif | ||
8 | -#include <fstream> | ||
9 | -#include <algorithm> | ||
10 | -#include <thread> | ||
11 | -#include <future> | ||
12 | - | ||
13 | -#include "face_detect.h" | ||
14 | -#include "CropImg.h" | ||
15 | -//#include <strsafe.h> | ||
16 | -//#include <shlwapi.h> | ||
17 | -//#include <DbgHelp.h> | ||
18 | -//#pragma comment(lib, "DbgHelp.Lib") | ||
19 | -//#pragma comment(lib, "ShLwApi.lib") | ||
20 | -//********************************************************// | ||
21 | -//1.Ϊʲô��ʱ�ص�index=2��ȴδ�����ﳵ�ķ�������Ϊindex�ں�����Ϊ��2�����Ǵ�ʱ�Ŀ��ղ�������֮ǰ�Ŀ��գ����Կ���δ���£�����ͼ���С����Ϊ112*224 | ||
22 | - | ||
23 | -#define AUTHORIZATION | ||
24 | -//#define DQ_AUTHORIZATION | ||
25 | - | ||
26 | -#include<boost/thread.hpp> | ||
27 | - | ||
28 | -#ifdef DQ_AUTHORIZATION | ||
29 | -#include "license_validator.h" | ||
30 | -#ifdef _MSC_VER | ||
31 | -#define productSN "2AC69C4638EF46c884BD2BF132FF41D9" //��ǧ����-������ȨID | ||
32 | -#else | ||
33 | -#define productSN "683E9D5E56474da5A4C2D3EA9A00568E" //��ǧ����-������ȨID | ||
34 | -#endif | ||
35 | -#endif | ||
36 | - | ||
37 | -#ifdef AUTHORIZATION | ||
38 | -#include "authority.h" | ||
39 | -#ifdef _MSC_VER | ||
40 | -#define productSN "4ACFCBE67EF645AB8F0B4CFCDD1926F1" //WINDOWS�����Ʒϵ�к� | ||
41 | -#else | ||
42 | -#define productSN "4FD45501D5104F0C8C4BE530FC872F46" //LINUX�����Ʒϵ�к� | ||
43 | -//#define productSN "7CF8B4797F9E441686145BED07F662DE" //LINUX�����Ʒϵ�к� | ||
44 | -#endif | ||
45 | -#endif | ||
46 | - | ||
47 | -#include "../DxDecoder/ColorSpace.h" | ||
48 | - | ||
49 | -//#define LOG_INFO //�Ƿ������ٴ�ӡ | ||
50 | -// #define SKIP_FRMAE 5 //��֡֡�� | ||
51 | -#define EXTIME 500 | ||
52 | - | ||
53 | -static int TaskID = 0; | ||
54 | - | ||
55 | -auto show_gpu_syimage_ = [](sy_img& cur_frame) { | ||
56 | - | ||
57 | - unsigned char* cpu_data = new unsigned char[3 * cur_frame.w_ * cur_frame.h_]; | ||
58 | - cudaMemcpy(cpu_data, cur_frame.data_, 3 * cur_frame.w_ * cur_frame.h_ * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
59 | - cv::Mat img(cur_frame.h_, cur_frame.w_, CV_8UC3, cpu_data); | ||
60 | - | ||
61 | - cv::imshow("img", img); | ||
62 | - cv::waitKey(0); | ||
63 | - delete[] cpu_data; | ||
64 | -}; | ||
65 | - | ||
66 | -auto show_gpu_image_ = [](DxGPUFrame& cur_frame) { | ||
67 | - | ||
68 | - unsigned char* cpu_data = new unsigned char[3 * cur_frame.width * cur_frame.height]; | ||
69 | - cudaMemcpy(cpu_data, cur_frame.frame, 3 * cur_frame.width * cur_frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
70 | - cv::Mat img(cur_frame.height, cur_frame.width, CV_8UC3, cpu_data); | ||
71 | - | ||
72 | - cv::imshow("img2", img); | ||
73 | - cv::waitKey(0); | ||
74 | - delete[] cpu_data; | ||
75 | -}; | ||
76 | - | ||
77 | -auto show_gpu_image_withrect_ = [](DxGPUFrame& cur_frame, sy_rect &rect) { | ||
78 | - | ||
79 | - unsigned char* cpu_data = new unsigned char[3 * cur_frame.width * cur_frame.height]; | ||
80 | - cudaMemcpy(cpu_data, cur_frame.frame, 3 * cur_frame.width * cur_frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
81 | - cv::Mat img(cur_frame.height, cur_frame.width, CV_8UC3, cpu_data); | ||
82 | - cv::rectangle(img, cv::Rect(rect.left_, rect.top_, rect.width_, rect.height_), cv::Scalar(25, 25, 250), 2, 8, 0); | ||
83 | - cv::imshow("ori", img); | ||
84 | - cv::waitKey(0); | ||
85 | - delete[] cpu_data; | ||
86 | -}; | ||
87 | - | ||
88 | -auto show_gpu_image_withfdinfo_ = [](DxGPUFrame& cur_frame, fd_info &face_info) { | ||
89 | - | ||
90 | - unsigned char* cpu_data = new unsigned char[3 * cur_frame.width * cur_frame.height]; | ||
91 | - cudaMemcpy(cpu_data, cur_frame.frame, 3 * cur_frame.width * cur_frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
92 | - cv::Mat img(cur_frame.height, cur_frame.width, CV_8UC3, cpu_data); | ||
93 | - | ||
94 | - printf("%d %d\n", cur_frame.width , cur_frame.height); | ||
95 | - for (int ii = 0; ii < 25; ii++) | ||
96 | - { | ||
97 | - printf("(%d %d) ", face_info.facial_fea_point[ii].x_, face_info.facial_fea_point[ii].y_); | ||
98 | - cv::circle(img, cv::Point(face_info.facial_fea_point[ii].x_, face_info.facial_fea_point[ii].y_), 1, cv::Scalar(0, 255, 0)); | ||
99 | - | ||
100 | - } | ||
101 | - //cv::rectangle(img, cv::Rect(face_info.face_position.left_, face_info.face_position.top_, face_info.face_position.width_, face_info.face_position.height_), cv::Scalar(25, 25, 250), 2, 8, 0); | ||
102 | - | ||
103 | - cv::Mat big_img; | ||
104 | - cv::resize(img, big_img, cv::Size(400, 400)); | ||
105 | - | ||
106 | - | ||
107 | - cv::imshow("ori33", img); | ||
108 | - cv::imshow("ori44", big_img); | ||
109 | - cv::waitKey(0); | ||
110 | - delete[] cpu_data; | ||
111 | -}; | ||
112 | - | ||
113 | -auto show_gpu_image_with2rect_ = [](DxGPUFrame& cur_frame, sy_rect &rect, sy_rect &rect2) { | ||
114 | - | ||
115 | - unsigned char* cpu_data = new unsigned char[3 * cur_frame.width * cur_frame.height]; | ||
116 | - cudaMemcpy(cpu_data, cur_frame.frame, 3 * cur_frame.width * cur_frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
117 | - cv::Mat img(cur_frame.height, cur_frame.width, CV_8UC3, cpu_data); | ||
118 | - cv::rectangle(img, cv::Rect(rect.left_, rect.top_, rect.width_, rect.height_), cv::Scalar(25, 25, 250), 1, 8, 0); | ||
119 | - cv::rectangle(img, cv::Rect(rect2.left_, rect2.top_, rect2.width_, rect2.height_), cv::Scalar(25, 250, 25), 1, 8, 0); | ||
120 | - cv::imshow("ori2", img); | ||
121 | - cv::waitKey(0); | ||
122 | - delete[] cpu_data; | ||
123 | -}; | ||
124 | - | ||
125 | -static long long get_cur_time_ms(){ | ||
126 | - chrono::time_point<chrono::system_clock, chrono::milliseconds> tpMicro | ||
127 | - = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now()); | ||
128 | - | ||
129 | - return tpMicro.time_since_epoch().count(); | ||
130 | -} | ||
131 | - | ||
132 | -std::function<void(DxGPUFrame&)> show_gpu_img_func = show_gpu_image_; | ||
133 | - | ||
134 | -void check_thread(void* handle); | ||
135 | -DWORD ThreadProcess(LPVOID param); | ||
136 | - | ||
137 | - | ||
138 | -//std::ofstream g_os("./cudaMem.txt", std::ofstream::out | std::ofstream::trunc); | ||
139 | -CMutliSourceVideoProcess::CMutliSourceVideoProcess() | ||
140 | -{ | ||
141 | -} | ||
142 | - | ||
143 | -// dump�ļ� | ||
144 | -//static LONG WINAPI CustomExceptionCrashHandler(_In_ EXCEPTION_POINTERS *CONST pException) | ||
145 | -//{ | ||
146 | -// char dumpPath[MAX_PATH]; | ||
147 | -// | ||
148 | -// BOOL tempDump = FALSE; | ||
149 | -// do { | ||
150 | -// | ||
151 | -// if (0 == GetTempPath(_countof(dumpPath), dumpPath)) | ||
152 | -// break; | ||
153 | -// | ||
154 | -// // %temp%Ŀ¼���½�dump�ļ��� | ||
155 | -// if (!PathAppend(dumpPath, "dump")) | ||
156 | -// break; | ||
157 | -// CreateDirectory(dumpPath, NULL); | ||
158 | -// // dump�ļ�����dump�ļ��ļ��� ���Զ����� | ||
159 | -// if (!PathAppend(dumpPath, "HSTProcessor")) | ||
160 | -// break; | ||
161 | -// | ||
162 | -// SYSTEMTIME lclTm; | ||
163 | -// GetLocalTime(&lclTm); | ||
164 | -// char ext[29]; | ||
165 | -// // dump�ļ�������ʱ���� | ||
166 | -// if (FAILED(StringCchPrintf(ext, _countof(ext), ".%04hu%02hu%02hu%02hu%02hu%02hu.unhdlexc.dmp", lclTm.wYear, lclTm.wMonth, lclTm.wDay, lclTm.wHour, lclTm.wMinute, lclTm.wSecond))) | ||
167 | -// break; | ||
168 | -// if (FAILED(StringCchCat(dumpPath, _countof(dumpPath), ext))) | ||
169 | -// break; | ||
170 | -// | ||
171 | -// tempDump = TRUE; | ||
172 | -// } while (FALSE); | ||
173 | -// HANDLE CONST dumpFile = CreateFile(dumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||
174 | -// if (INVALID_HANDLE_VALUE == dumpPath) | ||
175 | -// { | ||
176 | -// return EXCEPTION_EXECUTE_HANDLER; | ||
177 | -// } | ||
178 | -// | ||
179 | -// MINIDUMP_EXCEPTION_INFORMATION dumpInfo; | ||
180 | -// dumpInfo.ThreadId = GetCurrentThreadId(); | ||
181 | -// dumpInfo.ExceptionPointers = pException; | ||
182 | -// dumpInfo.ClientPointers = TRUE; | ||
183 | -// | ||
184 | -// if (FAILED(MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), dumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL))) | ||
185 | -// { | ||
186 | -// CloseHandle(dumpFile); | ||
187 | -// } | ||
188 | -// CloseHandle(dumpFile); | ||
189 | -// | ||
190 | -// return EXCEPTION_EXECUTE_HANDLER; | ||
191 | -//} | ||
192 | - | ||
193 | - | ||
194 | -CMutliSourceVideoProcess::~CMutliSourceVideoProcess() | ||
195 | -{ | ||
196 | - //��־����ʼ�� | ||
197 | - //DxUninitializeLog(); | ||
198 | -} | ||
199 | - | ||
200 | -int CMutliSourceVideoProcess::FinishProcessThread() | ||
201 | -{ | ||
202 | - if (thrd_status == 0) | ||
203 | - { | ||
204 | - thrd.interrupt(); | ||
205 | - thrd.join(); | ||
206 | - thrd_status = -1; | ||
207 | - } | ||
208 | - | ||
209 | - ProcessThread.interrupt(); //interrupt thread | ||
210 | - ProcessThread.join(); //waiting thread finish | ||
211 | - | ||
212 | - VPT_Release(VPT_Handle); | ||
213 | - m_face_det_module->face_det_module_release(); | ||
214 | - | ||
215 | - m_snaphot_helper.snapshot_helper_release(); | ||
216 | - | ||
217 | - return 1; | ||
218 | -} | ||
219 | - | ||
220 | -int CMutliSourceVideoProcess::InitAlgorthim(mvpt_param vptParam, VIDEO_OBJECT_INFO_CALLBACK tObjInfoCallbackFunc, VIDEO_FINISH_CALLBACK tFinishCallbackFunc) | ||
221 | -{ | ||
222 | - // checkGpuMem(); | ||
223 | - licence_status = -1; | ||
224 | - thrd_status = -1; | ||
225 | - //SetUnhandledExceptionFilter(CustomExceptionCrashHandler); | ||
226 | - | ||
227 | - int ret = SUCCESS; | ||
228 | - /*DxLogConfig sCfg = { 0 }; | ||
229 | - sCfg.serviceID = vptParam.serviceID; | ||
230 | - sCfg.limitSize = vptParam.limitSize; | ||
231 | - strcpy(sCfg.name, vptParam.name); | ||
232 | - strcpy(sCfg.path, vptParam.path); | ||
233 | - DxInitializeLog(&sCfg);*/ | ||
234 | - | ||
235 | - /*printf("=====================��ȨERROR==================\n"); | ||
236 | - printf("=====================��ȨERROR==================\n"); | ||
237 | - printf("=====================��ȨERROR==================\n");*/ | ||
238 | -#ifdef AUTHORIZATION | ||
239 | -#ifdef _WIN32 | ||
240 | - if (SUCCESS == (ret = sy_licence(productSN))) | ||
241 | -#elif __linux__ | ||
242 | - char wtime[15]; | ||
243 | - memset(wtime, 0, 15); | ||
244 | - char * time = wtime; | ||
245 | - if (SUCCESS == (ret = sy_licence(productSN, &time))) | ||
246 | -#endif | ||
247 | -#else | ||
248 | - ret = license_check(vptParam.auth_license, productSN);// sy_time_check(2022, 2); | ||
249 | - if (ret == SUCCESS) | ||
250 | -#endif | ||
251 | - { | ||
252 | - cuInit(0); | ||
253 | - int device_count = 0; | ||
254 | - cuDeviceGetCount(&device_count); | ||
255 | - | ||
256 | - if (vptParam.gpuid >= device_count) | ||
257 | - { | ||
258 | - printf("\nGPU_ID PARAM WRONG, gpuid: %d device_count: %d\n", vptParam.gpuid, device_count); | ||
259 | - return GPUID_PARAM_ERROR; | ||
260 | - } | ||
261 | - | ||
262 | - CUdevice dev = 0; | ||
263 | - size_t memSize = 0; | ||
264 | - dev = vptParam.gpuid; | ||
265 | - | ||
266 | - CUresult rlt = CUDA_SUCCESS; | ||
267 | - rlt = cuDeviceTotalMem(&memSize, dev); | ||
268 | - | ||
269 | - gpu_total_memory = (float)memSize / (1024 * 1024); | ||
270 | - | ||
271 | - if (gpu_total_memory < 9000) //8G�Դ棬С�ڴ淽�� | ||
272 | - section_batch_size = 10; | ||
273 | - else | ||
274 | - section_batch_size = 20; | ||
275 | - | ||
276 | - if(vptParam.skip_frame > 0){ | ||
277 | - // 默认值为5 | ||
278 | - skip_frame_ = vptParam.skip_frame; | ||
279 | - } | ||
280 | - | ||
281 | - VPTProcess_PARAM param{}; | ||
282 | - //param.c = 3; | ||
283 | - param.mode = DEVICE_GPU; | ||
284 | - param.gpuid = vptParam.gpuid; | ||
285 | - //param.threshold = 0.6; | ||
286 | - param.threshold = 0.5; | ||
287 | - param.engine = ENGINE_TENSORRT; | ||
288 | - param.max_batch = section_batch_size; | ||
289 | - param.serialize_file = "./serialize_file/VPT"; | ||
290 | - param.auth_license = vptParam.auth_license; | ||
291 | - mgpuid = vptParam.gpuid; | ||
292 | - VPT_Handle = NULL; | ||
293 | - ret = VPT_Init(VPT_Handle, param); | ||
294 | - if (0 != ret) | ||
295 | - return ret; | ||
296 | - | ||
297 | - m_face_det_module = nullptr; | ||
298 | - if (vptParam.face_det_config == SY_CONFIG_OPEN) | ||
299 | - { | ||
300 | - m_face_det_module = new face_det_module(); | ||
301 | - printf("begin init face det\n"); | ||
302 | - m_face_det_module->face_det_module_init(vptParam.gpuid, vptParam.auth_license); | ||
303 | - } | ||
304 | - | ||
305 | - viewTaskID = -1; | ||
306 | - TaskinPlay = 0; | ||
307 | - TotalTask = 0; | ||
308 | - capacity = 20; | ||
309 | - VPTResult.resize(capacity); | ||
310 | - //dwThreadID = 0; | ||
311 | - ProcessFlag = false; | ||
312 | - SourceFlag = false; | ||
313 | - | ||
314 | - mModeSnapshotVideo = "cpu"; | ||
315 | - mModeSnapshotLittle = "cpu"; | ||
316 | - | ||
317 | - taskFinishCallbackFunc = nullptr; | ||
318 | - if (tFinishCallbackFunc != nullptr) | ||
319 | - taskFinishCallbackFunc = std::bind(tFinishCallbackFunc, this, std::placeholders::_1); | ||
320 | - | ||
321 | - taskObjInfoCallbackFunc = nullptr; | ||
322 | - if (tObjInfoCallbackFunc != nullptr) | ||
323 | - taskObjInfoCallbackFunc = std::bind(tObjInfoCallbackFunc, this, std::placeholders::_1); | ||
324 | - | ||
325 | - minDistance[0] = minDistance[2] = 35; //left right | ||
326 | - minDistance[1] = minDistance[3] = 50; //top bottom | ||
327 | - | ||
328 | - m_hp_analysis_config = vptParam.hp_analysis_config; | ||
329 | - m_hcp_analysis_config = vptParam.hcp_analysis_config; | ||
330 | - m_vehicle_analysis_config = vptParam.vehicle_analysis_config; | ||
331 | - m_hf_recg_config = vptParam.hf_recg_config; | ||
332 | - m_hcf_recg_config = vptParam.hcf_recg_config; | ||
333 | - m_vcf_recg_config = vptParam.vcf_recg_config; | ||
334 | - m_face_det_config = vptParam.face_det_config; | ||
335 | - | ||
336 | - m_snaphot_helper.snapshot_helper_init(vptParam.gpuid, gpu_total_memory, vptParam.vrdbpath, vptParam.auth_license, vptParam.wait_framecount, m_hp_analysis_config, \ | ||
337 | - m_hcp_analysis_config, m_vehicle_analysis_config, m_vehicle_recg_config, m_vehicle_plate_det_recg_config, m_hf_recg_config, m_hcf_recg_config, m_vcf_recg_config); | ||
338 | - if (ret == SUCCESS) //�ɹ� | ||
339 | - { | ||
340 | - licence_status = 0; | ||
341 | -#ifdef AUTHORIZATION | ||
342 | - thrd = boost::thread(check_thread, this); | ||
343 | -#endif | ||
344 | - thrd_status = 0; | ||
345 | - } | ||
346 | - | ||
347 | - } | ||
348 | - else | ||
349 | - { | ||
350 | - return AUTHOR_ERROR; | ||
351 | - } | ||
352 | -/* | ||
353 | -#ifdef AUTHORIZATION | ||
354 | -#ifdef __linux__ | ||
355 | - if (wtime) | ||
356 | - { | ||
357 | - delete[] wtime; | ||
358 | - wtime = NULL; | ||
359 | - } | ||
360 | -#endif | ||
361 | -#endif */ // debug by zsh | ||
362 | - return ret; | ||
363 | -} | ||
364 | - | ||
365 | -void CMutliSourceVideoProcess::FinishDecode(const int taskID) | ||
366 | -{ | ||
367 | - boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(400)); | ||
368 | - | ||
369 | - for (int i = 0; i < tasks.size(); i++) | ||
370 | - { | ||
371 | - if (tasks[i].taskID == taskID && tasks[taskID].taskTcuvid != NULL) | ||
372 | - { | ||
373 | - tasks[taskID].taskState == FINISH; | ||
374 | - tasks[taskID].taskTcuvid->DxCloseDecoder(); | ||
375 | - delete tasks[taskID].taskTcuvid; | ||
376 | - tasks[taskID].taskTcuvid = NULL; | ||
377 | - printf("-----------------------finish task: %d-----------------------\n", taskID); | ||
378 | - break; | ||
379 | - } | ||
380 | - } | ||
381 | - | ||
382 | -} | ||
383 | - | ||
384 | -void CMutliSourceVideoProcess::FinishTask(const int taskID) | ||
385 | -{ | ||
386 | - for (int i = 0; i < tasks.size(); i++) | ||
387 | - { | ||
388 | - if (tasks[i].taskID == taskID) | ||
389 | - { | ||
390 | - //printf("first begin finish\n"); | ||
391 | - if (tasks[i].taskState == PLAY) TaskinPlay--; | ||
392 | - tasks[i].taskState = FINISH; | ||
393 | - tasks[i].taskFileSource = nullptr; | ||
394 | - tasks[i].taskObjCallbackFunc = nullptr; | ||
395 | - tasks[i].taskRealTimeCallbackFunc = nullptr; | ||
396 | - | ||
397 | - | ||
398 | - m_snaphot_helper.finish_task_ss_analysis(taskID, m_hp_analysis_config, m_hcp_analysis_config, m_vehicle_analysis_config, m_hf_recg_config, m_hcf_recg_config, m_vcf_recg_config); //�Ƿ�����������ʶ��); | ||
399 | - | ||
400 | - if (tasks[i].folderName) | ||
401 | - { | ||
402 | - delete tasks[i].folderName; | ||
403 | - tasks[i].folderName = nullptr; | ||
404 | - } | ||
405 | - | ||
406 | - | ||
407 | - if (tasks[i].folderNameLittle) | ||
408 | - { | ||
409 | - delete tasks[i].folderNameLittle; | ||
410 | - tasks[i].folderNameLittle = nullptr; | ||
411 | - } | ||
412 | - | ||
413 | - tasks[i].frameImage.release(); | ||
414 | - | ||
415 | - | ||
416 | - if (tasks[i].task_algorithm_data.frame) | ||
417 | - { | ||
418 | - cudaFree(tasks[i].task_algorithm_data.frame); | ||
419 | - tasks[i].task_algorithm_data.frame = nullptr; | ||
420 | - } | ||
421 | - | ||
422 | - FinishTaskTracker(VPT_Handle, taskID); | ||
423 | - | ||
424 | - if (viewTaskID == taskID) viewTaskID = -1; | ||
425 | - | ||
426 | - | ||
427 | - break; | ||
428 | - } | ||
429 | - } | ||
430 | -} | ||
431 | - | ||
432 | -void CMutliSourceVideoProcess::PauseTask(const int taskID) | ||
433 | -{ | ||
434 | - for (int i = 0; i < tasks.size(); i++) | ||
435 | - { | ||
436 | - if (tasks[i].taskID == taskID) | ||
437 | - { | ||
438 | - if (tasks[i].taskState == PLAY) TaskinPlay--; | ||
439 | - tasks[i].taskState = PAUSE; | ||
440 | - PauseTaskTracker(VPT_Handle, taskID); | ||
441 | - tasks[i].taskTcuvid->PauseDecoder(); | ||
442 | - if (viewTaskID == taskID) viewTaskID = -1; | ||
443 | - printf("-----------------------pasue task: %d-----------------------\n", taskID); | ||
444 | - break; | ||
445 | - } | ||
446 | - } | ||
447 | -} | ||
448 | - | ||
449 | -void CMutliSourceVideoProcess::RestartTask(const int taskID) | ||
450 | -{ | ||
451 | - for (int i = 0; i < tasks.size(); i++) | ||
452 | - { | ||
453 | - if (tasks[i].taskID == taskID) | ||
454 | - { | ||
455 | - tasks[i].taskState = PLAY; | ||
456 | - TaskinPlay++; | ||
457 | - RestartTaskTraker(VPT_Handle, taskID); | ||
458 | - tasks[i].taskTcuvid->ResumeDecoder(); | ||
459 | - printf("-----------------------restart task: %d-----------------------\n", taskID); | ||
460 | - break; | ||
461 | - } | ||
462 | - } | ||
463 | -} | ||
464 | - | ||
465 | -//ʵʱ�鿴�ӿ� �ɿ���һ·��ʵʱ�鿴������·�ķ������OSD��Ȼ����ͨ���ص��������ظ��û� | ||
466 | -void CMutliSourceVideoProcess::ViewTask(const int taskID) | ||
467 | -{ | ||
468 | - if (tasks.size() > taskID && tasks[taskID].taskState == PLAY) | ||
469 | - { | ||
470 | - viewTaskID = taskID; | ||
471 | - printf("-----------------------view task: %d-----------------------\n", taskID); | ||
472 | - } | ||
473 | - else | ||
474 | - printf("Only can view playing task!"); | ||
475 | -} | ||
476 | - | ||
477 | -//����ʵʱ�鿴�ӿڣ��ر�ʵʱ����ķ��� | ||
478 | -void CMutliSourceVideoProcess::FinishViewTask() | ||
479 | -{ | ||
480 | - viewTaskID = -1; | ||
481 | - printf("-----------------------finish view task-----------------------\n"); | ||
482 | -} | ||
483 | - | ||
484 | - | ||
485 | -//bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc/* = NULL*/, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc/* = NULL*/) | ||
486 | -bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, int jpeg_quality, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc/* = NULL*/, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc/* = NULL*/) //debug by zsh | ||
487 | -{ | ||
488 | - //checkGpuMem(); | ||
489 | - std::lock_guard<std::mutex> l(_tx_add_task); | ||
490 | - using std::placeholders::_1; | ||
491 | - // printf("begin real add task\n"); | ||
492 | - if (TaskinPlay >= capacity) | ||
493 | - { | ||
494 | - //cout << "********************** resize capacity *************************" << endl; | ||
495 | - capacity *= 2; | ||
496 | - VPTResult.resize(capacity); | ||
497 | - } | ||
498 | - | ||
499 | - string sVideoFileName = videoFileName; | ||
500 | - | ||
501 | - string target = "file://"; | ||
502 | - int pos = sVideoFileName.find(target); | ||
503 | - if (pos == 0) { | ||
504 | - int n = target.size(); | ||
505 | - sVideoFileName = sVideoFileName.erase(pos, n); | ||
506 | - } | ||
507 | - pos = sVideoFileName.find_first_of('?'); | ||
508 | - if (pos != string::npos) { | ||
509 | - sVideoFileName = sVideoFileName.substr(0, pos); | ||
510 | - } | ||
511 | - | ||
512 | - Task new_task = {}; | ||
513 | - new_task.taskID = TotalTask; | ||
514 | - new_task.taskFileSource = videoFileName; | ||
515 | - memcpy(new_task.task_min_boxsize, minBoxsize, sizeof(sy_rect)* DETECTTYPE); | ||
516 | - | ||
517 | - | ||
518 | - DxConfig cfg = { 0 }; | ||
519 | - cfg.devId = mgpuid; | ||
520 | - cfg.decMode = 0; | ||
521 | - cfg.colorFmt = 0; | ||
522 | - cfg.forceTcp = false; | ||
523 | - cfg.type = DX_DECODER_TYPE_SFXLAB; | ||
524 | - new_task.taskTcuvid = new DxDecoderWrap(&cfg); | ||
525 | - if (NULL == new_task.taskTcuvid) | ||
526 | - { | ||
527 | - printf("Add New DxDecoder Failed!"); | ||
528 | - AddTaskSucFlag = -1; | ||
529 | - return false; | ||
530 | - } | ||
531 | - | ||
532 | - if (new_task.taskTcuvid->DxOpenDecoder(new_task.taskFileSource, skip_frame_) != 0) | ||
533 | - { | ||
534 | - cout << "Add Task Failed! Please check you video file name!" << endl; | ||
535 | - delete new_task.taskTcuvid; | ||
536 | - new_task.taskTcuvid = NULL; | ||
537 | - AddTaskSucFlag = -1; | ||
538 | - return false; | ||
539 | - } | ||
540 | - | ||
541 | - int tmp_total_frame = new_task.taskTcuvid->DxGetFrameCount(); | ||
542 | - | ||
543 | - printf("finish add codec. tmp_total_frame: %d \n", tmp_total_frame); | ||
544 | - | ||
545 | - new_task.taskState = PLAY; | ||
546 | - new_task.task_algorithm_data.frame = NULL; | ||
547 | - new_task.taskFrameCount = 0; | ||
548 | - new_task.taskLastFrameCount = 0; | ||
549 | - | ||
550 | - new_task.taskObjCallbackFunc = nullptr; | ||
551 | - if (objCallbackFunc != nullptr) | ||
552 | - new_task.taskObjCallbackFunc = std::bind(objCallbackFunc, this, std::placeholders::_1); | ||
553 | - | ||
554 | - new_task.taskRealTimeCallbackFunc = nullptr; | ||
555 | - if (realTimeCallbackFunc != nullptr) | ||
556 | - new_task.taskRealTimeCallbackFunc = std::bind(realTimeCallbackFunc, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); | ||
557 | - | ||
558 | - new_task.taskTotalFrameCount = tmp_total_frame; | ||
559 | - if (resultFolderLittle == NULL) | ||
560 | - { | ||
561 | - new_task.folderNameLittle = NULL; | ||
562 | - } | ||
563 | - else | ||
564 | - { | ||
565 | - new_task.folderNameLittle = new char[strlen(resultFolderLittle) + 2]{}; | ||
566 | - strcpy(new_task.folderNameLittle, resultFolderLittle); | ||
567 | - | ||
568 | - int length = strlen(new_task.folderNameLittle); | ||
569 | - if (new_task.folderNameLittle[length - 1] != '\\' && new_task.folderNameLittle[length - 1] != '/') | ||
570 | - { | ||
571 | - new_task.folderNameLittle[length] = '/'; | ||
572 | - new_task.folderNameLittle[length + 1] = '\0'; | ||
573 | - } | ||
574 | - | ||
575 | - CreateResultFolder(new_task.folderNameLittle, ""); | ||
576 | - } | ||
577 | - | ||
578 | - | ||
579 | - if (resultFolder == NULL) | ||
580 | - { | ||
581 | - new_task.folderName = NULL; | ||
582 | - } | ||
583 | - else | ||
584 | - { | ||
585 | - new_task.folderName = new char[strlen(resultFolder) + 2]{}; | ||
586 | - strcpy(new_task.folderName, resultFolder); | ||
587 | - | ||
588 | - int length = strlen(new_task.folderName); | ||
589 | - if (new_task.folderName[length - 1] != '\\' && new_task.folderName[length - 1] != '/') | ||
590 | - { | ||
591 | - new_task.folderName[length] = '/'; | ||
592 | - new_task.folderName[length + 1] = '\0'; | ||
593 | - } | ||
594 | - | ||
595 | - CreateResultFolder(new_task.folderName, ""); | ||
596 | - } | ||
597 | - | ||
598 | - if (resultFolderface == NULL) | ||
599 | - { | ||
600 | - new_task.folderNameFace = NULL; | ||
601 | - } | ||
602 | - else | ||
603 | - { | ||
604 | - new_task.folderNameFace = new char[strlen(resultFolderface) + 2]{}; | ||
605 | - strcpy(new_task.folderNameFace, resultFolderface); | ||
606 | - | ||
607 | - int length = strlen(new_task.folderNameFace); | ||
608 | - if (new_task.folderNameFace[length - 1] != '\\' && new_task.folderNameFace[length - 1] != '/') | ||
609 | - { | ||
610 | - new_task.folderNameFace[length] = '/'; | ||
611 | - new_task.folderNameFace[length + 1] = '\0'; | ||
612 | - } | ||
613 | - | ||
614 | - CreateResultFolder(new_task.folderNameFace, ""); | ||
615 | - } | ||
616 | - | ||
617 | - // printf("finish create folder\n"); | ||
618 | - | ||
619 | - //Sleep(10); | ||
620 | - //std::cout << "CreateResultFolder" << std::endl; | ||
621 | - TASK_INFO new_task_info = {}; | ||
622 | - new_task_info.image_folder = new_task.folderName; | ||
623 | - new_task_info.snapshot_folder = new_task.folderNameLittle; | ||
624 | - new_task_info.snapshot_folder_face = new_task.folderNameFace; | ||
625 | - new_task_info.task_total_framecount = new_task.taskTotalFrameCount; | ||
626 | - new_task_info._on_image_display = on_image_display; | ||
627 | - new_task_info.jpeg_quality_ = jpeg_quality; //debug by zsh | ||
628 | - new_task_info.obj_callback = new_task.taskObjCallbackFunc; | ||
629 | - m_snaphot_helper.add_task_info(new_task.taskID, new_task_info); | ||
630 | - | ||
631 | - TotalTask++; | ||
632 | - TaskinPlay++; | ||
633 | - tasks.push_back(new_task); | ||
634 | - | ||
635 | - // printf("finish push tasks\n"); | ||
636 | - | ||
637 | - //return 1; | ||
638 | - //std::cout<<__LINE__<<"of"<<__FILE__<<"debug\n"; | ||
639 | - if (!ProcessFlag) | ||
640 | - { | ||
641 | - /*for (int num = 0; num < 5; ++num) | ||
642 | - {*/ | ||
643 | - //create_thread()��һ���������������Դ���thead���������̣߳�ͬʱ�����ڲ���list | ||
644 | - // group.create_thread(boost::bind(&runchild , num)) ; | ||
645 | - //saveSnapshotsThreadGroup.create_thread(boost::bind(SnapshotThreadProcess, this, 0)); | ||
646 | - //} | ||
647 | - ProcessThread = boost::thread(ThreadProcess, this); | ||
648 | - //std::cout << "begin algorithm" << std::endl; | ||
649 | - ProcessFlag = true; | ||
650 | - } | ||
651 | - | ||
652 | - printf("-----------------------add task: %d-----------------------\n", tasks.size() - 1); | ||
653 | - AddTaskSucFlag = 1; | ||
654 | - return true; | ||
655 | -} | ||
656 | - | ||
657 | -int CMutliSourceVideoProcess::AddOperator(task_param tparam) | ||
658 | -{ | ||
659 | - //boost::mutex::scoped_lock lock(process_thread_mutex); | ||
660 | - | ||
661 | - if (!ProcessFlag) | ||
662 | - { | ||
663 | - //AddTask(tparam.video_filename, tparam.result_folder_little, tparam.result_folder, tparam.result_folder_face, tparam.on_image_display, tparam.minBoxsize, tparam.obj_snapshot_callback_func, tparam.rt_view_callback_func); | ||
664 | - AddTask(tparam.video_filename, tparam.result_folder_little, tparam.result_folder, tparam.result_folder_face, tparam.on_image_display, tparam.jpeg_quality, tparam.minBoxsize, tparam.obj_snapshot_callback_func, tparam.rt_view_callback_func); //debug by zsh | ||
665 | - boost::thread::sleep(boost::get_system_time() + boost::posix_time::microseconds(500)); | ||
666 | - } | ||
667 | - else | ||
668 | - { | ||
669 | - // printf("add first task in operator queue\n"); | ||
670 | - std::unique_lock<std::mutex> l(taskMutex); | ||
671 | - AddTaskSucFlag = 0; | ||
672 | - Operator newOper; | ||
673 | - newOper.changeTaskID = 0; | ||
674 | - newOper.changeTaskOperator = ADDTASK; | ||
675 | - newOper.videoFileName = tparam.video_filename; | ||
676 | - newOper.resultFolderLittleName = tparam.result_folder_little; | ||
677 | - newOper.result_folder_face = tparam.result_folder_face; | ||
678 | - newOper.resultFolderName = tparam.result_folder; | ||
679 | - newOper.on_image_display = tparam.on_image_display; | ||
680 | - newOper.jpeg_quality = tparam.jpeg_quality; //debug by zsh | ||
681 | - newOper.taskObjCallbackFunc = tparam.obj_snapshot_callback_func; | ||
682 | - newOper.taskRealTimeCallbackFunc = tparam.rt_view_callback_func; | ||
683 | - memcpy(newOper.minBoxsize, tparam.minBoxsize, sizeof(sy_rect)* DETECTTYPE); | ||
684 | - TaskOperatorQ.push_back(newOper); | ||
685 | - taskCondVar.wait_for(l, std::chrono::seconds(20)); | ||
686 | - // printf("finish first task in operator queue\n"); | ||
687 | - } | ||
688 | - | ||
689 | - int addRes = -1; | ||
690 | - int newTaskID = TaskID++; | ||
691 | - | ||
692 | - if (AddTaskSucFlag == 1) | ||
693 | - { | ||
694 | - addRes = newTaskID; | ||
695 | - } | ||
696 | - else if (AddTaskSucFlag == -1) | ||
697 | - { | ||
698 | - addRes = -1; | ||
699 | - TaskID--; | ||
700 | - } | ||
701 | - else if (AddTaskSucFlag == 0) | ||
702 | - { | ||
703 | - Operator newOper = TaskOperatorQ.back(); | ||
704 | - if (strcmp(newOper.videoFileName, tparam.video_filename) == 0) | ||
705 | - { | ||
706 | - TaskOperatorQ.pop_back(); | ||
707 | - } | ||
708 | - cout << "Failed Add New Task! Algorithm Process Error! " << endl; | ||
709 | - } | ||
710 | - | ||
711 | - return addRes; | ||
712 | -} | ||
713 | - | ||
714 | -int CMutliSourceVideoProcess::get_task_progress(int taskid, double &progress) | ||
715 | -{ | ||
716 | - int ret = 0; | ||
717 | - for (auto &item : tasks) | ||
718 | - { | ||
719 | - if (item.taskID == taskid) | ||
720 | - { | ||
721 | - progress = (double)item.taskFrameCount / (double)item.taskTotalFrameCount; | ||
722 | - return 0; | ||
723 | - } | ||
724 | - } | ||
725 | - return -1; | ||
726 | - | ||
727 | -} | ||
728 | - | ||
729 | -void CMutliSourceVideoProcess::AddOperator(int taskID, int taskOper) | ||
730 | -{ | ||
731 | - if (taskOper > 0 && taskOper < 4) | ||
732 | - { | ||
733 | - Operator newOper = {}; | ||
734 | - newOper.changeTaskID = taskID; | ||
735 | - newOper.changeTaskOperator = TaskOperator(taskOper); | ||
736 | - newOper.videoFileName = NULL; | ||
737 | - //TaskOperatorQ.push(newOper); | ||
738 | - TaskOperatorQ.push_back(newOper); | ||
739 | - } | ||
740 | -} | ||
741 | - | ||
742 | -void CMutliSourceVideoProcess::OperatorTask() | ||
743 | -{ | ||
744 | - while (!TaskOperatorQ.empty()) | ||
745 | - { | ||
746 | - Operator newOperator = TaskOperatorQ.front(); | ||
747 | - TaskOperatorQ.pop_front(); | ||
748 | - | ||
749 | - switch (newOperator.changeTaskOperator) | ||
750 | - { | ||
751 | - case ADDTASK: | ||
752 | - //AddTask(newOperator.videoFileName, newOperator.resultFolderLittleName, newOperator.resultFolderName, newOperator.result_folder_face, newOperator.on_image_display, newOperator.minBoxsize, newOperator.taskObjCallbackFunc, newOperator.taskRealTimeCallbackFunc); | ||
753 | - AddTask(newOperator.videoFileName, newOperator.resultFolderLittleName, newOperator.resultFolderName, newOperator.result_folder_face, newOperator.on_image_display, newOperator.jpeg_quality, newOperator.minBoxsize, newOperator.taskObjCallbackFunc, newOperator.taskRealTimeCallbackFunc); //debug by zsh | ||
754 | - break; | ||
755 | - case PAUSETASK: | ||
756 | - PauseTask(newOperator.changeTaskID); | ||
757 | - break; | ||
758 | - case RESTARTTASK: | ||
759 | - RestartTask(newOperator.changeTaskID); | ||
760 | - break; | ||
761 | - case FINISHTASK: | ||
762 | - FinishTask(newOperator.changeTaskID); | ||
763 | - break; | ||
764 | - default: | ||
765 | - break; | ||
766 | - } | ||
767 | - | ||
768 | - } | ||
769 | -} | ||
770 | - | ||
771 | - | ||
772 | -int CMutliSourceVideoProcess::SaveResultInFile(const OBJ_KEY & obj_key, const OBJ_VALUE & obj_value) | ||
773 | -{ | ||
774 | - if (0 == obj_value.index.index && obj_value.snapShotLittle.width == HP_WIDTH && obj_value.snapShotLittle.height == HP_HEIGHT) | ||
775 | - { | ||
776 | - if (m_face_det_config == SY_CONFIG_OPEN) | ||
777 | - { | ||
778 | - m_snaphot_helper.save_face_snapshot(obj_key); | ||
779 | - } | ||
780 | - | ||
781 | - if (m_hp_analysis_config == SY_CONFIG_OPEN || m_hf_recg_config == SY_CONFIG_OPEN) | ||
782 | - { | ||
783 | - m_snaphot_helper.save_snapshot(obj_key); | ||
784 | - m_snaphot_helper.hp_analysis(obj_key); | ||
785 | - } | ||
786 | - else | ||
787 | - { | ||
788 | - m_snaphot_helper.save_without_analysis(obj_key); | ||
789 | - } | ||
790 | - } | ||
791 | - else if ((1 == obj_value.index.index || 2 == obj_value.index.index) && obj_value.snapShotLittle.width == HCP_WIDTH && obj_value.snapShotLittle.height == HCP_HEIGHT) | ||
792 | - { | ||
793 | - if (m_hcp_analysis_config == SY_CONFIG_OPEN || m_hcf_recg_config == SY_CONFIG_OPEN) | ||
794 | - { | ||
795 | - m_snaphot_helper.save_snapshot(obj_key); | ||
796 | - m_snaphot_helper.hcp_analysis(obj_key); | ||
797 | - } | ||
798 | - else | ||
799 | - { | ||
800 | - m_snaphot_helper.save_without_analysis(obj_key); | ||
801 | - } | ||
802 | - } | ||
803 | - else if ((8 == obj_value.index.index || (obj_value.index.index >= 4 && obj_value.index.index <= 6)) && obj_value.snapShotLittle.width == VEHICLE_WIDTH && obj_value.snapShotLittle.height == VEHICLE_HEIGHT) | ||
804 | - { | ||
805 | - //VEHICLEAnalysis(obj_key, obj_value); | ||
806 | - if (m_vehicle_analysis_config == SY_CONFIG_OPEN || m_vcf_recg_config == SY_CONFIG_OPEN) | ||
807 | - { | ||
808 | - m_snaphot_helper.save_snapshot(obj_key); | ||
809 | - m_snaphot_helper.vehicle_analysis(obj_key); | ||
810 | - } | ||
811 | - else | ||
812 | - { | ||
813 | - m_snaphot_helper.save_without_analysis(obj_key); | ||
814 | - } | ||
815 | - | ||
816 | - } | ||
817 | - else | ||
818 | - { | ||
819 | - m_snaphot_helper.save_without_analysis(obj_key); | ||
820 | - } | ||
821 | - | ||
822 | - return 0; | ||
823 | -} | ||
824 | - | ||
825 | - | ||
826 | -//#define LOG_INFO | ||
827 | -void CMutliSourceVideoProcess::callTaskObjInfoCallbackFunc(int objCount, VPT_ObjInfo *obj, int taskFrameCount, int taskId) | ||
828 | -{ | ||
829 | - if (objCount == 0) | ||
830 | - { | ||
831 | - video_object_info newObjInfo; | ||
832 | - newObjInfo.task_id = taskId; | ||
833 | - newObjInfo.task_frame_count = taskFrameCount; | ||
834 | - newObjInfo.object_id = -1; | ||
835 | - newObjInfo.left = 0; | ||
836 | - newObjInfo.right = 0; | ||
837 | - newObjInfo.top = 0; | ||
838 | - newObjInfo.bottom = 0; | ||
839 | - newObjInfo.index = 0; | ||
840 | - newObjInfo.confidence = 0; | ||
841 | - | ||
842 | - if (taskObjInfoCallbackFunc != nullptr) | ||
843 | - taskObjInfoCallbackFunc(&newObjInfo); | ||
844 | - } | ||
845 | - else | ||
846 | - { | ||
847 | - for (int c = 0; c < objCount; c++) | ||
848 | - { | ||
849 | - OBJ_KEY newObj = { taskId, obj[c].id }; | ||
850 | - video_object_info newObjInfo; | ||
851 | - newObjInfo.task_id = taskId; | ||
852 | - newObjInfo.task_frame_count = taskFrameCount; | ||
853 | - newObjInfo.object_id = obj[c].id; | ||
854 | - newObjInfo.left = obj[c].left; | ||
855 | - newObjInfo.right = obj[c].right; | ||
856 | - newObjInfo.top = obj[c].top; | ||
857 | - newObjInfo.bottom = obj[c].bottom; | ||
858 | - if (m_snaphot_helper.snapShotInfo.find(newObj) == m_snaphot_helper.snapShotInfo.end()) | ||
859 | - newObjInfo.index = obj[c].index; | ||
860 | - else | ||
861 | - newObjInfo.index = m_snaphot_helper.snapShotInfo[newObj].index.index; | ||
862 | - newObjInfo.confidence = obj[c].confidence; | ||
863 | - if (taskObjInfoCallbackFunc != nullptr) | ||
864 | - { | ||
865 | - taskObjInfoCallbackFunc(&newObjInfo); | ||
866 | - } | ||
867 | - } | ||
868 | - | ||
869 | - } | ||
870 | -} | ||
871 | -DWORD ThreadProcess(LPVOID param) | ||
872 | -{ | ||
873 | - set<int> k; | ||
874 | - int count = 0; | ||
875 | - sy_img * batch_img = new sy_img[20]{}; | ||
876 | - | ||
877 | - DxGPUFrame frame = {}; | ||
878 | - | ||
879 | - CMutliSourceVideoProcess *pThreadParam = (CMutliSourceVideoProcess *)param; | ||
880 | - | ||
881 | - cudaSetDevice(pThreadParam->mgpuid); | ||
882 | - | ||
883 | - // CUdevice cuDevice; | ||
884 | - // cuDeviceGet(&cuDevice, pThreadParam->mgpuid); | ||
885 | - // CUcontext context; | ||
886 | - // cuCtxCreate(&context, 0, cuDevice); | ||
887 | - // cuCtxPushCurrent(context); | ||
888 | - | ||
889 | - // cuda_common::setColorSpace2(ITU709, 0); | ||
890 | - // cudaMalloc((void**)&pThreadParam->FrameTemp, 3 * 4096 * 4096 * sizeof(unsigned char)); | ||
891 | - int total_count = 0; | ||
892 | - long long begintime1 =get_cur_time_ms(); | ||
893 | - | ||
894 | - int process_times = 0; | ||
895 | - //std::string osPath = "./vptlog"; | ||
896 | - //osPath += std::to_string(pThreadParam->mgpuid); | ||
897 | - //osPath += ".txt"; | ||
898 | - //std::ofstream os(osPath, std::ofstream::out | std::ofstream::trunc); | ||
899 | - //os << unitbuf; | ||
900 | - //try | ||
901 | - | ||
902 | - long long last_time = get_cur_time_ms(); | ||
903 | - | ||
904 | - { | ||
905 | - while (1) | ||
906 | - { | ||
907 | - if (pThreadParam->licence_status <= -3) | ||
908 | - { | ||
909 | - printf("authority failed!\n"); | ||
910 | - break; | ||
911 | - } | ||
912 | - | ||
913 | - double time_val, time_val_p = 0; | ||
914 | - { | ||
915 | - std::lock_guard<std::mutex> l(pThreadParam->taskMutex); | ||
916 | - pThreadParam->OperatorTask(); | ||
917 | - } | ||
918 | - pThreadParam->taskCondVar.notify_all(); | ||
919 | - | ||
920 | - int curTaskSize = pThreadParam->tasks.size(); | ||
921 | - | ||
922 | - count = 0; | ||
923 | - static int ncount = 0; | ||
924 | - map<int, vector<int>> finishTaskDeleteObj; | ||
925 | - int curPlayTaskCount = 0; | ||
926 | - | ||
927 | - //�жϵ�ǰPLAY����Ľ���״̬��������ڽ����쳣��·������������·���� | ||
928 | - for (int i = 0; i < curTaskSize; i++) | ||
929 | - { | ||
930 | - if ((pThreadParam->tasks[i].taskState == PLAY || pThreadParam->tasks[i].taskState == DECODEERROR)) | ||
931 | - { | ||
932 | - if (!pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) | ||
933 | - { | ||
934 | - cudaError_t cudaStatus = cudaGetLastError(); | ||
935 | - if (cudaStatus != cudaSuccess) { | ||
936 | - printf("begin finish last error: %s\n", cudaGetErrorString(cudaStatus)); | ||
937 | - } | ||
938 | - | ||
939 | - cout << "***************** Task " << i << " is Finished *****************" << endl; | ||
940 | - pThreadParam->tasks[i].taskState = FINISH; | ||
941 | - | ||
942 | - pThreadParam->FinishTask(pThreadParam->tasks[i].taskID); | ||
943 | - | ||
944 | - pThreadParam->tasks[i].taskTcuvid->DxCloseDecoder(); | ||
945 | - delete pThreadParam->tasks[i].taskTcuvid; | ||
946 | - pThreadParam->tasks[i].taskTcuvid = NULL; | ||
947 | - int taskid = pThreadParam->tasks[i].taskID; | ||
948 | - | ||
949 | - //ѭ���ȴ� ֱ��finished_analysis_ss_info�����и�·Ŀ�궼�Ѿ����ظ��û����ſ��������������� | ||
950 | - std::unique_lock<std::mutex> lock(pThreadParam->m_snaphot_helper.analysisThreadMutex); | ||
951 | - while (std::find_if(pThreadParam->m_snaphot_helper.finished_analysis_ss_info.begin(), pThreadParam->m_snaphot_helper.finished_analysis_ss_info.end(), [&taskid](const std::pair<OBJ_KEY, video_object_snapshot> & item) ->bool { | ||
952 | - if (item.first.videoID == taskid) | ||
953 | - { | ||
954 | - return true; | ||
955 | - } | ||
956 | - else | ||
957 | - { | ||
958 | - return false; | ||
959 | - } | ||
960 | - | ||
961 | - }) != pThreadParam->m_snaphot_helper.finished_analysis_ss_info.end()) | ||
962 | - { | ||
963 | - lock.unlock(); | ||
964 | - std::this_thread::yield(); | ||
965 | - std::this_thread::sleep_for(std::chrono::milliseconds(100)); | ||
966 | - lock.lock(); | ||
967 | - } | ||
968 | - | ||
969 | - //�ص�֪ͨ�û� ��·����������� | ||
970 | - if (pThreadParam->taskFinishCallbackFunc != nullptr) | ||
971 | - { | ||
972 | - std::lock_guard<std::mutex> l(pThreadParam->m_snaphot_helper.callback_tx); | ||
973 | - pThreadParam->taskFinishCallbackFunc(pThreadParam->tasks[i].taskID); | ||
974 | - } | ||
975 | - | ||
976 | - pThreadParam->TaskinPlay--; | ||
977 | - } | ||
978 | - } | ||
979 | - | ||
980 | - if (pThreadParam->tasks[i].taskState == FINISH) | ||
981 | - count++; | ||
982 | - } | ||
983 | - | ||
984 | - //�������������FINISH״̬ | ||
985 | - if (count >= pThreadParam->tasks.size()) //have no decode video, break | ||
986 | - { | ||
987 | - { | ||
988 | - std::lock_guard<std::mutex> l(pThreadParam->taskMutex); | ||
989 | - //�ж���������ȴ������Ƿ����µ��������� | ||
990 | - if (pThreadParam->HasNewTask()) | ||
991 | - { | ||
992 | - continue; | ||
993 | - } | ||
994 | - else | ||
995 | - { | ||
996 | - //std::this_thread::sleep_for(std::chrono::milliseconds(40)); | ||
997 | - //continue; | ||
998 | - //printf("802 set ProcessFlag false\n"); | ||
999 | - | ||
1000 | - //Sleep(10); | ||
1001 | - //continue; | ||
1002 | - | ||
1003 | - //printf("0708\n"); | ||
1004 | - //pThreadParam->ProcessFlag = false; | ||
1005 | - break; | ||
1006 | - } | ||
1007 | - } | ||
1008 | - } | ||
1009 | - | ||
1010 | - //��ǰû��PLAY������ ѭ���ȴ� | ||
1011 | - curPlayTaskCount = pThreadParam->TaskinPlay; | ||
1012 | - if (curPlayTaskCount <= 0) { | ||
1013 | - Sleep(30); | ||
1014 | - continue; | ||
1015 | - } | ||
1016 | - | ||
1017 | - k.clear(); | ||
1018 | - pThreadParam->TaskinPlayID.clear(); | ||
1019 | - | ||
1020 | - //��ȡ�������� | ||
1021 | - getdata_flag: | ||
1022 | - for (int i = 0; i < curTaskSize; i++) | ||
1023 | - { | ||
1024 | - if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) | ||
1025 | - { | ||
1026 | - if (pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&frame) == 0) | ||
1027 | - { | ||
1028 | - if (!pThreadParam->tasks[i].task_algorithm_data.frame && frame.width > 0 && frame.height > 0) | ||
1029 | - { | ||
1030 | - cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->tasks[i].task_algorithm_data.frame, 3 * frame.size * frame.height * sizeof(unsigned char)); | ||
1031 | - if (cudaStatus != cudaSuccess) { | ||
1032 | - fprintf(stderr, "here cudaMalloc m_pRGBData[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | ||
1033 | - break; | ||
1034 | - } | ||
1035 | - | ||
1036 | - pThreadParam->tasks[i].task_algorithm_data.height = frame.height; | ||
1037 | - pThreadParam->tasks[i].task_algorithm_data.width = frame.width; | ||
1038 | - pThreadParam->tasks[i].task_algorithm_data.size = frame.size; | ||
1039 | - | ||
1040 | - pThreadParam->tasks[i].frameImage = cv::Mat::zeros(frame.height, frame.width, CV_8UC3); | ||
1041 | - AddTaskTracker(pThreadParam->VPT_Handle, pThreadParam->tasks[i].taskID, 1, 1); | ||
1042 | - } | ||
1043 | - | ||
1044 | - //copy decode data | ||
1045 | - if (pThreadParam->tasks[i].task_algorithm_data.frame) | ||
1046 | - { | ||
1047 | - int height = frame.height; | ||
1048 | - int width = frame.width; | ||
1049 | - | ||
1050 | - Nv12ToColor24<BGR24>( (unsigned char *)frame.frame, width, (unsigned char *)pThreadParam->tasks[i].task_algorithm_data.frame, 3 * width, width, height, 0 ); | ||
1051 | - | ||
1052 | - pThreadParam->tasks[i].task_algorithm_data.timestamp = frame.timestamp; | ||
1053 | - | ||
1054 | - k.insert(i); | ||
1055 | - pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | ||
1056 | - } | ||
1057 | - else | ||
1058 | - { | ||
1059 | - std::cout << "NOT ALLOC: pThreadParam->tasks[i].taskDataToBackup.frame" << pThreadParam->tasks[i].task_algorithm_data.frame << std::endl; | ||
1060 | - } | ||
1061 | - | ||
1062 | - pThreadParam->tasks[i].taskTcuvid->DxUnlockFrame(); | ||
1063 | - } | ||
1064 | - } | ||
1065 | - else if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && !pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) | ||
1066 | - { | ||
1067 | - pThreadParam->tasks[i].taskState = DECODEERROR; | ||
1068 | - curPlayTaskCount--; | ||
1069 | - FinishTaskTracker(pThreadParam->VPT_Handle, pThreadParam->tasks[i].taskID); | ||
1070 | - } | ||
1071 | - } | ||
1072 | - | ||
1073 | - if (curPlayTaskCount <= 0) { | ||
1074 | - Sleep(30); | ||
1075 | - continue; | ||
1076 | - } | ||
1077 | - | ||
1078 | - //��û�л�ȡ������·���Ľ������� ѭ���ȴ� | ||
1079 | - if (k.size() < curPlayTaskCount) | ||
1080 | - { | ||
1081 | - boost::this_thread::sleep(boost::posix_time::milliseconds(1)); | ||
1082 | - goto getdata_flag; | ||
1083 | - } | ||
1084 | - | ||
1085 | -#ifdef LOG_INFO2 | ||
1086 | - long long gather_data_time = get_cur_time_ms(); | ||
1087 | - std::cout << "gather_data time_using: " << gather_data_time - last_time << std::endl; | ||
1088 | -#endif | ||
1089 | - | ||
1090 | - cudaDeviceSynchronize(); | ||
1091 | - | ||
1092 | - //------------------------------ ͳһBATCH���� --------------------------------// | ||
1093 | - ////////////////////////////////////////////////////////////// | ||
1094 | - //// | ||
1095 | - //// compose data -> batch | ||
1096 | - //// | ||
1097 | - ///////////////////////////////////////////////////////////// | ||
1098 | - | ||
1099 | - vector<vector<int>> deleteObjectID; | ||
1100 | - set<int>::iterator iter = pThreadParam->TaskinPlayID.begin(); | ||
1101 | - | ||
1102 | - int cur_batch_size = 0; | ||
1103 | - cur_batch_size = pThreadParam->section_batch_size; | ||
1104 | - | ||
1105 | - if (0) | ||
1106 | - { | ||
1107 | - if (pThreadParam->section_batch_size == 20) | ||
1108 | - cur_batch_size = pThreadParam->section_batch_size; | ||
1109 | - else | ||
1110 | - { | ||
1111 | - if (curPlayTaskCount <= 2 * pThreadParam->section_batch_size) | ||
1112 | - cur_batch_size = pThreadParam->section_batch_size; | ||
1113 | - else if (curPlayTaskCount >= 2 * MAX_BATCH) | ||
1114 | - cur_batch_size = MAX_BATCH; | ||
1115 | - else | ||
1116 | - cur_batch_size = curPlayTaskCount / 2 + (curPlayTaskCount % 2); | ||
1117 | - } | ||
1118 | - } | ||
1119 | - | ||
1120 | - long long start_time_vpt = get_cur_time_ms(); | ||
1121 | - | ||
1122 | - vector<vector<VPT_Result>> unUsedResult; | ||
1123 | - vector<unsigned long long> vec_frameIndex; | ||
1124 | - unUsedResult.resize(pThreadParam->VPTResult.size()); | ||
1125 | - int cycleTimes = curPlayTaskCount / cur_batch_size + (curPlayTaskCount % cur_batch_size == 0 ? 0 : 1); | ||
1126 | - for (int c = 0; c < cycleTimes; c++) | ||
1127 | - { | ||
1128 | - int batchsize = c == cycleTimes - 1 ? (curPlayTaskCount - cur_batch_size*c) : cur_batch_size; | ||
1129 | - int startbatch = c*cur_batch_size; | ||
1130 | - | ||
1131 | - vec_frameIndex.clear(); | ||
1132 | - for (int i = 0; i < batchsize; i++) | ||
1133 | - { | ||
1134 | - DxGPUFrame task_algorithm_data = pThreadParam->tasks[*iter].task_algorithm_data; | ||
1135 | - int w = task_algorithm_data.width; | ||
1136 | - int h = task_algorithm_data.height; | ||
1137 | - int npitch = task_algorithm_data.size; | ||
1138 | - | ||
1139 | - batch_img[i].set_data(w, h, 3, (unsigned char *)task_algorithm_data.frame); | ||
1140 | - vec_frameIndex.push_back(task_algorithm_data.timestamp); | ||
1141 | - iter++; | ||
1142 | - } | ||
1143 | - | ||
1144 | - vector<vector<int>> tempDeleteObjectID; | ||
1145 | - tempDeleteObjectID.resize(batchsize); | ||
1146 | - int flag = VPT_Process_GPU(pThreadParam->GetVPT_Handle(), batch_img, startbatch, batchsize, vec_frameIndex, pThreadParam->VPTResult, tempDeleteObjectID, unUsedResult); | ||
1147 | - process_times++ ; | ||
1148 | - | ||
1149 | - for (auto iter : tempDeleteObjectID) | ||
1150 | - { | ||
1151 | - deleteObjectID.push_back(iter); | ||
1152 | - } | ||
1153 | - vector<vector<int>>().swap(tempDeleteObjectID); | ||
1154 | - } | ||
1155 | -#ifdef LOG_INFO2 | ||
1156 | - std::cout << "VPT_Process_GPU time_using: " << get_cur_time_ms() - start_time_vpt << std::endl; | ||
1157 | -#endif | ||
1158 | - | ||
1159 | - long long result_analysis_time = get_cur_time_ms(); | ||
1160 | - | ||
1161 | - iter = pThreadParam->TaskinPlayID.begin(); | ||
1162 | - for (int i = 0; i < curPlayTaskCount; i++) | ||
1163 | - { | ||
1164 | - pThreadParam->tasks[*iter].taskFrameCount = pThreadParam->tasks[*iter].task_algorithm_data.timestamp; | ||
1165 | - //若该路任务当前帧未检测到目标,返回ID为-1的目标表明未检测到目标 | ||
1166 | - if (pThreadParam->VPTResult[i].objCount == 0) | ||
1167 | - { | ||
1168 | - pThreadParam->callTaskObjInfoCallbackFunc(0, nullptr, pThreadParam->tasks[*iter].taskFrameCount, *iter); | ||
1169 | - } | ||
1170 | - | ||
1171 | - //实时查看模块,若存在实时查看,把当前视频画面cp回内存 | ||
1172 | - bool view = false; | ||
1173 | - int frameHeight = pThreadParam->tasks[*iter].task_algorithm_data.height; | ||
1174 | - int frameWidth = pThreadParam->tasks[*iter].task_algorithm_data.width; | ||
1175 | - | ||
1176 | - if (*iter == pThreadParam->viewTaskID) | ||
1177 | - { | ||
1178 | - cudaMemcpy(pThreadParam->tasks[*iter].frameImage.data, pThreadParam->tasks[*iter].task_algorithm_data.frame, 3 * pThreadParam->tasks[*iter].task_algorithm_data.width * pThreadParam->tasks[*iter].task_algorithm_data.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
1179 | - view = true; | ||
1180 | - } | ||
1181 | - | ||
1182 | - //跟踪帧也需要返回跟踪的结果 | ||
1183 | - if (pThreadParam->tasks[*iter].taskLastFrameCount > 0) | ||
1184 | - { | ||
1185 | - vector<VPT_Result> OneUnUsedResult = unUsedResult[i]; | ||
1186 | - if (OneUnUsedResult.size() == 0) | ||
1187 | - { | ||
1188 | - pThreadParam->callTaskObjInfoCallbackFunc(0, nullptr, pThreadParam->tasks[*iter].taskLastFrameCount + 1, *iter); | ||
1189 | - } | ||
1190 | - for (int k = 0; k < OneUnUsedResult.size(); ++k) | ||
1191 | - { | ||
1192 | - if (OneUnUsedResult[k].objCount == 0) | ||
1193 | - { | ||
1194 | - pThreadParam->callTaskObjInfoCallbackFunc(0, nullptr, pThreadParam->tasks[*iter].taskLastFrameCount + k + 1, *iter); | ||
1195 | - } | ||
1196 | - else | ||
1197 | - { | ||
1198 | - //cout << "OneUnUsedResult.size = " << OneUnUsedResult.size() << " k=" << k << " OneUnUsedResult[k].objCount = " << OneUnUsedResult[k].objCount << endl; | ||
1199 | - pThreadParam->callTaskObjInfoCallbackFunc(OneUnUsedResult[k].objCount, OneUnUsedResult[k].obj, pThreadParam->tasks[*iter].taskLastFrameCount + k + 1, *iter); | ||
1200 | - } | ||
1201 | - } | ||
1202 | - } | ||
1203 | - pThreadParam->tasks[*iter].taskLastFrameCount = pThreadParam->tasks[*iter].taskFrameCount; | ||
1204 | - | ||
1205 | - unsigned char* snapshot_image_data[MAX_OBJ_COUNT]{};// = new unsigned char*[pThreadParam->VPTResult[i].objCount]; | ||
1206 | - int snapshot_left[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1207 | - int snapshot_right[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1208 | - int snapshot_top[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1209 | - int snapshot_bottom[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1210 | - int snapshot_dst_width[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1211 | - int snapshot_dst_height[MAX_OBJ_COUNT]{};// = new int[pThreadParam->VPTResult[i].objCount]; | ||
1212 | - | ||
1213 | - int copy_obj_count = 0; //用于记录该路有多少个目标需要进行显存图像的更新 | ||
1214 | - vector<int> human_idx; //用于记录快照数组中那些是人脸 | ||
1215 | - vector<OBJ_KEY> human_obj_keys; | ||
1216 | - | ||
1217 | - pThreadParam->callTaskObjInfoCallbackFunc(pThreadParam->VPTResult[i].objCount, pThreadParam->VPTResult[i].obj, pThreadParam->tasks[*iter].taskFrameCount, *iter); | ||
1218 | - for (int c = 0; c < pThreadParam->VPTResult[i].objCount; c++) | ||
1219 | - { | ||
1220 | - OBJ_KEY newObj = { (*iter), pThreadParam->VPTResult[i].obj[c].id }; | ||
1221 | - | ||
1222 | - int index = 0; | ||
1223 | - if (pThreadParam->m_snaphot_helper.snapShotInfo.find(newObj) == pThreadParam->m_snaphot_helper.snapShotInfo.end()) | ||
1224 | - index = pThreadParam->VPTResult[i].obj[c].index; | ||
1225 | - else | ||
1226 | - index = pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index; | ||
1227 | - | ||
1228 | - //实时查看模块 绘制目标框到画面上 | ||
1229 | - if (view) | ||
1230 | - { | ||
1231 | - //cout << "---- vew ---- "; | ||
1232 | - int p1 = pThreadParam->VPTResult[i].obj[c].left - 10 > 0 ? pThreadParam->VPTResult[i].obj[c].left - 10 : 0; | ||
1233 | - int p2 = pThreadParam->VPTResult[i].obj[c].top - 15 > 0 ? pThreadParam->VPTResult[i].obj[c].top - 15 : 0; | ||
1234 | - | ||
1235 | - cv::rectangle(pThreadParam->tasks[*iter].frameImage, Rect(pThreadParam->VPTResult[i].obj[c].left, pThreadParam->VPTResult[i].obj[c].top, | ||
1236 | - pThreadParam->VPTResult[i].obj[c].right - pThreadParam->VPTResult[i].obj[c].left, | ||
1237 | - pThreadParam->VPTResult[i].obj[c].bottom - pThreadParam->VPTResult[i].obj[c].top), Scalar(158, 52, 254), 3, 1, 0); | ||
1238 | - #ifdef _MSC_VER | ||
1239 | - string resss = "" + to_string(index) + " " + ObjTypes[index]; | ||
1240 | - putTextZH(pThreadParam->tasks[*iter].frameImage, resss.c_str(), { p1, p2 }, Scalar(20, 255, 20), 14, "Arial"); | ||
1241 | - #else | ||
1242 | - string resss = "" + to_string(pThreadParam->VPTResult[i].obj[c].id) + " " + ObjTypesEnglish[pThreadParam->VPTResult[i].obj[c].index]; | ||
1243 | - cv::putText(pThreadParam->tasks[*iter].frameImage, resss.c_str(), cv::Point(p1, p2), cv::FONT_HERSHEY_COMPLEX, 2, Scalar(20, 255, 20), 2, 8, 0); | ||
1244 | - #endif | ||
1245 | - } | ||
1246 | - | ||
1247 | - //逐个目标更新快照 | ||
1248 | - int boundary = 10; | ||
1249 | - int boundaryLittle = 4; | ||
1250 | - | ||
1251 | - int cur_real_width = (pThreadParam->VPTResult[i].obj[c].right - pThreadParam->VPTResult[i].obj[c].left); | ||
1252 | - int cur_real_height = (pThreadParam->VPTResult[i].obj[c].bottom - pThreadParam->VPTResult[i].obj[c].top); | ||
1253 | - int cur_real_index = pThreadParam->VPTResult[i].obj[c].index; | ||
1254 | - | ||
1255 | - //第一次添加快照 | ||
1256 | - if (pThreadParam->m_snaphot_helper.snapShotInfo.find(newObj) == pThreadParam->m_snaphot_helper.snapShotInfo.end()) | ||
1257 | - { | ||
1258 | - //DxAppendLog(DxLOG_INFO, "30"); | ||
1259 | - if (LegalMinArea(cur_real_width, cur_real_height, pThreadParam->tasks[*iter].task_min_boxsize[cur_real_index])) | ||
1260 | - { | ||
1261 | - //DxAppendLog(DxLOG_INFO, "31"); | ||
1262 | - //--------------------- 保存快照视频截图 -----------------------------// | ||
1263 | - | ||
1264 | - int left = max(0, (int)(pThreadParam->VPTResult[i].obj[c].left - boundaryLittle)); | ||
1265 | - int top = max(0, (int)(pThreadParam->VPTResult[i].obj[c].top - boundaryLittle)); | ||
1266 | - int right = min({ frameWidth - 1, (int)(pThreadParam->VPTResult[i].obj[c].right + boundaryLittle) }); | ||
1267 | - int bottom = min({ frameHeight - 1, (int)(pThreadParam->VPTResult[i].obj[c].bottom + boundaryLittle) }); | ||
1268 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].frameCount = pThreadParam->tasks[*iter].taskFrameCount; | ||
1269 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].isupdate = true; | ||
1270 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].lost = 0; | ||
1271 | - | ||
1272 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.count++; | ||
1273 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index = pThreadParam->VPTResult[i].obj[c].index; | ||
1274 | - | ||
1275 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].confidence = pThreadParam->VPTResult[i].obj[c].confidence; | ||
1276 | - | ||
1277 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.left = left; | ||
1278 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.top = top; | ||
1279 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.right = right; | ||
1280 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.bottom = bottom; | ||
1281 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].lastArea = (bottom - top)*(right - left); | ||
1282 | - | ||
1283 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].flags[0] = left < minDistance[0] + SCALE_OUT ? 0 : 1; //left | ||
1284 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].flags[1] = top < minDistance[1] + SCALE_OUT ? 0 : 1; //top | ||
1285 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].flags[2] = right > frameWidth - minDistance[2] - SCALE_OUT ? 0 : 1; //right | ||
1286 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].flags[3] = bottom > frameHeight - minDistance[3] - SCALE_OUT ? 0 : 1; //bottom | ||
1287 | - | ||
1288 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame = NULL; | ||
1289 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShot.frame = NULL; | ||
1290 | - | ||
1291 | - if (pThreadParam->tasks[*iter].folderName != NULL) | ||
1292 | - { | ||
1293 | - //DxAppendLog(DxLOG_INFO, "32"); | ||
1294 | - FRAME_KEY frame_id = { (*iter),pThreadParam->tasks[*iter].taskFrameCount }; | ||
1295 | - pThreadParam->m_snaphot_helper.ImgSaveCache.insert(newObj, frame_id, pThreadParam->tasks[*iter].task_algorithm_data); | ||
1296 | - | ||
1297 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShot.height = frameHeight; | ||
1298 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShot.width = frameWidth; | ||
1299 | - } | ||
1300 | - | ||
1301 | - | ||
1302 | - //--------------------- 保存快照抠图 -----------------------------/ | ||
1303 | - int vLeft = 0; | ||
1304 | - int vTop = 0; | ||
1305 | - int vRight = 0; | ||
1306 | - int vBottom = 0; | ||
1307 | - | ||
1308 | - vLeft = max(0, pThreadParam->VPTResult[i].obj[c].left - boundary); | ||
1309 | - vTop = max(0, pThreadParam->VPTResult[i].obj[c].top - boundary); | ||
1310 | - vRight = min({ frameWidth - 1, pThreadParam->VPTResult[i].obj[c].right + boundary }); | ||
1311 | - vBottom = min({ frameHeight - 1, pThreadParam->VPTResult[i].obj[c].bottom + boundary }); | ||
1312 | - //DxAppendLog(DxLOG_INFO, "34"); | ||
1313 | - if (pThreadParam->tasks[*iter].folderNameLittle != NULL) | ||
1314 | - { | ||
1315 | - //DxAppendLog(DxLOG_INFO, "35"); | ||
1316 | - int cur_width = 0; | ||
1317 | - int cur_height = 0; | ||
1318 | - | ||
1319 | - if (0 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index) | ||
1320 | - { | ||
1321 | - cur_width = HP_WIDTH; | ||
1322 | - cur_height = HP_HEIGHT; | ||
1323 | - | ||
1324 | - human_idx.emplace_back(copy_obj_count); | ||
1325 | - human_obj_keys.emplace_back (newObj); | ||
1326 | - } | ||
1327 | - else if (1 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index || 2 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index) | ||
1328 | - { | ||
1329 | - cur_width = HCP_WIDTH; | ||
1330 | - cur_height = HCP_HEIGHT; | ||
1331 | - } | ||
1332 | - else if (8 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index || (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index >= 4 && pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index <= 6)) | ||
1333 | - { | ||
1334 | - cur_width = VEHICLE_WIDTH; | ||
1335 | - cur_height = VEHICLE_HEIGHT; | ||
1336 | - } | ||
1337 | - else //其余类别 | ||
1338 | - { | ||
1339 | - cur_width = vRight - vLeft; | ||
1340 | - cur_height = vBottom - vTop; | ||
1341 | - } | ||
1342 | - | ||
1343 | - if (cur_width != 0 && cur_height != 0) | ||
1344 | - { | ||
1345 | - cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, IMG_CHANNELS * cur_width * cur_height * sizeof(unsigned char)); | ||
1346 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height = cur_height; | ||
1347 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width = cur_width; | ||
1348 | - | ||
1349 | - snapshot_image_data[copy_obj_count] = (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame; | ||
1350 | - snapshot_left[copy_obj_count] = vLeft; | ||
1351 | - snapshot_top[copy_obj_count] = vTop; | ||
1352 | - snapshot_right[copy_obj_count] = vRight; | ||
1353 | - snapshot_bottom[copy_obj_count] = vBottom; | ||
1354 | - | ||
1355 | - snapshot_dst_width[copy_obj_count] = cur_width; | ||
1356 | - snapshot_dst_height[copy_obj_count++] = cur_height; | ||
1357 | - } | ||
1358 | - } | ||
1359 | - } | ||
1360 | - } | ||
1361 | - else | ||
1362 | - { | ||
1363 | - //DxAppendLog(DxLOG_INFO, "36"); | ||
1364 | - bool updateShotInfo = false; | ||
1365 | - int oldIndex = pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index; | ||
1366 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].frameCount = pThreadParam->tasks[*iter].taskFrameCount; | ||
1367 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].isupdate = true; | ||
1368 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].lost = 0; | ||
1369 | - | ||
1370 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.count == 0) | ||
1371 | - { | ||
1372 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.count++; | ||
1373 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index = pThreadParam->VPTResult[i].obj[c].index; | ||
1374 | - } | ||
1375 | - else | ||
1376 | - { | ||
1377 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index == pThreadParam->VPTResult[i].obj[c].index) | ||
1378 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.count++; | ||
1379 | - else | ||
1380 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.count--; | ||
1381 | - } | ||
1382 | - if (oldIndex != pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index) | ||
1383 | - { | ||
1384 | - updateShotInfo = true; | ||
1385 | - } | ||
1386 | - | ||
1387 | - int left = max(0, (int)(pThreadParam->VPTResult[i].obj[c].left - boundaryLittle)); | ||
1388 | - int top = max(0, (int)(pThreadParam->VPTResult[i].obj[c].top - boundaryLittle)); | ||
1389 | - int right = min(frameWidth - 1, (int)(pThreadParam->VPTResult[i].obj[c].right + boundaryLittle)); | ||
1390 | - int bottom = min(frameHeight - 1, (int)(pThreadParam->VPTResult[i].obj[c].bottom + boundaryLittle)); | ||
1391 | - | ||
1392 | - int maxArea = (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.right - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.left)*(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.bottom - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.top); | ||
1393 | - | ||
1394 | - if ((LegalArea(maxArea, pThreadParam->m_snaphot_helper.snapShotInfo[newObj].lastArea, left, top, right, bottom) | ||
1395 | - && LegalPos(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].flags, left, top, right, bottom, frameHeight, frameWidth) | ||
1396 | - && LegalMinArea(cur_real_width, cur_real_height, pThreadParam->tasks[*iter].task_min_boxsize[cur_real_index])) || updateShotInfo) | ||
1397 | - { | ||
1398 | - //DxAppendLog(DxLOG_INFO, "37"); | ||
1399 | - int boundary_w = (pThreadParam->VPTResult[i].obj[c].right - pThreadParam->VPTResult[i].obj[c].left) * 0.1; | ||
1400 | - int boundary_h = (pThreadParam->VPTResult[i].obj[c].bottom - pThreadParam->VPTResult[i].obj[c].top)* 0.1; | ||
1401 | - | ||
1402 | - int boundary_left = boundary_w, boundary_right = boundary_w, boundary_top = boundary_h, boundary_bottom = boundary_h; | ||
1403 | - | ||
1404 | - ExpandMargin((left - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.left), | ||
1405 | - (bottom - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.bottom), | ||
1406 | - boundary_w, boundary_h, boundary_left, boundary_right, boundary_top, boundary_bottom); | ||
1407 | - | ||
1408 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.left = left; | ||
1409 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.top = top; | ||
1410 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.right = right; | ||
1411 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].box.bottom = bottom; | ||
1412 | - //printf("ori: %d %d %d %d\n", left, top, right - left, bottom - top); | ||
1413 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].confidence = pThreadParam->VPTResult[i].obj[c].confidence; | ||
1414 | - if (pThreadParam->tasks[*iter].folderName != NULL) | ||
1415 | - { | ||
1416 | - FRAME_KEY frame_id = { (*iter),pThreadParam->tasks[*iter].taskFrameCount }; | ||
1417 | - pThreadParam->m_snaphot_helper.ImgSaveCache.insert(newObj, frame_id, pThreadParam->tasks[*iter].task_algorithm_data); | ||
1418 | - } | ||
1419 | - | ||
1420 | - | ||
1421 | - //--------------------- 保存快照抠图 -----------------------------// | ||
1422 | - int vLeft = 0; | ||
1423 | - int vTop = 0; | ||
1424 | - int vRight = 0; | ||
1425 | - int vBottom = 0; | ||
1426 | - | ||
1427 | - vLeft = max(0, pThreadParam->VPTResult[i].obj[c].left - boundary_left); | ||
1428 | - vTop = max(0, pThreadParam->VPTResult[i].obj[c].top - boundary_top); | ||
1429 | - vRight = min(frameWidth - 1, pThreadParam->VPTResult[i].obj[c].right + boundary_right); | ||
1430 | - vBottom = min(frameHeight - 1, pThreadParam->VPTResult[i].obj[c].bottom + boundary_bottom); | ||
1431 | - if (pThreadParam->tasks[*iter].folderNameLittle != NULL) | ||
1432 | - { | ||
1433 | - | ||
1434 | - if (0 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index) | ||
1435 | - { | ||
1436 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width != HP_WIDTH || pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height != HP_HEIGHT) | ||
1437 | - { | ||
1438 | - cudaFree(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame); //释放显存 | ||
1439 | - cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, 3 * HP_WIDTH * HP_HEIGHT * sizeof(unsigned char)); | ||
1440 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width = HP_WIDTH; | ||
1441 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height = HP_HEIGHT; | ||
1442 | - } | ||
1443 | - | ||
1444 | - human_idx.push_back(copy_obj_count); | ||
1445 | - human_obj_keys.emplace_back(newObj); | ||
1446 | - | ||
1447 | - snapshot_image_data[copy_obj_count] = (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame; | ||
1448 | - snapshot_left[copy_obj_count] = vLeft; | ||
1449 | - snapshot_top[copy_obj_count] = vTop; | ||
1450 | - snapshot_right[copy_obj_count] = vRight; | ||
1451 | - snapshot_bottom[copy_obj_count] = vBottom; | ||
1452 | - //printf("crop: %d %d %d %d\n", vLeft, vTop, vRight - vLeft, vBottom - vTop); | ||
1453 | - snapshot_dst_width[copy_obj_count] = HP_WIDTH; | ||
1454 | - snapshot_dst_height[copy_obj_count++] = HP_HEIGHT; | ||
1455 | - | ||
1456 | - } | ||
1457 | - else if (1 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index || 2 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index) | ||
1458 | - { | ||
1459 | - //DxAppendLog(DxLOG_INFO, "42"); | ||
1460 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width != HCP_WIDTH || pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height != HCP_HEIGHT) | ||
1461 | - { | ||
1462 | - //DxAppendLog(DxLOG_INFO, "43"); | ||
1463 | - cudaFree(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame); //释放显存 | ||
1464 | - cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, 3 * HCP_WIDTH * HCP_HEIGHT * sizeof(unsigned char)); | ||
1465 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width = HCP_WIDTH; | ||
1466 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height = HCP_HEIGHT; | ||
1467 | - } | ||
1468 | - | ||
1469 | - snapshot_image_data[copy_obj_count] = (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame; | ||
1470 | - snapshot_left[copy_obj_count] = vLeft; | ||
1471 | - snapshot_top[copy_obj_count] = vTop; | ||
1472 | - snapshot_right[copy_obj_count] = vRight; | ||
1473 | - snapshot_bottom[copy_obj_count] = vBottom; | ||
1474 | - | ||
1475 | - snapshot_dst_width[copy_obj_count] = HCP_WIDTH; | ||
1476 | - snapshot_dst_height[copy_obj_count++] = HCP_HEIGHT; | ||
1477 | - | ||
1478 | - } | ||
1479 | - else if (8 == pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index || (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index >= 4 && pThreadParam->m_snaphot_helper.snapShotInfo[newObj].index.index <= 6)) | ||
1480 | - { | ||
1481 | - //DxAppendLog(DxLOG_INFO, "43.1"); | ||
1482 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width != VEHICLE_WIDTH || pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height != VEHICLE_HEIGHT) | ||
1483 | - { | ||
1484 | - //DxAppendLog(DxLOG_INFO, "44"); | ||
1485 | - cudaFree(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame); //释放显存 | ||
1486 | - cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, 3 * VEHICLE_WIDTH * VEHICLE_HEIGHT * sizeof(unsigned char)); | ||
1487 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width = VEHICLE_WIDTH; | ||
1488 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height = VEHICLE_HEIGHT; | ||
1489 | - } | ||
1490 | - | ||
1491 | - snapshot_image_data[copy_obj_count] = (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame; | ||
1492 | - snapshot_left[copy_obj_count] = vLeft; | ||
1493 | - snapshot_top[copy_obj_count] = vTop; | ||
1494 | - snapshot_right[copy_obj_count] = vRight; | ||
1495 | - snapshot_bottom[copy_obj_count] = vBottom; | ||
1496 | - | ||
1497 | - snapshot_dst_width[copy_obj_count] = VEHICLE_WIDTH; | ||
1498 | - snapshot_dst_height[copy_obj_count++] = VEHICLE_HEIGHT; | ||
1499 | - | ||
1500 | - } | ||
1501 | - else | ||
1502 | - { | ||
1503 | - //DxAppendLog(DxLOG_INFO, "45"); | ||
1504 | - // modified by zsh 220614---------------------------- | ||
1505 | - int cur_width = vRight - vLeft; | ||
1506 | - int cur_height = vBottom - vTop; | ||
1507 | - if (cur_width != 0 && cur_height != 0) { | ||
1508 | - //---------------------------------------- | ||
1509 | - cudaFree(pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame); //释放显存 | ||
1510 | - cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, 3 * (vBottom - vTop)*(vRight - vLeft) * sizeof(unsigned char)); | ||
1511 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.height = vBottom - vTop; | ||
1512 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.width = vRight - vLeft; | ||
1513 | - | ||
1514 | - //printf("begin partMemCopy: %d %d %d %d %d %d\n", vLeft, vTop, vRight, vBottom, frameWidth, frameHeight); | ||
1515 | - partMemCopy((unsigned char*)pThreadParam->tasks[*iter].task_algorithm_data.frame, frameWidth, frameHeight, | ||
1516 | - (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[newObj].snapShotLittle.frame, vLeft, vTop, vRight, vBottom); | ||
1517 | - } | ||
1518 | - } | ||
1519 | - | ||
1520 | - } | ||
1521 | - } | ||
1522 | - pThreadParam->m_snaphot_helper.snapShotInfo[newObj].lastArea = (bottom - top)*(right - left); | ||
1523 | - } | ||
1524 | - | ||
1525 | - } | ||
1526 | - | ||
1527 | - //若待抠图的快照数不为0 则进行批量抠图 | ||
1528 | - if (0 != copy_obj_count) | ||
1529 | - { | ||
1530 | - cudaSetDevice(pThreadParam->mgpuid); | ||
1531 | - PartMemResizeBatch((unsigned char*)pThreadParam->tasks[*iter].task_algorithm_data.frame, frameWidth, frameHeight, | ||
1532 | - snapshot_image_data, copy_obj_count, snapshot_left, snapshot_top, snapshot_right, snapshot_bottom, snapshot_dst_width, snapshot_dst_height, 0, 0, 0, 1, 1, 1); | ||
1533 | - | ||
1534 | - //最新刚添加的人脸检测模块,针对存在的行人快照进行人脸检测+人脸快照框的优选 | ||
1535 | - if (pThreadParam->m_face_det_config == SY_CONFIG_OPEN && !human_idx.empty()) | ||
1536 | - { | ||
1537 | - //需要做人脸检测 | ||
1538 | - int human_count = human_idx.size(); | ||
1539 | - sy_img *human_img = new sy_img[human_count]; | ||
1540 | - | ||
1541 | - sy_point* ori_points = new sy_point[human_count]; | ||
1542 | - for (int idx = 0; idx < human_count; idx++) | ||
1543 | - { | ||
1544 | - int ii = human_idx[idx]; | ||
1545 | - human_img[idx].set_data(snapshot_dst_width[ii], snapshot_dst_height[ii], 3, snapshot_image_data[ii]); | ||
1546 | - ori_points[idx].x_ = (snapshot_right[ii] - snapshot_left[ii]); | ||
1547 | - ori_points[idx].y_ = (snapshot_bottom[ii] - snapshot_top[ii]); | ||
1548 | - } | ||
1549 | - | ||
1550 | - fd_result *face_det_result = new fd_result[human_count]; | ||
1551 | - for (int fd_i = 0; fd_i < human_count; fd_i++) | ||
1552 | - { | ||
1553 | - face_det_result[fd_i].info = new fd_info[10]; //内存由外部申请 | ||
1554 | - } | ||
1555 | - | ||
1556 | - if (pThreadParam->m_face_det_module->face_det_module_process(human_img, human_count, face_det_result, ori_points) == SUCCESS) | ||
1557 | - { | ||
1558 | - //printf("finish face_det_module_process: %d\n", human_count); | ||
1559 | - for (int idx = 0; idx < human_count; idx++) | ||
1560 | - { | ||
1561 | - OBJ_KEY cur_obj_key = human_obj_keys[idx]; | ||
1562 | - fd_result &cur_det_res = face_det_result[idx]; | ||
1563 | - int face_count = cur_det_res.count; | ||
1564 | - int face_idx = 0; | ||
1565 | - int ii = human_idx[idx]; | ||
1566 | - | ||
1567 | - if (face_count == 0) continue; | ||
1568 | - | ||
1569 | - if (face_count > 1) //检测到多余一个人脸 选最佳 | ||
1570 | - { | ||
1571 | - sy_point center_human = { human_img[idx].w_/2, human_img [idx].h_/2}; | ||
1572 | - float min_distance = INT_MAX; | ||
1573 | - | ||
1574 | - for (int c = 0; c < face_count; c++) | ||
1575 | - { | ||
1576 | - sy_point face_center = { cur_det_res.info[c].face_position.width_/2, cur_det_res.info[c].face_position.height_/2}; | ||
1577 | - float distance = fabs(center_human.x_ - face_center.x_) + fabs(center_human.y_ - face_center.y_); | ||
1578 | - | ||
1579 | - if (distance < min_distance) | ||
1580 | - { | ||
1581 | - min_distance = distance; | ||
1582 | - face_idx = c; | ||
1583 | - } | ||
1584 | - } | ||
1585 | - } | ||
1586 | - | ||
1587 | - fd_info& cur_det_info = cur_det_res.info[face_idx]; | ||
1588 | - if (pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame == nullptr) | ||
1589 | - { | ||
1590 | - sy_rect face_ori_rect = { (int)(snapshot_left[ii] + cur_det_info.face_position.left_ ), | ||
1591 | - (int)(snapshot_top[ii] + cur_det_info.face_position.top_), | ||
1592 | - (int)(cur_det_info.face_position.width_), (int)(cur_det_info.face_position.height_) }; | ||
1593 | - | ||
1594 | - int new_left = max(0, face_ori_rect.left_ - face_ori_rect.width_); | ||
1595 | - int new_top = max(0, face_ori_rect.top_ - face_ori_rect.height_); | ||
1596 | - int new_right = min((int)pThreadParam->tasks[*iter].task_algorithm_data.width - 1, (face_ori_rect.left_ + 2 * face_ori_rect.width_)); | ||
1597 | - int new_bottom = min((int)pThreadParam->tasks[*iter].task_algorithm_data.height - 1, (face_ori_rect.top_ + 2 * face_ori_rect.height_)); | ||
1598 | - int new_width = new_right - new_left; | ||
1599 | - int new_height = new_bottom - new_top; | ||
1600 | - | ||
1601 | - sy_rect face_expand_rect = { new_left, new_top, new_width, new_height }; | ||
1602 | - | ||
1603 | - int face_img_length = 3 * face_expand_rect.width_ * face_expand_rect.height_; | ||
1604 | - | ||
1605 | - cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame, face_img_length * sizeof(unsigned char)); | ||
1606 | - if (cudaStatus != cudaSuccess) { | ||
1607 | - fprintf(stderr, "here cudaMalloc frame[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | ||
1608 | - break; | ||
1609 | - } | ||
1610 | - | ||
1611 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.width = face_expand_rect.width_; | ||
1612 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.height = face_expand_rect.height_; | ||
1613 | - memcpy((void*)&pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info, (void*)&cur_det_info, sizeof(fd_info)); | ||
1614 | - | ||
1615 | - //矫正坐标 从行人抠图检测结果 -> 人脸外扩抠图坐标 | ||
1616 | - fd_info& tmp_info = pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info; | ||
1617 | - | ||
1618 | - for (int p = 0; p < FACIALFEAPOINTSIZE; p++) | ||
1619 | - { | ||
1620 | - tmp_info.facial_fea_point[p].x_ = | ||
1621 | - tmp_info.facial_fea_point[p].x_ - tmp_info.face_position.left_ + (face_ori_rect.left_ - face_expand_rect.left_); | ||
1622 | - tmp_info.facial_fea_point[p].y_ = | ||
1623 | - tmp_info.facial_fea_point[p].y_ - tmp_info.face_position.top_ + (face_ori_rect.top_ - face_expand_rect.top_); | ||
1624 | - } | ||
1625 | - | ||
1626 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info.face_position = | ||
1627 | - { (face_ori_rect.left_ - face_expand_rect.left_), (face_ori_rect.top_ - face_expand_rect.top_), face_ori_rect.width_, face_ori_rect.height_ }; | ||
1628 | - | ||
1629 | - | ||
1630 | - cudacommon::CropImgGpu((unsigned char*)pThreadParam->tasks[*iter].task_algorithm_data.frame, pThreadParam->tasks[*iter].task_algorithm_data.width, pThreadParam->tasks[*iter].task_algorithm_data.height, | ||
1631 | - (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame, face_expand_rect.left_, face_expand_rect.top_, face_expand_rect.width_, face_expand_rect.height_); | ||
1632 | - | ||
1633 | - //show_gpu_img_func(pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace); | ||
1634 | - } | ||
1635 | - else | ||
1636 | - { | ||
1637 | - sy_rect face_ori_rect = { (int)(snapshot_left[ii] + cur_det_info.face_position.left_), | ||
1638 | - (int)(snapshot_top[ii] + cur_det_info.face_position.top_), | ||
1639 | - (int)(cur_det_info.face_position.width_), (int)(cur_det_info.face_position.height_) }; | ||
1640 | - | ||
1641 | - //更新人脸快照条件:① 角度满足条件 ② 面积比之前人脸面积大 | ||
1642 | - if (validAngle(cur_det_res.info[face_idx].roll, cur_det_res.info[face_idx].yaw, cur_det_res.info[face_idx].pitch, 15.0, 20.0) | ||
1643 | - && betterArea(face_ori_rect, pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info.face_position)) | ||
1644 | - { | ||
1645 | - int new_left = max(0, face_ori_rect.left_ - face_ori_rect.width_); | ||
1646 | - int new_top = max(0, face_ori_rect.top_ - face_ori_rect.height_); | ||
1647 | - int new_right = min((int)pThreadParam->tasks[*iter].task_algorithm_data.width - 1, (face_ori_rect.left_ + 2 * face_ori_rect.width_)); | ||
1648 | - int new_bottom = min((int)pThreadParam->tasks[*iter].task_algorithm_data.height - 1, (face_ori_rect.top_ + 2 * face_ori_rect.height_)); | ||
1649 | - int new_width = new_right - new_left; | ||
1650 | - int new_height = new_bottom - new_top; | ||
1651 | - | ||
1652 | - sy_rect face_expand_rect = { new_left, new_top, new_width, new_height }; | ||
1653 | - | ||
1654 | - //更新快照 | ||
1655 | - int face_img_length = 3 * face_expand_rect.width_ * face_expand_rect.height_; | ||
1656 | - | ||
1657 | - cudaFree(pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame); | ||
1658 | - cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame, face_img_length * sizeof(unsigned char)); | ||
1659 | - if (cudaStatus != cudaSuccess) { | ||
1660 | - fprintf(stderr, "here cudaMalloc frame[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | ||
1661 | - break; | ||
1662 | - } | ||
1663 | - | ||
1664 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.width = face_expand_rect.width_; | ||
1665 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.height = face_expand_rect.height_; | ||
1666 | - memcpy((void*)&pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info, (void*)&cur_det_info, sizeof(fd_info)); | ||
1667 | - | ||
1668 | - //矫正坐标 从行人抠图检测结果 -> 人脸外扩抠图坐标 | ||
1669 | - fd_info& tmp_info = pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info; | ||
1670 | - | ||
1671 | - for (int p = 0; p < FACIALFEAPOINTSIZE; p++) | ||
1672 | - { | ||
1673 | - tmp_info.facial_fea_point[p].x_ = | ||
1674 | - tmp_info.facial_fea_point[p].x_ - tmp_info.face_position.left_ + (face_ori_rect.left_ - face_expand_rect.left_); | ||
1675 | - tmp_info.facial_fea_point[p].y_ = | ||
1676 | - tmp_info.facial_fea_point[p].y_ - tmp_info.face_position.top_ + (face_ori_rect.top_ - face_expand_rect.top_); | ||
1677 | - } | ||
1678 | - | ||
1679 | - pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info.face_position = | ||
1680 | - {(face_ori_rect.left_ - face_expand_rect.left_), (face_ori_rect.top_ - face_expand_rect.top_), face_ori_rect.width_, face_ori_rect.height_}; | ||
1681 | - | ||
1682 | - cudacommon::CropImgGpu((unsigned char*)pThreadParam->tasks[*iter].task_algorithm_data.frame, pThreadParam->tasks[*iter].task_algorithm_data.width, pThreadParam->tasks[*iter].task_algorithm_data.height, | ||
1683 | - (unsigned char*)pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace.frame, face_expand_rect.left_, face_expand_rect.top_, face_expand_rect.width_, face_expand_rect.height_); | ||
1684 | - | ||
1685 | - //show_gpu_image_withfdinfo_(pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace, cur_det_info); | ||
1686 | - | ||
1687 | - //show_gpu_image_withfdinfo_(pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].snapShotFace, pThreadParam->m_snaphot_helper.snapShotInfo[cur_obj_key].face_info); | ||
1688 | - } | ||
1689 | - } | ||
1690 | - } | ||
1691 | - } | ||
1692 | - | ||
1693 | - if (face_det_result) | ||
1694 | - { | ||
1695 | - for (int fd_i = 0; fd_i < human_count; fd_i++) | ||
1696 | - delete[] face_det_result[fd_i].info; | ||
1697 | - delete face_det_result; | ||
1698 | - } | ||
1699 | - | ||
1700 | - if (human_img) delete[] human_img; | ||
1701 | - if (ori_points) delete[] ori_points; | ||
1702 | - } | ||
1703 | - } | ||
1704 | - | ||
1705 | - //实时查看 绘制目标轨迹 回调函数返回 | ||
1706 | - if (view) | ||
1707 | - { | ||
1708 | - DrawTracker(pThreadParam->VPT_Handle, *iter, &pThreadParam->tasks[*iter].frameImage); | ||
1709 | - if (pThreadParam->tasks[*iter].taskRealTimeCallbackFunc != nullptr) | ||
1710 | - pThreadParam->tasks[*iter].taskRealTimeCallbackFunc(pThreadParam->tasks[*iter].frameImage.data, pThreadParam->tasks[*iter].frameImage.rows, pThreadParam->tasks[*iter].frameImage.cols); | ||
1711 | - } | ||
1712 | - // pThreadParam->tasks[*iter].taskFrameCount += pThreadParam->skip_frame_; | ||
1713 | - iter++; | ||
1714 | - } | ||
1715 | - | ||
1716 | -#ifdef LOG_INFO2 | ||
1717 | - long long result_analysis_time2 = get_cur_time_ms(); | ||
1718 | - cout << "result_analysis time_using:" << result_analysis_time2 - result_analysis_time << endl; | ||
1719 | -#endif | ||
1720 | - | ||
1721 | - | ||
1722 | - auto task_iter = pThreadParam->TaskinPlayID.begin(); | ||
1723 | - | ||
1724 | - pThreadParam->AttributionAnalysis = false; | ||
1725 | - | ||
1726 | - long long second_analysis_time = get_cur_time_ms(); | ||
1727 | - | ||
1728 | - for (int i = 0; i < curPlayTaskCount; i++) | ||
1729 | - { | ||
1730 | - for (int j = 0; j < deleteObjectID[i].size(); j++) | ||
1731 | - { | ||
1732 | - OBJ_KEY deleteObj = { *task_iter, deleteObjectID[i][j] }; | ||
1733 | - | ||
1734 | - if (pThreadParam->m_snaphot_helper.snapShotInfo.find(deleteObj) == pThreadParam->m_snaphot_helper.snapShotInfo.end()) | ||
1735 | - continue; | ||
1736 | - | ||
1737 | - auto iter = pThreadParam->m_snaphot_helper.snapShotInfo.find(deleteObj); | ||
1738 | - iter->second.finishTracker = true; | ||
1739 | - | ||
1740 | - pThreadParam->SaveResultInFile(iter->first, iter->second); | ||
1741 | - } | ||
1742 | - | ||
1743 | - task_iter++; | ||
1744 | - } | ||
1745 | - | ||
1746 | - for (int i = 0; i < deleteObjectID.size(); i++) | ||
1747 | - vector<int>().swap(deleteObjectID[i]); | ||
1748 | - vector<vector<int>>().swap(deleteObjectID); | ||
1749 | - | ||
1750 | - // pThreadParam->m_snaphot_helper.object_attri_analysis(); | ||
1751 | - | ||
1752 | -#ifdef LOG_INFO2 | ||
1753 | - long long second_analysis_time2 = get_cur_time_ms(); | ||
1754 | - cout << "second_analysis time_using:" << second_analysis_time2 - second_analysis_time << endl; | ||
1755 | -#endif | ||
1756 | - | ||
1757 | - cudaError_t cudaStatus = cudaGetLastError(); | ||
1758 | - if (cudaStatus != cudaSuccess) { | ||
1759 | - printf("object_attri_analysis last error: %s\n", cudaGetErrorString(cudaStatus)); | ||
1760 | - } | ||
1761 | - | ||
1762 | - boost::this_thread::sleep(boost::posix_time::milliseconds(1)); | ||
1763 | - | ||
1764 | - ++total_count; | ||
1765 | - ++ncount; | ||
1766 | - | ||
1767 | -#ifdef LOG_INFO2 | ||
1768 | - last_time = get_cur_time_ms(); | ||
1769 | - cout << "process time_using:" << last_time - gather_data_time << endl; | ||
1770 | - cout << endl; | ||
1771 | -#endif | ||
1772 | - } | ||
1773 | - } | ||
1774 | - //catch (exception &e) | ||
1775 | - { | ||
1776 | - //os << 51 << e.what()<< std::endl; | ||
1777 | - /* std::cout << e.what() << std::endl; | ||
1778 | - exit(-1);*/ | ||
1779 | - } | ||
1780 | - long long costTime1 = get_cur_time_ms() - begintime1; | ||
1781 | - std::cout << "==================== Process Thread is Finished: " << std::endl; | ||
1782 | - printf("total frame cost time = %lld us, process times: %d \n", costTime1, process_times); | ||
1783 | - | ||
1784 | - pThreadParam->m_snaphot_helper.snapShotInfo.clear(); | ||
1785 | - pThreadParam->ProcessFlag = false; | ||
1786 | - | ||
1787 | - // printf("1499 set ProcessFlag false\n"); | ||
1788 | - // if (pThreadParam->FrameTemp) | ||
1789 | - // { | ||
1790 | - // cudaFree(pThreadParam->FrameTemp); | ||
1791 | - // } | ||
1792 | - | ||
1793 | - if (batch_img != NULL) | ||
1794 | - { | ||
1795 | - delete[] batch_img; | ||
1796 | - batch_img = NULL; | ||
1797 | - } | ||
1798 | - | ||
1799 | - // cuCtxPopCurrent(nullptr); | ||
1800 | - // cuCtxDestroy(context); | ||
1801 | - | ||
1802 | - return 0; | ||
1803 | -} | ||
1804 | - | ||
1805 | -int CMutliSourceVideoProcess::GetRuningNb() { | ||
1806 | - int no = 0; | ||
1807 | - for(int i=0; i < tasks.size(); i++){ | ||
1808 | - if(tasks[i].taskState == PLAY){ | ||
1809 | - no ++; | ||
1810 | - } | ||
1811 | - } | ||
1812 | - | ||
1813 | - return no; | ||
1814 | -} | ||
1815 | - | ||
1816 | -#ifdef AUTHORIZATION | ||
1817 | -void check_thread(void* handle) | ||
1818 | -{ | ||
1819 | - int res = -1; | ||
1820 | -#ifndef _MSC_VER | ||
1821 | - char wtime[15]; | ||
1822 | - memset(wtime, 0, 15); | ||
1823 | - char * time = wtime; | ||
1824 | -#endif | ||
1825 | - | ||
1826 | - CMutliSourceVideoProcess *pThreadParam = (CMutliSourceVideoProcess *)handle; | ||
1827 | - | ||
1828 | - while (1) | ||
1829 | - { | ||
1830 | - //printf("xxx check status on process...\n"); | ||
1831 | -#ifdef _MSC_VER | ||
1832 | - res = sy_licence(productSN); | ||
1833 | -#else | ||
1834 | - res = sy_licence(productSN, &time); | ||
1835 | - //printf("--------------wtime in thread: %s, status: %d\n", wtime, licence_status); | ||
1836 | -#endif | ||
1837 | - if (res < 0) | ||
1838 | - { | ||
1839 | - pThreadParam->licence_status = pThreadParam->licence_status - 1; | ||
1840 | - } | ||
1841 | - else | ||
1842 | - { | ||
1843 | - if (pThreadParam->licence_status < 0) | ||
1844 | - { | ||
1845 | - pThreadParam->licence_status = 0; | ||
1846 | - } | ||
1847 | - } | ||
1848 | - boost::this_thread::sleep(boost::posix_time::seconds(300)); //5min | ||
1849 | - } | ||
1850 | -} | ||
1851 | -#endif | ||
1852 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.h
@@ -13,12 +13,10 @@ | @@ -13,12 +13,10 @@ | ||
13 | #include "VPTProcess.h" | 13 | #include "VPTProcess.h" |
14 | #include <queue> | 14 | #include <queue> |
15 | #include <set> | 15 | #include <set> |
16 | -#include <boost/thread/thread.hpp> | ||
17 | #include "common.h" | 16 | #include "common.h" |
18 | #include "../FFNvDecoder/ImageSaveGPU.h" | 17 | #include "../FFNvDecoder/ImageSaveGPU.h" |
19 | 18 | ||
20 | #include "mvpt_process_assist.h" | 19 | #include "mvpt_process_assist.h" |
21 | -#include <boost/thread/thread_pool.hpp> | ||
22 | #include "snapshot_helper.h" | 20 | #include "snapshot_helper.h" |
23 | #include "FaceDetModule.h" | 21 | #include "FaceDetModule.h" |
24 | 22 | ||
@@ -235,7 +233,7 @@ public: | @@ -235,7 +233,7 @@ public: | ||
235 | private: | 233 | private: |
236 | //bool ChangeTask; | 234 | //bool ChangeTask; |
237 | //HANDLE handle_process; | 235 | //HANDLE handle_process; |
238 | - boost::thread ProcessThread; | 236 | + std::thread ProcessThread; |
239 | std::mutex _tx_add_task; | 237 | std::mutex _tx_add_task; |
240 | 238 | ||
241 | 239 | ||
@@ -246,7 +244,7 @@ private: | @@ -246,7 +244,7 @@ private: | ||
246 | //cv::Mat objSnapshot; | 244 | //cv::Mat objSnapshot; |
247 | 245 | ||
248 | double gpu_total_memory; | 246 | double gpu_total_memory; |
249 | - boost::thread thrd; | 247 | + std::thread thrd; |
250 | void* authority_handle; | 248 | void* authority_handle; |
251 | 249 | ||
252 | public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷锟竭程猴拷锟斤拷锟叫伙拷锟矫碉拷锟斤拷锟铰碉拷锟斤拷锟斤拷 每锟斤拷锟斤拷写一锟斤拷get锟斤拷锟斤拷太锟斤拷锟斤拷锟斤拷*/ | 250 | public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷锟竭程猴拷锟斤拷锟叫伙拷锟矫碉拷锟斤拷锟铰碉拷锟斤拷锟斤拷 每锟斤拷锟斤拷写一锟斤拷get锟斤拷锟斤拷太锟斤拷锟斤拷锟斤拷*/ |
@@ -282,14 +280,7 @@ public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷 | @@ -282,14 +280,7 @@ public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷 | ||
282 | 280 | ||
283 | queue<SNAPSHOT_PROCESS_UNIT> snapshotProcessQueue; | 281 | queue<SNAPSHOT_PROCESS_UNIT> snapshotProcessQueue; |
284 | 282 | ||
285 | - //CUcontext cuCtx; | ||
286 | - //int PROCESSHEIGHT; | ||
287 | - //int PROCESSWIDTH; | ||
288 | - //int DATASIZE; | ||
289 | 283 | ||
290 | - bool beginSaveSnapshot; | ||
291 | - boost::thread_group saveSnapshotsThreadGroup; | ||
292 | - //boost::mutex process_thread_mutex; | ||
293 | std::mutex taskMutex; | 284 | std::mutex taskMutex; |
294 | std::condition_variable taskCondVar; | 285 | std::condition_variable taskCondVar; |
295 | bool AttributionAnalysis; //锟斤拷锟节匡拷锟狡o拷每帧锟斤拷锟斤拷只锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟皆凤拷锟斤拷 | 286 | bool AttributionAnalysis; //锟斤拷锟节匡拷锟狡o拷每帧锟斤拷锟斤拷只锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟皆凤拷锟斤拷 |
@@ -305,6 +296,9 @@ public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷 | @@ -305,6 +296,9 @@ public: /*锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷public锟斤拷 锟斤拷锟斤拷锟斤拷 | ||
305 | sy_command m_vcf_recg_config; //锟角凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷识锟斤拷 | 296 | sy_command m_vcf_recg_config; //锟角凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷识锟斤拷 |
306 | sy_command m_face_det_config; //锟角凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟 | 297 | sy_command m_face_det_config; //锟角凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟 |
307 | snapshot_helper m_snaphot_helper; | 298 | snapshot_helper m_snaphot_helper; |
299 | + | ||
300 | + bool m_bExit{false}; | ||
301 | + bool m_bProcessExit{false}; | ||
308 | }; | 302 | }; |
309 | 303 | ||
310 | static CMutliSourceVideoProcess mainProcess; | 304 | static CMutliSourceVideoProcess mainProcess; |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/VPTProcess.cppbk deleted
1 | -#include "VPTProcess.h" | ||
2 | - | ||
3 | -#ifndef _MSC_VER | ||
4 | -#include <sys/time.h> | ||
5 | -#endif | ||
6 | - | ||
7 | -#include <stdlib.h> | ||
8 | -#include <cuda_runtime.h> | ||
9 | -#include "ObjCls.h" | ||
10 | -#include <time.h> | ||
11 | -#include "ErrorInfo.h" | ||
12 | -#include "fstream" | ||
13 | -#include <boost/thread/thread.hpp> | ||
14 | -//#include "mobileshift0.6_mergeBNALL.h" | ||
15 | -//#include "ga_mobile_10_SSD10_416x224_416x224_mobile_shift2_mindim06_iter_46107_mergeBNALL.h" | ||
16 | - | ||
17 | -//#include "test_mergeBNALLGPU.h" | ||
18 | -//#include "ga_mobile_10cls_SSD_512x512_mobile_10clsv1_iter_200000_mergeBNALL.h" | ||
19 | - | ||
20 | -#include "../model/vptModeTrt/ga_vpt_init_net.h" | ||
21 | -#include "../model/vptModeTrt/ga_vpt_predict_net.h" | ||
22 | -#include "../model/vptModeTrt/ga_trt_fpn_vpt_calibrator.h" | ||
23 | -#include "../model/hidemodel_caffe_1108/ga_vpt_init_net_caffe2.h" | ||
24 | -#include "../model/hidemodel_caffe_1108/ga_vpt_predict_net_caffe2.h" | ||
25 | -#include "vpt_fpn_plugin_factory.h" | ||
26 | -//#include "vpt.h" | ||
27 | -#include "MutliSourceVideoProcess.h" | ||
28 | -//struct vpt_handle | ||
29 | -//{ | ||
30 | -// void* det_handle; | ||
31 | -// vector<TaskTracker> taskTrackers; | ||
32 | -//}; | ||
33 | - | ||
34 | -typedef struct objDetector { | ||
35 | - | ||
36 | - void* det_handle; | ||
37 | - float threshold; | ||
38 | - VPT_FPNPluginFactory tensorrt_plugin_factory; | ||
39 | - | ||
40 | - int licence_status = -1;//鎺堟潈鐩稿叧鍙傛暟 | ||
41 | - int thrd_status = -1; //鎺堟潈鐩稿叧鍙傛暟 | ||
42 | - boost::thread thrd; //鎺堟潈鐩稿叧鍙傛暟 | ||
43 | - vector<TaskTracker> taskTrackers; | ||
44 | - objDetector() | ||
45 | - { | ||
46 | - det_handle = NULL; | ||
47 | - threshold = 0.6; | ||
48 | - } | ||
49 | -}objDetector; | ||
50 | - | ||
51 | - | ||
52 | -//int VPT_Init(void *&handle, VPTProcess_PARAM param) | ||
53 | -//{ | ||
54 | -// int ret = SUCCESS; | ||
55 | -////#ifdef AUTHORIZATION | ||
56 | -////#ifdef _WIN32 | ||
57 | -//// if (SUCCESS == (ret = sy_licence(productSN))) | ||
58 | -////#elif __linux__ | ||
59 | -//// char* wtime = new char[15]; | ||
60 | -//// memset(wtime, 0, 15); | ||
61 | -//// if (SUCCESS == (ret = sy_licence(productSN, &wtime))) | ||
62 | -////#endif | ||
63 | -////#else | ||
64 | -//// ret = sy_time_check(2021, 4); | ||
65 | -//// if (ret == SUCCESS) | ||
66 | -////#endif | ||
67 | -//// { | ||
68 | -//// cuInit(0); | ||
69 | -//// int device_count = 0; | ||
70 | -//// cuDeviceGetCount(&device_count); | ||
71 | -//// | ||
72 | -//// if (param.gpuid >= device_count) | ||
73 | -//// { | ||
74 | -//// printf("\nGPU_ID PARAM WRONG!\n"); | ||
75 | -//// return GPUID_PARAM_ERROR; | ||
76 | -//// } | ||
77 | -// | ||
78 | -// objDetector * tools = new objDetector; | ||
79 | -// | ||
80 | -// ctools_init_params vpt_param; | ||
81 | -// vpt_param.thres_ = param.threshold; | ||
82 | -// vpt_param.log_level_ = 0; | ||
83 | -// vpt_param.device_type_ = param.mode; | ||
84 | -// vpt_param.device_id_ = param.gpuid; | ||
85 | -// vpt_param.engine_type_ = param.engine; | ||
86 | -// vpt_param.model_type_ = MODEL_FPN; | ||
87 | -// | ||
88 | -//#ifdef _MSC_VER | ||
89 | -// vpt_param.weight_file_ = NULL; | ||
90 | -// vpt_param.net_file_ = NULL; | ||
91 | -//#else | ||
92 | -// vpt_param.weight_file_ = NULL; | ||
93 | -// vpt_param.net_file_ = NULL; | ||
94 | -//#endif | ||
95 | -// | ||
96 | -// | ||
97 | -// vpt_param.data_process_str_ = param.preprocess_param; | ||
98 | -// vpt_param.need_im_info_ = 1; // true | ||
99 | -// | ||
100 | -// if (vpt_param.engine_type_ == ENGINE_MCAFFE2) | ||
101 | -// { | ||
102 | -// //caffe2妯″瀷棰勫鐞嗗弬鏁? | ||
103 | -// vpt_param.data_process_str_ = | ||
104 | -// "CopyData_CPU2GPU_U8;" | ||
105 | -// "TypeConvert_U8_F32;" | ||
106 | -// "ResizePad_F32_F32,test_size,720,test_max_size,1280,fpn_coarsest_stride,32," | ||
107 | -// "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
108 | -// "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
109 | -// "NHWC2NCHW_F32" | ||
110 | -// ; | ||
111 | -// | ||
112 | -// vpt_param.weight_array_ = (unsigned char*)ga_vpt_init_net_caffe2; | ||
113 | -// vpt_param.weight_array_len_ = ga_vpt_init_net_len_caffe2; | ||
114 | -// vpt_param.net_array_ = (unsigned char*)ga_vpt_predict_net_caffe2; | ||
115 | -// vpt_param.net_array_len_ = ga_vpt_predict_net_len_caffe2; | ||
116 | -// } | ||
117 | -// else if (vpt_param.engine_type_ == ENGINE_TENSORRT) | ||
118 | -// { | ||
119 | -// vpt_param.weight_array_ = (uint8_t*)ga_vpt_init_net; | ||
120 | -// vpt_param.weight_array_len_ = ga_vpt_init_net_len; | ||
121 | -// vpt_param.net_array_ = (uint8_t*)ga_vpt_predict_net; | ||
122 | -// vpt_param.net_array_len_ = ga_vpt_predict_net_len; | ||
123 | -// | ||
124 | -// vpt_param.trt_serialize_file_ = param.serialize_file;// NULL;// "FPN_VPT_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||
125 | -// | ||
126 | -// //trt鐗堟湰棰勫鐞嗗弬鏁? | ||
127 | -// param.preprocess_param = | ||
128 | -// "CopyData_CPU2GPU_U8;" | ||
129 | -// "TypeConvert_U8_F32;" | ||
130 | -// "ResizeMaxPad_F32_F32,test_size,720,test_max_size,1280,max_height,736,max_width,1280," | ||
131 | -// "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
132 | -// "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
133 | -// "NHWC2NCHW_F32" | ||
134 | -// ; | ||
135 | -// | ||
136 | -// memset(vpt_param.tensorrt_param_str_, 0, sizeof(vpt_param.tensorrt_param_str_)); | ||
137 | -// | ||
138 | -// int batch_size = param.max_batch; | ||
139 | -// std::string g_data_mode = "FP32"; | ||
140 | -// bool g_is_create_calibrator = false; | ||
141 | -// | ||
142 | -// sprintf(vpt_param.tensorrt_param_str_, "max_batchsize %d," | ||
143 | -// "data_mode %s," | ||
144 | -// "is_create_calibrator %d," | ||
145 | -// "input_names data im_info," | ||
146 | -// "output_names cls_prob bbox_pred_final rois_count_each_img", | ||
147 | -// batch_size, g_data_mode.c_str(), g_is_create_calibrator); | ||
148 | -// | ||
149 | -// vpt_param.tensorrt_calibrator_file_ = NULL;// "trt_fpn_vpt_calibrator"; | ||
150 | -// vpt_param.tensorrt_calibrator_array_len_ = ga_trt_fpn_vpt_calibrator_len;// "trt_fpn_vpt_calibrator"; | ||
151 | -// vpt_param.tensorrt_calibrator_array_ = (unsigned char*)ga_trt_fpn_vpt_calibrator;// "trt_fpn_vpt_calibrator"; | ||
152 | -// | ||
153 | -// vpt_param.tensorrt_plugin_factory_ptr_ = &(tools->tensorrt_plugin_factory); | ||
154 | -// } | ||
155 | -// | ||
156 | -// tools->threshold = param.threshold; | ||
157 | -// | ||
158 | -// int flag = ctools_init(&tools->det_handle, &vpt_param); | ||
159 | -// | ||
160 | -// if (SUCCESS != flag) | ||
161 | -// { | ||
162 | -// printf("VPT_Init(ERROR): Init failed\n"); | ||
163 | -// handle = NULL; | ||
164 | -// } | ||
165 | -// else | ||
166 | -// handle = (void*)tools; | ||
167 | -// | ||
168 | -// return flag; | ||
169 | -//// } | ||
170 | -//// else | ||
171 | -//// { | ||
172 | -//// return AUTHOR_ERROR; | ||
173 | -//// } | ||
174 | -////#ifdef AUTHORIZATION | ||
175 | -////#ifdef __linux__ | ||
176 | -//// if (wtime) | ||
177 | -//// { | ||
178 | -//// delete[] wtime; | ||
179 | -//// wtime = NULL; | ||
180 | -//// } | ||
181 | -////#endif | ||
182 | -////#endif | ||
183 | -//} | ||
184 | - | ||
185 | - | ||
186 | -int VPT_Init(void *&handle, VPTProcess_PARAM vparam) | ||
187 | -{ | ||
188 | - objDetector *tools = new objDetector; | ||
189 | - | ||
190 | - | ||
191 | - ctools_init_params param; | ||
192 | - param.thres_ = vparam.threshold; | ||
193 | - param.log_level_ = 0; | ||
194 | - param.device_type_ = vparam.mode; | ||
195 | - param.device_id_ = vparam.gpuid; | ||
196 | - param.engine_type_ = vparam.engine; | ||
197 | - param.model_type_ = MODEL_FPN; | ||
198 | - | ||
199 | - param.weight_array_ = (uint8_t*)ga_vpt_init_net; | ||
200 | - param.weight_array_len_ = ga_vpt_init_net_len; | ||
201 | - param.net_array_ = (uint8_t*)ga_vpt_predict_net; | ||
202 | - param.net_array_len_ = ga_vpt_predict_net_len; | ||
203 | - | ||
204 | - param.trt_serialize_file_ = vparam.serialize_file;// NULL;// "FPN_VPT_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||
205 | - | ||
206 | - //trt鐗堟湰棰勫鐞嗗弬鏁? | ||
207 | - | ||
208 | - | ||
209 | - memset(param.tensorrt_param_str_, 0, sizeof(param.tensorrt_param_str_)); | ||
210 | - | ||
211 | - int batch_size = vparam.max_batch; | ||
212 | - std::string g_data_mode = "INT8"; | ||
213 | - bool g_is_create_calibrator = false; | ||
214 | - | ||
215 | - sprintf(param.tensorrt_param_str_, "max_batchsize %d," | ||
216 | - "data_mode %s," | ||
217 | - "is_create_calibrator %d," | ||
218 | - "input_names data im_info," | ||
219 | - "output_names cls_prob bbox_pred_final rois_count_each_img", | ||
220 | - batch_size, g_data_mode.c_str(), g_is_create_calibrator); | ||
221 | - | ||
222 | - param.tensorrt_calibrator_file_ = NULL;// "trt_fpn_vpt_calibrator"; | ||
223 | - param.tensorrt_calibrator_array_len_ = ga_trt_fpn_vpt_calibrator_len;// "trt_fpn_vpt_calibrator"; | ||
224 | - param.tensorrt_calibrator_array_ = (unsigned char*)ga_trt_fpn_vpt_calibrator;// "trt_fpn_vpt_calibrator"; | ||
225 | - | ||
226 | - param.tensorrt_plugin_factory_ptr_ = &(tools->tensorrt_plugin_factory); | ||
227 | - | ||
228 | - | ||
229 | - //param.data_process_str_ = | ||
230 | - // "TypeConvert_U8_F32;" | ||
231 | - // "ResizePad_F32_F32,test_size,540,test_max_size,1280,fpn_coarsest_stride,32," | ||
232 | - // "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
233 | - // "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
234 | - // "NHWC2NCHW_F32" | ||
235 | - // ; | ||
236 | - | ||
237 | - param.data_process_str_ = | ||
238 | - //"CopyData_CPU2GPU_U8;" | ||
239 | - "TypeConvert_U8_F32;" | ||
240 | - "ResizeMaxPad_F32_F32,test_size,720,test_max_size,1280,max_height,736,max_width,1280," | ||
241 | - "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
242 | - "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
243 | - "NHWC2NCHW_F32" | ||
244 | - ; | ||
245 | - /* | ||
246 | - param.data_process_str_ = | ||
247 | - "CopyData_CPU2GPU_U8;" | ||
248 | - "TypeConvert_U8_F32;" | ||
249 | - "ResizePad_F32_F32,test_size,720,test_max_size,1280,fpn_coarsest_stride,32," | ||
250 | - "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
251 | - "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
252 | - "NHWC2NCHW_F32" | ||
253 | - ; | ||
254 | - */ | ||
255 | - | ||
256 | - int flag = ctools_init(&(tools->det_handle), ¶m); | ||
257 | - if (SUCCESS != flag) | ||
258 | - { | ||
259 | - if (tools) | ||
260 | - { | ||
261 | - delete tools; | ||
262 | - tools = NULL; | ||
263 | - } | ||
264 | - } | ||
265 | - else | ||
266 | - { | ||
267 | - handle = tools; | ||
268 | - } | ||
269 | - return flag; | ||
270 | -} | ||
271 | - | ||
272 | - | ||
273 | -void tmp_test(void * handle) | ||
274 | -{ | ||
275 | - objDetector *tools = (objDetector*)handle; | ||
276 | - | ||
277 | -const int batchsize = 5; | ||
278 | - sy_img images[batchsize]; | ||
279 | - cv::Mat img[batchsize]; | ||
280 | - | ||
281 | - char strpath[1024]; | ||
282 | - memset(strpath, 0, sizeof(strpath)); | ||
283 | - for (int b = 0; b < batchsize; b++) | ||
284 | - { | ||
285 | -#ifdef _MSC_VER | ||
286 | - sprintf(strpath, "../../../data/%d.jpg", b);// b); | ||
287 | -#else | ||
288 | - sprintf(strpath, "0.jpg", b); | ||
289 | - | ||
290 | -#endif | ||
291 | - | ||
292 | - img[b] = cv::imread(strpath); | ||
293 | - images[b].set_data(img[b].cols, img[b].rows, img[b].channels(), img[b].data); | ||
294 | - } | ||
295 | - | ||
296 | - | ||
297 | - //vpt_batch(handle, images, batchsize, &result); | ||
298 | - | ||
299 | - int count = 1; | ||
300 | - while (count--) | ||
301 | - { | ||
302 | - | ||
303 | -printf("begin vpt_batch\n"); | ||
304 | - vpt_batch(tools->det_handle, images, batchsize, &result); | ||
305 | - | ||
306 | - } | ||
307 | - | ||
308 | - | ||
309 | - for (int b = 0; b < batchsize; b++) | ||
310 | - { | ||
311 | - std::cout << "b: " << b << ", count: " << result[b].obj_count_ << std::endl; | ||
312 | - } | ||
313 | -} | ||
314 | - | ||
315 | -int VPT_Process_GPU(void * handle, sy_img * batch_img, int startBatch, int batchsize, vector<VPT_Result>& result, vector<vector<int>>& deleteObjectID, vector<vector<VPT_Result>>& unUsedResult) | ||
316 | -{ | ||
317 | - | ||
318 | - | ||
319 | - | ||
320 | -tmp_test(handle); | ||
321 | - | ||
322 | - | ||
323 | - | ||
324 | - | ||
325 | - objDetector *tools = (objDetector*)handle; | ||
326 | -#ifndef _MSC_VER | ||
327 | - struct timeval first_time, second_time; | ||
328 | - gettimeofday(&first_time, NULL); | ||
329 | -#endif | ||
330 | - | ||
331 | - bool isUseDet = true; | ||
332 | - int channels = 3; | ||
333 | - | ||
334 | -#ifndef _MSC_VER | ||
335 | - if (0) | ||
336 | - { | ||
337 | - gettimeofday(&second_time, NULL); | ||
338 | - double time_val = (second_time.tv_sec - first_time.tv_sec) * 1000000 + second_time.tv_usec - first_time.tv_usec; | ||
339 | - printf("set data time_val(ms) = %lf\n", time_val / 1000.0); | ||
340 | - gettimeofday(&first_time, NULL); | ||
341 | - } | ||
342 | -#endif | ||
343 | - | ||
344 | - | ||
345 | - ctools_result *detresult; | ||
346 | - | ||
347 | - sy_img * batch_img_cpu = new sy_img[batchsize]; | ||
348 | - for (int i = 0; i < batchsize; ++i) | ||
349 | - { | ||
350 | - batch_img_cpu[i].data_ = (unsigned char *)malloc(batch_img[i].w_ * batch_img[i].h_ * batch_img[i].c_); | ||
351 | - cudaMemcpy(batch_img_cpu[i].data_, batch_img[i].data_, batch_img[i].w_ * batch_img[i].h_ * batch_img[i].c_, cudaMemcpyDeviceToHost); | ||
352 | - | ||
353 | - cv::Mat newVideoImg(batch_img[i].h_, batch_img[i].w_, CV_8UC3, batch_img_cpu[i].data_); | ||
354 | - | ||
355 | - char filename[260]; | ||
356 | - sprintf(filename, "pic/%d.jpg", i); | ||
357 | - cv::imwrite(filename, newVideoImg); | ||
358 | - free(batch_img_cpu[i].data_); | ||
359 | - | ||
360 | - } | ||
361 | - | ||
362 | - int res_status = ctools_process(tools->det_handle, batch_img, batchsize, &detresult); | ||
363 | - //for (int i = 0; i < batchsize; ++i) | ||
364 | - //{ | ||
365 | - // free(batch_img_cpu[i].data_); | ||
366 | - //} | ||
367 | - //delete[]batch_img_cpu; | ||
368 | - | ||
369 | -#ifndef _MSC_VER | ||
370 | - | ||
371 | - if (0) | ||
372 | - { | ||
373 | - gettimeofday(&second_time, NULL); | ||
374 | - double time_val = (second_time.tv_sec - first_time.tv_sec) * 1000000 + second_time.tv_usec - first_time.tv_usec; | ||
375 | - printf("process time_val(ms) = %lf\n", time_val / 1000.0); | ||
376 | - } | ||
377 | - | ||
378 | -#endif | ||
379 | - | ||
380 | - vector <vector< vector <float>>> detectResult(batchsize); //杞寲涓鸿窡韪墍闇瑕佺殑杈撳叆 | ||
381 | - int batch_size = batchsize; | ||
382 | - | ||
383 | -#ifndef _MSC_VER | ||
384 | - | ||
385 | - if (0) | ||
386 | - { | ||
387 | - gettimeofday(&first_time, NULL); | ||
388 | - | ||
389 | - } | ||
390 | - | ||
391 | -#endif | ||
392 | - | ||
393 | - for (int b = 0; b < batch_size; b++) | ||
394 | - { | ||
395 | - ctools_result &cur_result = detresult[b]; | ||
396 | -printf("b=%d, count=%d\n", b, cur_result.obj_count_); | ||
397 | - for (int c = 0; c < cur_result.obj_count_ && c < MAX_OBJ_COUNT; c++) | ||
398 | - { | ||
399 | - | ||
400 | - float x1 = cur_result.obj_results_[c].data_[2]; | ||
401 | - float y1 = cur_result.obj_results_[c].data_[3]; | ||
402 | - float x2 = cur_result.obj_results_[c].data_[4]; | ||
403 | - float y2 = cur_result.obj_results_[c].data_[5]; | ||
404 | - | ||
405 | - float class_id = cur_result.obj_results_[c].data_[0]; | ||
406 | - float score = cur_result.obj_results_[c].data_[1]; | ||
407 | - | ||
408 | - int imgid = b; | ||
409 | - if (score >= THRESHOLD) | ||
410 | - { | ||
411 | - vector <float> obj; | ||
412 | - | ||
413 | - obj.push_back(x1); | ||
414 | - obj.push_back(y1); | ||
415 | - obj.push_back(x2); | ||
416 | - obj.push_back(y2); | ||
417 | - obj.push_back(score); | ||
418 | - obj.push_back(class_id); | ||
419 | - detectResult[imgid].push_back(obj); | ||
420 | - } | ||
421 | - } | ||
422 | - } | ||
423 | - //exit(-1); | ||
424 | -#ifndef _MSC_VER | ||
425 | - | ||
426 | - if (0) | ||
427 | - { | ||
428 | - gettimeofday(&second_time, NULL); | ||
429 | - double time_val = (second_time.tv_sec - first_time.tv_sec) * 1000000 + second_time.tv_usec - first_time.tv_usec; | ||
430 | - printf("save result time_val(ms) = %lf\n", time_val / 1000.0); | ||
431 | - } | ||
432 | - | ||
433 | -#endif | ||
434 | - | ||
435 | - int resIndex = startBatch; | ||
436 | - int detectIndex = 0; | ||
437 | - | ||
438 | -#ifndef _MSC_VER | ||
439 | - | ||
440 | - if (0) | ||
441 | - { | ||
442 | - gettimeofday(&first_time, NULL); | ||
443 | - } | ||
444 | -#endif | ||
445 | - | ||
446 | - for (int i = startBatch; i < tools->taskTrackers.size(); i++) //batch?直????貌?同?母????? | ||
447 | - { | ||
448 | - printf("i=%d\n", i); | ||
449 | - if (!tools->taskTrackers[i].tracker.GetState()) | ||
450 | - { | ||
451 | - cout << "************************************ " << i << " pause" << endl; | ||
452 | - continue; | ||
453 | - } | ||
454 | - | ||
455 | - | ||
456 | - // cout << i << " " << taskTrackers[i].TaskID << " " << resIndex << endl; | ||
457 | - isUseDet = true; | ||
458 | - for (int j = 0; j < FusionInterval; j++) //??帧??????一帧?????? (FusionInterval - 1)帧 | ||
459 | - { | ||
460 | - int width = 1920; int height = 1080; | ||
461 | - //int objCount = 0; | ||
462 | - if (j == 0) | ||
463 | - { | ||
464 | - int objCount = tools->taskTrackers[i].tracker.update(/*tools->param.w*/width* tools->taskTrackers[i].ratioWidth, /*tools->param.h*/height* tools->taskTrackers[i].ratioHeight, isUseDet, detectResult[detectIndex], result[resIndex].obj, deleteObjectID[detectIndex]); | ||
465 | - result[resIndex].objCount = objCount; | ||
466 | - vector<vector<float>>().swap(detectResult[detectIndex]); | ||
467 | - detectResult[detectIndex].clear(); | ||
468 | - isUseDet = false; | ||
469 | - } | ||
470 | - else | ||
471 | - { | ||
472 | - VPT_Result unresult; | ||
473 | - VPT_ObjInfo obj[MAX_OBJ_COUNT]; | ||
474 | - unresult.objCount = tools->taskTrackers[i].tracker.update(/*tools->param.w*/width* tools->taskTrackers[i].ratioWidth, /*tools->param.h*/height* tools->taskTrackers[i].ratioHeight, isUseDet, detectResult[detectIndex], unresult.obj, deleteObjectID[detectIndex]); | ||
475 | - unUsedResult[resIndex].push_back(unresult); | ||
476 | - } | ||
477 | - } | ||
478 | - std::cout<<"tracked obj Count : "<<result[resIndex].objCount<<"\n"; | ||
479 | - resIndex++; | ||
480 | - detectIndex++; | ||
481 | - if (resIndex == startBatch + batchsize) | ||
482 | - break; | ||
483 | - } | ||
484 | - | ||
485 | - vector <vector< vector <float>>>().swap(detectResult); | ||
486 | - | ||
487 | -#ifndef _MSC_VER | ||
488 | - | ||
489 | - if (0) | ||
490 | - { | ||
491 | - gettimeofday(&second_time, NULL); | ||
492 | - double time_val = (second_time.tv_sec - first_time.tv_sec) * 1000000 + second_time.tv_usec - first_time.tv_usec; | ||
493 | - printf("tracking time_val(ms) = %lf\n", time_val / 1000.0); | ||
494 | - } | ||
495 | -#endif | ||
496 | - | ||
497 | - return SUCCESS; | ||
498 | -} | ||
499 | - | ||
500 | - | ||
501 | - | ||
502 | -void VPT_Release(void * handle) | ||
503 | -{ | ||
504 | - objDetector *tools = (objDetector*)handle; | ||
505 | - | ||
506 | - if (tools) | ||
507 | - { | ||
508 | - if (tools->det_handle) | ||
509 | - { | ||
510 | - ctools_release(&tools->det_handle); | ||
511 | - tools->det_handle = NULL; | ||
512 | - } | ||
513 | - | ||
514 | - vector<TaskTracker>().swap(tools->taskTrackers); | ||
515 | - | ||
516 | - delete tools; | ||
517 | - tools = NULL; | ||
518 | - } | ||
519 | -} | ||
520 | - | ||
521 | -void AddTaskTracker(void * handle, const int taskID, const double rWidth, const double rHeight) | ||
522 | -{ | ||
523 | - objDetector *tools = (objDetector*)handle; | ||
524 | - TaskTracker t; | ||
525 | - t.TaskID = taskID; | ||
526 | - t.ratioWidth = rWidth; | ||
527 | - t.ratioHeight = rHeight; | ||
528 | - tools->taskTrackers.push_back(t); | ||
529 | -} | ||
530 | - | ||
531 | -void FinishTaskTracker(void * handle, const int taskID) | ||
532 | -{ | ||
533 | - objDetector *tools = (objDetector*)handle; | ||
534 | - for (int i = 0; i < tools->taskTrackers.size(); i++) | ||
535 | - { | ||
536 | - if (tools->taskTrackers[i].TaskID == taskID) | ||
537 | - { | ||
538 | - tools->taskTrackers.erase(tools->taskTrackers.begin() + i); | ||
539 | - break; | ||
540 | - } | ||
541 | - } | ||
542 | -} | ||
543 | - | ||
544 | -void PauseTaskTracker(void * handle, const int taskID) | ||
545 | -{ | ||
546 | - objDetector *tools = (objDetector*)handle; | ||
547 | - for (int i = 0; i < tools->taskTrackers.size(); i++) | ||
548 | - { | ||
549 | - if (tools->taskTrackers[i].TaskID == taskID) | ||
550 | - { | ||
551 | - tools->taskTrackers[i].tracker.Pause(); | ||
552 | - break; | ||
553 | - } | ||
554 | - } | ||
555 | -} | ||
556 | - | ||
557 | -void RestartTaskTraker(void * handle, const int taskID) | ||
558 | -{ | ||
559 | - objDetector *tools = (objDetector*)handle; | ||
560 | - for (int i = 0; i < tools->taskTrackers.size(); i++) | ||
561 | - { | ||
562 | - if (tools->taskTrackers[i].TaskID == taskID) | ||
563 | - { | ||
564 | - tools->taskTrackers[i].tracker.ReSet(); | ||
565 | - break; | ||
566 | - } | ||
567 | - } | ||
568 | -} | ||
569 | - | ||
570 | -void DrawTracker(void * handle, const int taskID, cv::Mat *img) | ||
571 | -{ | ||
572 | - objDetector *tools = (objDetector*)handle; | ||
573 | - for (int i = 0; i < tools->taskTrackers.size(); i++) | ||
574 | - { | ||
575 | - if (tools->taskTrackers[i].TaskID == taskID) | ||
576 | - { | ||
577 | - tools->taskTrackers[i].tracker.addTracker(img); | ||
578 | - break; | ||
579 | - } | ||
580 | - } | ||
581 | -} | ||
582 | - | ||
583 | - | ||
584 | - | ||
585 | -int VPT_Process(void * handle, unsigned char ** bgr, int batchsize, VPT_Result *result) | ||
586 | -{ | ||
587 | - // isUseDet = false; | ||
588 | - // } | ||
589 | - | ||
590 | - // } | ||
591 | - // resIndex++; | ||
592 | - // if (resIndex == batchsize) break; | ||
593 | - //} | ||
594 | - //vector <vector< vector <float>>>().swap(detectResult); | ||
595 | - //vector<vector<float>>().swap(ssdResult); | ||
596 | - ///*detectResult.clear(); | ||
597 | - //ssdResult.clear();*/ | ||
598 | - | ||
599 | - return SUCCESS; | ||
600 | -} | ||
601 | - | ||
602 | -//#include <windows.h> | ||
603 | - | ||
604 | - | ||
605 | - | ||
606 | - | ||
607 | -void permute(float * image, int testWidth, int testHeight) | ||
608 | -{ | ||
609 | - //cv::Mat host_image; | ||
610 | - float * host_image; | ||
611 | - //host_image.create(testHeight, testWidth, CV_32FC3); | ||
612 | - | ||
613 | - host_image = (float *)malloc(testHeight*testWidth * 3 * sizeof(float));; | ||
614 | - | ||
615 | - float *Host_img = new float[3 * testWidth * testHeight]{};//?????诖? | ||
616 | - | ||
617 | - float* image_data_original = image; | ||
618 | - //NPP_CHECK_CUDA(cudaMemcpy(Host_img, image_data_original, testWidth*testHeight * 3 * sizeof(float), cudaMemcpyDeviceToHost));//?????钥???????图???????? | ||
619 | - cudaMemcpy(Host_img, image_data_original, testWidth*testHeight * 3 * sizeof(float), cudaMemcpyDeviceToHost);//?????钥???????图???????? | ||
620 | - | ||
621 | - for (int j = 0; j < testHeight; j++) | ||
622 | - { | ||
623 | - float *pts = host_image + j * testWidth * 3; | ||
624 | - for (int i = 0; i < testWidth; i++) | ||
625 | - { | ||
626 | - //pts[3 * i] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 0]); //b | ||
627 | - //pts[3 * i + 1] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 1]); //g | ||
628 | - //pts[3 * i + 2] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 2]); //r | ||
629 | - | ||
630 | - pts[3 * i] = (Host_img[j * testWidth + i]); //b | ||
631 | - pts[3 * i + 1] = (Host_img[testWidth * testHeight + j * testWidth + i]); //g | ||
632 | - pts[3 * i + 2] = (Host_img[2 * testWidth * testHeight + j * testWidth + i]); //r | ||
633 | - } | ||
634 | - } | ||
635 | - | ||
636 | - cudaMemcpy(image_data_original, host_image, testWidth*testHeight * 3 * sizeof(float), cudaMemcpyHostToDevice); | ||
637 | - free(host_image); | ||
638 | - //cv::Mat showImg; | ||
639 | - //cv::resize(host_image, showImg, cv::Size(640, 480)); | ||
640 | - //cv::imshow("image", showImg); | ||
641 | - //cv::waitKey(0); | ||
642 | -} | ||
643 | - | ||
644 | -cv::Mat GpuMat2OpencvMat(unsigned char* image, int width, int height) | ||
645 | -{ | ||
646 | - int testWidth = width; | ||
647 | - int testHeight = height; | ||
648 | - cv::Mat host_image; | ||
649 | - host_image.create(testHeight, testWidth, CV_8UC3); | ||
650 | - unsigned char *Host_img = new unsigned char[3 * testWidth * testHeight]{};//?????诖? | ||
651 | - unsigned char* image_data_original = image; | ||
652 | - | ||
653 | - cudaError_t code = cudaMemcpy(Host_img, image_data_original, testWidth*testHeight * 3 * sizeof(unsigned char), cudaMemcpyDeviceToHost);//?????钥???????图???????? | ||
654 | - if (code != 0) | ||
655 | - { | ||
656 | - printf("==========================================================error"); | ||
657 | - } | ||
658 | - std::ofstream outfile("decode.bin", ios::out | ios::binary); | ||
659 | - outfile.write((char*)Host_img, int(sizeof(char) * 1080 * 1920 * 3)); | ||
660 | - outfile.close(); | ||
661 | - | ||
662 | - cudaMemcpy(host_image.data, image_data_original, 1920 * testHeight * 3 * sizeof(unsigned char), cudaMemcpyDeviceToHost);//?????钥???????图???????? | ||
663 | - | ||
664 | - // for (int j = 0; j < host_image.rows; j++) | ||
665 | - // { | ||
666 | - // uchar *pts = host_image.ptr<uchar>(j); | ||
667 | - // for (int i = 0; i < host_image.cols; i++) | ||
668 | - // { | ||
669 | - // //pts[3 * i] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 0]); //b | ||
670 | - // //pts[3 * i + 1] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 1]); //g | ||
671 | - // //pts[3 * i + 2] = cv::saturate_cast<uchar>(Host_img[3 * (j*host_image.cols + i) + 2]); //r | ||
672 | - // pts[3 * i] = cv::saturate_cast<uchar>(Host_img[j* host_image.cols*3 + 3 * i]); //b | ||
673 | - // pts[3 * i + 1] = cv::saturate_cast<uchar>(Host_img[j* host_image.cols*3 + 3 * i + 1]); //g | ||
674 | - // pts[3 * i + 2] = cv::saturate_cast<uchar>(Host_img[j* host_image.cols*3 + 3 * i + 2]); //r | ||
675 | - // } | ||
676 | - // } | ||
677 | - cv::imwrite("input3.jpg", host_image); | ||
678 | - return host_image; | ||
679 | -} | ||
680 | - | ||
681 | - | ||
682 | -int VPT_ProcessImage(void * handle, unsigned char ** bgr, int batchsize, VPT_Result * result) | ||
683 | -{ | ||
684 | - //objDetector* tools = (objDetector*)handle; | ||
685 | - //if (bgr == NULL) //图?????荽??? | ||
686 | - // return IMG_DATA_ERROR; | ||
687 | - | ||
688 | - //vector <Mat> imgs; | ||
689 | - ////int datasize = tools->param.w * tools->param.h * tools->param.c; | ||
690 | - //for (int i = 0; i < batchsize; i++) | ||
691 | - //{ | ||
692 | - // Mat img(tools->param.h, tools->param.w, tools->param.c, bgr[i]); | ||
693 | - // imgs.push_back(img); | ||
694 | - //} | ||
695 | - | ||
696 | - //vector<vector<float>> ssdResult; | ||
697 | - ////clock_t begin = clock(); | ||
698 | - //ssdResult = SSD_Detect(tools->detector, batchsize, imgs); // | ||
699 | - //vector <vector< vector <float>>> detectResult(batchsize); //转??为????????要?????? | ||
700 | - //for (int i = 0; i < ssdResult.size(); ++i) | ||
701 | - //{ | ||
702 | - // const vector<float>& d = ssdResult[i];// Detection format: [image_id, label, score, xmin, ymin, xmax, ymax) | ||
703 | - // const float score = d[2]; | ||
704 | - // int imgid = d[0]; | ||
705 | - // if (score >= THRESHOLD) //????为left top right bottom score id | ||
706 | - // { | ||
707 | - // vector <float> obj; | ||
708 | - // obj.push_back(d[3] * imgs[d[0]].cols); | ||
709 | - // obj.push_back(d[4] * imgs[d[0]].rows); | ||
710 | - // obj.push_back(d[5] * imgs[d[0]].cols); | ||
711 | - // obj.push_back(d[6] * imgs[d[0]].rows); | ||
712 | - // obj.push_back(d[2]); | ||
713 | - // obj.push_back(d[1]); | ||
714 | - // detectResult[imgid].push_back(obj); | ||
715 | - // } | ||
716 | - //} | ||
717 | - //for (int i = 0; i < batchsize; i++) | ||
718 | - //{ | ||
719 | - // for (int j = 0; j < detectResult[i].size(); j++)//left top right bottom score id | ||
720 | - // { | ||
721 | - // result[i].obj[j].id = 0; | ||
722 | - // result[i].obj[j].left = detectResult[i][j][0]; | ||
723 | - // result[i].obj[j].top = detectResult[i][j][1]; | ||
724 | - // result[i].obj[j].right = detectResult[i][j][2]; | ||
725 | - // result[i].obj[j].bottom = detectResult[i][j][3]; | ||
726 | - // result[i].obj[j].confidence = detectResult[i][j][4]; | ||
727 | - // result[i].obj[j].index = detectResult[i][j][5] - 1; | ||
728 | - // } | ||
729 | - // | ||
730 | - //} | ||
731 | - | ||
732 | - return SUCCESS; | ||
733 | -} | ||
734 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/backup.h deleted
1 | -//QueryPerformanceCounter(&nSnapshotBeginTime); | ||
2 | -//int left = max(0, (int)(pThreadParam->VPTResult[i].obj[c].left * pThreadParam->tasks[*iter].taskHeightWidth.width) - 2); | ||
3 | -//int top = max(0, (int)(pThreadParam->VPTResult[i].obj[c].top * pThreadParam->tasks[*iter].taskHeightWidth.height) - 2); | ||
4 | -//int right = min(pThreadParam->tasks[*iter].taskDataToBackup.width, (int)(pThreadParam->VPTResult[i].obj[c].right * pThreadParam->tasks[*iter].taskHeightWidth.width) + 2); | ||
5 | -//int bottom = min(pThreadParam->tasks[*iter].taskDataToBackup.height, (int)(pThreadParam->VPTResult[i].obj[c].bottom * pThreadParam->tasks[*iter].taskHeightWidth.height) + 2); | ||
6 | -// | ||
7 | -// | ||
8 | -//pThreadParam->tasks[*iter].taskDataToBackupHost = (float*)malloc(100 * 100 * sizeof(float)); | ||
9 | -//cudaMemcpy2D(pThreadParam->tasks[*iter].taskDataToBackupHost, sizeof(float) * 100, pThreadParam->tasks[*iter].taskDataToBackup.data + 100, pitch, sizeof(float) * 100, 100, cudaMemcpyDeviceToHost); | ||
10 | -//pThreadParam->SaveSnapshot(pThreadParam->tasks[*iter].taskDataToBackupHost, 100, 100, *iter, pThreadParam->VPTResult[i].obj[c].id, 0, 0, 100, 100); | ||
11 | -// | ||
12 | -//QueryPerformanceCounter(&nSnapshotEndTime); | ||
13 | -//printf("%d %d Copy Image Time: %.2f ms \n", *iter, pThreadParam->tasks[*iter].taskFrameCount, (double)(nSnapshotEndTime.QuadPart - nSnapshotBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart); | ||
14 | - | ||
15 | - | ||
16 | -// GPU±£´æ | ||
17 | -//QueryPerformanceCounter(&nSnapshotBeginTime); | ||
18 | -//char snapShotName[260]; | ||
19 | -//sprintf(snapShotName, "SnapshotLittle\\%d\\%d.jpg", *iter, pThreadParam->VPTResult[i].obj[c].id); | ||
20 | -//saveJPEG(snapShotName, pThreadParam->tasks[*iter].taskDataToBackup.data, pThreadParam->tasks[*iter].taskDataToBackup.width, pThreadParam->tasks[*iter].taskDataToBackup.height); | ||
21 | -//QueryPerformanceCounter(&nSnapshotEndTime); | ||
22 | -//printf("%d %d Copy Image Time: %.2f ms \n", *iter, pThreadParam->tasks[*iter].taskFrameCount, (double)(nSnapshotEndTime.QuadPart - nSnapshotBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart); |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/header.hold deleted
1 | -#pragma once | ||
2 | - | ||
3 | -#ifdef _MSC_VER | ||
4 | -#include <windows.h> | ||
5 | -#else | ||
6 | -#include <stddef.h> | ||
7 | -#endif | ||
8 | - | ||
9 | -#include "sy_common.h" | ||
10 | - | ||
11 | -#define DETECTTYPE 9 | ||
12 | - | ||
13 | -#ifndef VD_INFO_ | ||
14 | -#define VD_INFO_ | ||
15 | -//结果 | ||
16 | -typedef struct vd_info | ||
17 | -{ | ||
18 | - sy_rect rect; | ||
19 | - float score; | ||
20 | -}vd_info; | ||
21 | -#endif | ||
22 | - | ||
23 | -#ifndef VCWD_INFO_ | ||
24 | -#define VCWD_INFO_ | ||
25 | -//结果 | ||
26 | -typedef struct vcwd_info | ||
27 | -{ | ||
28 | - vd_info c_info; //车辆信息 | ||
29 | - vd_info w_info; //车窗信息 | ||
30 | -}vcwd_info; | ||
31 | -#endif | ||
32 | - | ||
33 | -#ifndef VCWD_RESULT_ | ||
34 | -#define VCWD_RESULT_ | ||
35 | -#define VD_MAXDETECTCOUNT 100 //车头车尾数量最大值 | ||
36 | -#define FEATURESIZE 256 | ||
37 | -typedef struct vcwd_result | ||
38 | -{ | ||
39 | - vcwd_info * vhd_info; //车头信息 | ||
40 | - int h_count; //车头数量 | ||
41 | - | ||
42 | - vcwd_info * vrd_info; //车尾信息 | ||
43 | - int r_count; //车尾数量 | ||
44 | -}vcwd_result; | ||
45 | - | ||
46 | -#endif | ||
47 | - | ||
48 | -//二次属性分析结果结构体 | ||
49 | -#ifndef __HF_OBJ_RESULT__ | ||
50 | -#define __HF_OBJ_RESULT__ | ||
51 | -const int Hf_FIR_INDEX_SIZE = 1280; | ||
52 | -typedef struct hf_result | ||
53 | -{ | ||
54 | - float res_objs[Hf_FIR_INDEX_SIZE]{}; //分类结果 | ||
55 | -} hf_result; | ||
56 | -#endif | ||
57 | -//二次属性分析结果结构体 | ||
58 | -#ifndef __CLASSIFY_OBJ_RESULT__ | ||
59 | -#define __CLASSIFY_OBJ_RESULT__ | ||
60 | -typedef struct classify_obj_res //分类结果结构体 | ||
61 | -{ | ||
62 | - int res_index; //分类结果 | ||
63 | - float res_prob; //分类结构体 | ||
64 | - classify_obj_res() : res_index(0), res_prob(0) {}; | ||
65 | -} classify_obj_res; | ||
66 | -#endif | ||
67 | - | ||
68 | -#ifndef __HF_FEA_RESULT__ | ||
69 | -#define __HF_FEA_RESULT__ | ||
70 | -const int HF_FEA_SIZE = 576; | ||
71 | -#endif | ||
72 | - | ||
73 | -#ifndef __HP_OBJ_RESULT__ | ||
74 | -#define __HP_OBJ_RESULT__ | ||
75 | -const int HP_FIR_INDEX_SIZE = 16; | ||
76 | -typedef struct hp_res | ||
77 | -{ | ||
78 | - classify_obj_res res_objs[HP_FIR_INDEX_SIZE]; //分类结果 | ||
79 | - float feature[HF_FEA_SIZE]; //行人特征 | ||
80 | -} hp_res; | ||
81 | -#endif | ||
82 | - | ||
83 | -typedef struct hp_result | ||
84 | -{ | ||
85 | - hp_res res_objs{}; //分类结果 | ||
86 | - float feature[Hf_FIR_INDEX_SIZE]{}; //特征 | ||
87 | -} hp_result; | ||
88 | - | ||
89 | -#ifndef __HCF_FEA_RES__ | ||
90 | -#define __HCF_FEA_RES__ | ||
91 | -const int HCF_FEA_SIZE = 1280; | ||
92 | -#endif | ||
93 | - | ||
94 | -#ifndef __HCP_OBJ_RESULT__ | ||
95 | -#define __HCP_OBJ_RESULT__ | ||
96 | -const int HCP_FIR_INDEX_SIZE = 14; | ||
97 | -typedef struct hcp_res | ||
98 | -{ | ||
99 | - classify_obj_res res_objs[HCP_FIR_INDEX_SIZE]; //分类结果 | ||
100 | - float feature[HCF_FEA_SIZE]; //人骑车特征 | ||
101 | -} hcp_res; | ||
102 | -#endif | ||
103 | - | ||
104 | -typedef struct hcp_result | ||
105 | -{ | ||
106 | - hcp_res res_objs{}; //分类结果 | ||
107 | - float feature[Hf_FIR_INDEX_SIZE]{}; //特征 | ||
108 | -} hcp_result; | ||
109 | - | ||
110 | -//VEHICLE | ||
111 | -#define PLATENUM 8 //车牌号码位数 | ||
112 | -#define MAX_PALTE_COUNT 10 //每张图片中最多检测出10个车牌 | ||
113 | - | ||
114 | -#define SINGLETYPE_BLUE 0 //单排蓝色 | ||
115 | -#define SINGLETYPE_YELLOW 1 //单排黄色 | ||
116 | -#define SINGLETYPE_WHITE 2 //单排白色 | ||
117 | -#define SINGLETYPE_BLACK 3 //单排黑色 | ||
118 | -#define DOUBLETYPE_YELLOW 4 //双排黄色 | ||
119 | -#define DOUBLETYPE_WHITE 5 //双排白色 | ||
120 | -#define NEWENERGYTYPE_YELLOWGREEN 6 //新能源黄绿色 | ||
121 | -#define NEWENERGYTYPE_WHITEGRA 7 //新能源白绿色 | ||
122 | - | ||
123 | -//车牌号码 | ||
124 | -#ifndef VPLATENUM_RESULT_ | ||
125 | -#define VPLATENUM_RESULT_ | ||
126 | -typedef struct vplate_num | ||
127 | -{ | ||
128 | - char character[4]; //识别结果字符 | ||
129 | - float maxprob; //识别置信度 | ||
130 | -}vplate_num; | ||
131 | -#endif | ||
132 | - | ||
133 | -#ifndef VP_RESULT_ | ||
134 | -#define VP_RESULT_ | ||
135 | -typedef struct vplate_result | ||
136 | -{ | ||
137 | - sy_rect rect; //位置 | ||
138 | - float detect_score; //检测置信度 | ||
139 | - vplate_num recg[PLATENUM]; //识别结果 | ||
140 | - float num_score; //识别置信度 | ||
141 | - int type; //车牌类型 | ||
142 | -}vplate_result; | ||
143 | -#endif | ||
144 | - | ||
145 | -#ifndef VR_RESULT_ | ||
146 | -#define VR_RESULT_ | ||
147 | -typedef struct vr_result //结果 | ||
148 | -{ | ||
149 | - char vehicle_brand[260]; //车辆品牌 | ||
150 | - char vehicle_subbrand[260]; //车辆子品牌 | ||
151 | - char vehicle_issue_year[260]; //车辆年款 | ||
152 | - char vehicle_type[260]; //车辆类型 | ||
153 | - char freight_ton[260]; //货车吨级 | ||
154 | - float name_score; //识别置信度 | ||
155 | -}vr_result; | ||
156 | -#endif | ||
157 | - | ||
158 | - | ||
159 | - | ||
160 | -//2.车颜色结果 | ||
161 | -#ifndef VC_RESULT_ | ||
162 | -#define VC_RESULT_ | ||
163 | -typedef struct vc_result | ||
164 | -{ | ||
165 | - float score; | ||
166 | - int index; | ||
167 | -}vc_result; | ||
168 | -#endif | ||
169 | - | ||
170 | - | ||
171 | -//#ifndef __VEHICLE_RESULT__ | ||
172 | -//#define __VEHICLE_RESULT__ | ||
173 | -//typedef struct vehicle_res //车二次属性分析结果 | ||
174 | -//{ | ||
175 | -// vr_result vr_res; //车型识别结果 | ||
176 | -// vc_result vc_res; //车颜色识别结果 | ||
177 | -// vplate_result vp_res; //车牌检测结果 | ||
178 | -//} vehicle_res; | ||
179 | -// | ||
180 | -//#endif | ||
181 | -#ifndef __VEHICLE_RESULT__ | ||
182 | -#define __VEHICLE_RESULT__ | ||
183 | -typedef struct vehicle_result //车二次属性分析结果 | ||
184 | -{ | ||
185 | - vr_result vr_res; //车型识别结果 | ||
186 | - vc_result vc_res; //车颜色识别结果 | ||
187 | - vplate_result vp_res; //车牌检测结果 | ||
188 | - float feature[FEATURESIZE]{}; //车辆特征 | ||
189 | -} vehicle_result; | ||
190 | -#endif | ||
191 | -//返回的检测物体快照结果 | ||
192 | -#ifndef __VIDEO_OBJECT_SNAPSHOT__ | ||
193 | -#define __VIDEO_OBJECT_SNAPSHOT__ | ||
194 | -typedef struct video_object_snapshot | ||
195 | -{ | ||
196 | - int task_id; //该物体属于的任务ID号 | ||
197 | - int object_id; //该物体的ID号 | ||
198 | - char video_image_path[256]; //该物体快照的视频截图保存路径 | ||
199 | - char snapshot_image_path[256]; //该物体快照抠图保存路径 | ||
200 | - int object_type_index; //该物体所属类别的索引 | ||
201 | - char obj_type[64]; //该物体属于的类别 | ||
202 | - double progress; //该路视频的检测进度 | ||
203 | - | ||
204 | - int left; //该物体位置的左坐标 | ||
205 | - int top; //该物体位置的上坐标 | ||
206 | - int right; //该物体位置的右坐标 | ||
207 | - int bottom; //该物体位置的下坐标 | ||
208 | - double confidence; //置信度 | ||
209 | - | ||
210 | - void* analysisRes; //二次属性分析结果 | ||
211 | -} video_object_snapshot; | ||
212 | -#endif | ||
213 | - | ||
214 | -//返回的检测物体结果信息 | ||
215 | -#ifndef __VIDEO_OBJECT_INFO__ | ||
216 | -#define __VIDEO_OBJECT_INFO__ | ||
217 | -typedef struct video_object_info | ||
218 | -{ | ||
219 | - int task_id; //该物体属于的任务ID号 | ||
220 | - int task_frame_count; //该物体当前出现的帧号 | ||
221 | - int object_id; //该物体的ID号 | ||
222 | - int left; //该物体位置的左坐标 | ||
223 | - int top; //该物体位置的上坐标 | ||
224 | - int right; //该物体位置的右坐标 | ||
225 | - int bottom; //该物体位置的下坐标 | ||
226 | - int index; //该物体所属类别的编号 | ||
227 | - double confidence; //该物体的置信度 | ||
228 | -} video_object_info; | ||
229 | -#endif | ||
230 | - | ||
231 | -//回调函数,通知处理结束的视频,返回任务ID号 | ||
232 | -typedef void(*VIDEO_OBJECT_INFO_CALLBACK)(void * handle, video_object_info *obj_info); | ||
233 | - | ||
234 | - | ||
235 | -//回调函数,返回检测物体的快照信息 | ||
236 | -typedef void(*VIDEO_OBJECT_SNAPSHOT_CALLBACK)(void * handle, video_object_snapshot *snapshot_info); | ||
237 | - | ||
238 | - | ||
239 | -//回调函数,返回实时查看时视频的图像 | ||
240 | -typedef void(*VIDEO_REALTIME_CALLBACK)(void * handle, unsigned char *img_data, int img_height, int img_width); | ||
241 | - | ||
242 | - | ||
243 | -//回调函数,通知处理结束的视频,返回任务ID号 | ||
244 | -typedef void(*VIDEO_FINISH_CALLBACK)(void * handle, const int task_id); | ||
245 | - | ||
246 | - | ||
247 | -//TASK初始化参数 | ||
248 | -#ifndef __TASK_PARAM__ | ||
249 | -#define __TASK_PARAM__ | ||
250 | -typedef struct task_param | ||
251 | -{ | ||
252 | - const char* video_filename; | ||
253 | - const char* result_folder_little; | ||
254 | - const char* result_folder; | ||
255 | - sy_rect minBoxsize[DETECTTYPE]; //自定义的minBoxsize大小 | ||
256 | - VIDEO_OBJECT_SNAPSHOT_CALLBACK obj_snapshot_callback_func; | ||
257 | - VIDEO_REALTIME_CALLBACK rt_view_callback_func; | ||
258 | -}task_param; | ||
259 | -#endif | ||
260 | - | ||
261 | - | ||
262 | -//VPT初始化参数 | ||
263 | -#ifndef __MVPT_PARAM__ | ||
264 | -#define __MVPT_PARAM__ | ||
265 | -typedef struct mvpt_param | ||
266 | -{ | ||
267 | - int gpuid; //指定显卡id | ||
268 | - char* vrdbpath; //指定车行识别的车型数据库的路径 | ||
269 | - | ||
270 | - //算法配置参数 | ||
271 | - sy_command hp_analysis_config; //是否开启行人结构化识别 | ||
272 | - sy_command hcp_analysis_config; //是否开启人骑车结构化识别 | ||
273 | - sy_command vehicle_analysis_config; //是否开启车型识别 | ||
274 | - sy_command hf_recg_config; //是否开启行人特征识别 | ||
275 | - sy_command hcf_recg_config; //是否开启人骑车特征识别 | ||
276 | - sy_command vcf_recg_config; //是否开启车辆特征识别 | ||
277 | - | ||
278 | - VIDEO_OBJECT_INFO_CALLBACK task_obj_info_callback_func; //目标检测结果实时返回回调函数 | ||
279 | - VIDEO_FINISH_CALLBACK task_finish_callbackfunc; //任务分析结束结果回调函数 | ||
280 | -}mvpt_param; | ||
281 | -#endif | ||
282 | - | ||
283 | - | ||
284 | -#ifndef _MSC_VER | ||
285 | -#include <sys/time.h> | ||
286 | - | ||
287 | -#define MACRO_COUNT_TIME_START struct timeval macro_tv_start;\ | ||
288 | - struct timeval macro_tv_end;\ | ||
289 | - gettimeofday(¯o_tv_start,NULL); | ||
290 | - | ||
291 | -#define MACRO_COUNT_TIME_END(___total_count___) gettimeofday(¯o_tv_end,NULL);\ | ||
292 | - if(___total_count___<=0)\ | ||
293 | - printf("time cost: %.2f ms \n", ( (double)(macro_tv_end.tv_sec-macro_tv_start.tv_sec)*1000000+(double)(macro_tv_end.tv_usec-macro_tv_start.tv_usec) )/1000);\ | ||
294 | - else\ | ||
295 | - printf("time cost: %.2f ms \n", ( (double)(macro_tv_end.tv_sec-macro_tv_start.tv_sec)*1000000+(double)(macro_tv_end.tv_usec-macro_tv_start.tv_usec) )/1000/___total_count___); | ||
296 | -#endif |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/jpegNPP.hbk deleted
1 | -/* | ||
2 | -* Copyright 1993-2015 NVIDIA Corporation. All rights reserved. | ||
3 | -* | ||
4 | -* NOTICE TO USER: | ||
5 | -* | ||
6 | -* This source code is subject to NVIDIA ownership rights under U.S. and | ||
7 | -* international Copyright laws. | ||
8 | -* | ||
9 | -* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE | ||
10 | -* CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR | ||
11 | -* IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH | ||
12 | -* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF | ||
13 | -* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. | ||
14 | -* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, | ||
15 | -* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||
16 | -* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE | ||
17 | -* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE | ||
18 | -* OR PERFORMANCE OF THIS SOURCE CODE. | ||
19 | -* | ||
20 | -* U.S. Government End Users. This source code is a "commercial item" as | ||
21 | -* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of | ||
22 | -* "commercial computer software" and "commercial computer software | ||
23 | -* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) | ||
24 | -* and is provided to the U.S. Government only as a commercial end item. | ||
25 | -* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through | ||
26 | -* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the | ||
27 | -* source code with only those rights set forth herein. | ||
28 | -*/ | ||
29 | - | ||
30 | -// This sample needs at least CUDA 5.5 and a GPU that has at least Compute Capability 2.0 | ||
31 | - | ||
32 | -// This sample demonstrates a simple image processing pipeline. | ||
33 | -// First, a JPEG file is huffman decoded and inverse DCT transformed and dequantized. | ||
34 | -// Then the different planes are resized. Finally, the resized image is quantized, forward | ||
35 | -// DCT transformed and huffman encoded. | ||
36 | - | ||
37 | -#include <npp.h> | ||
38 | -#include <cuda_runtime.h> | ||
39 | -#include "EnCode/Exceptions.h" | ||
40 | - | ||
41 | -#include "EnCode/Endianess.h" | ||
42 | -#include <math.h> | ||
43 | - | ||
44 | -#include <string.h> | ||
45 | -#include <fstream> | ||
46 | -#include <iostream> | ||
47 | - | ||
48 | -#include <helper_string.h> | ||
49 | -#include <helper_cuda.h> | ||
50 | - | ||
51 | -using namespace std; | ||
52 | - | ||
53 | -struct FrameHeader //帧图像 | ||
54 | -{ | ||
55 | - unsigned char nSamplePrecision; //精度:表示每个数据样本的位数 | ||
56 | - unsigned short nHeight; //图像的高 像素为单位 | ||
57 | - unsigned short nWidth; //图像的宽 像素为单位 | ||
58 | - unsigned char nComponents; //颜色分量个数 | ||
59 | - unsigned char aComponentIdentifier[3]; //颜色分量ID | ||
60 | - unsigned char aSamplingFactors[3]; //水平/垂直采样因子,高4位代表水平采样因子,低4位代表垂直采样因子 | ||
61 | - unsigned char aQuantizationTableSelector[3]; //当前分量使用的量化表ID | ||
62 | -}; | ||
63 | - | ||
64 | -struct ScanHeader | ||
65 | -{ | ||
66 | - unsigned char nComponents; | ||
67 | - unsigned char aComponentSelector[3]; | ||
68 | - unsigned char aHuffmanTablesSelector[3]; | ||
69 | - unsigned char nSs; | ||
70 | - unsigned char nSe; | ||
71 | - unsigned char nA; | ||
72 | -}; | ||
73 | - | ||
74 | -struct QuantizationTable | ||
75 | -{ | ||
76 | - unsigned char nPrecisionAndIdentifier; | ||
77 | - unsigned char aTable[64]; | ||
78 | -}; | ||
79 | - | ||
80 | -struct HuffmanTable | ||
81 | -{ | ||
82 | - unsigned char nClassAndIdentifier; | ||
83 | - unsigned char aCodes[16]; | ||
84 | - unsigned char aTable[256]; | ||
85 | -}; | ||
86 | - | ||
87 | - | ||
88 | -int DivUp(int x, int d) | ||
89 | -{ | ||
90 | - return (x + d - 1) / d; | ||
91 | -} | ||
92 | - | ||
93 | -template<typename T> | ||
94 | -T readAndAdvance(const unsigned char *&pData) | ||
95 | -{ | ||
96 | - T nElement = readBigEndian<T>(pData); | ||
97 | - pData += sizeof(T); | ||
98 | - return nElement; | ||
99 | -} | ||
100 | - | ||
101 | -template<typename T> | ||
102 | -void writeAndAdvance(unsigned char *&pData, T nElement) | ||
103 | -{ | ||
104 | - writeBigEndian<T>(pData, nElement); | ||
105 | - pData += sizeof(T); | ||
106 | -} | ||
107 | - | ||
108 | - | ||
109 | -int nextMarker(const unsigned char *pData, int &nPos, int nLength) | ||
110 | -{ | ||
111 | - unsigned char c = pData[nPos++]; | ||
112 | - | ||
113 | - do | ||
114 | - { | ||
115 | - while (c != 0xffu && nPos < nLength) | ||
116 | - { | ||
117 | - c = pData[nPos++]; | ||
118 | - } | ||
119 | - | ||
120 | - if (nPos >= nLength) | ||
121 | - return -1; | ||
122 | - | ||
123 | - c = pData[nPos++]; | ||
124 | - } while (c == 0 || c == 0x0ffu); | ||
125 | - | ||
126 | - return c; | ||
127 | -} | ||
128 | - | ||
129 | -void writeMarker(unsigned char nMarker, unsigned char *&pData) | ||
130 | -{ | ||
131 | - *pData++ = 0x0ff; | ||
132 | - *pData++ = nMarker; | ||
133 | -} | ||
134 | - | ||
135 | -void writeJFIFTag(unsigned char *&pData) | ||
136 | -{ | ||
137 | - const char JFIF_TAG[] = | ||
138 | - { | ||
139 | - 0x4a, 0x46, 0x49, 0x46, 0x00, | ||
140 | - 0x01, 0x02, | ||
141 | - 0x00, | ||
142 | - 0x00, 0x01, 0x00, 0x01, | ||
143 | - 0x00, 0x00 | ||
144 | - }; | ||
145 | - | ||
146 | - writeMarker(0x0e0, pData); | ||
147 | - writeAndAdvance<unsigned short>(pData, sizeof(JFIF_TAG) + sizeof(unsigned short)); | ||
148 | - memcpy(pData, JFIF_TAG, sizeof(JFIF_TAG)); | ||
149 | - pData += sizeof(JFIF_TAG); | ||
150 | -} | ||
151 | - | ||
152 | -void loadJpeg(const char *input_file, unsigned char *&pJpegData, int &nInputLength) | ||
153 | -{ | ||
154 | - // Load file into CPU memory | ||
155 | - ifstream stream(input_file, ifstream::binary); | ||
156 | - | ||
157 | - if (!stream.good()) | ||
158 | - { | ||
159 | - return; | ||
160 | - } | ||
161 | - | ||
162 | - stream.seekg(0, ios::end); | ||
163 | - nInputLength = (int)stream.tellg(); | ||
164 | - stream.seekg(0, ios::beg); | ||
165 | - | ||
166 | - pJpegData = new unsigned char[nInputLength] {}; | ||
167 | - stream.read(reinterpret_cast<char *>(pJpegData), nInputLength); | ||
168 | -} | ||
169 | - | ||
170 | -void readFrameHeader(const unsigned char *pData, FrameHeader &header) | ||
171 | -{ | ||
172 | - readAndAdvance<unsigned short>(pData); | ||
173 | - header.nSamplePrecision = readAndAdvance<unsigned char>(pData); | ||
174 | - header.nHeight = readAndAdvance<unsigned short>(pData); | ||
175 | - header.nWidth = readAndAdvance<unsigned short>(pData); | ||
176 | - header.nComponents = readAndAdvance<unsigned char>(pData); | ||
177 | - | ||
178 | - for (int c = 0; c<header.nComponents; ++c) | ||
179 | - { | ||
180 | - header.aComponentIdentifier[c] = readAndAdvance<unsigned char>(pData); | ||
181 | - header.aSamplingFactors[c] = readAndAdvance<unsigned char>(pData); | ||
182 | - header.aQuantizationTableSelector[c] = readAndAdvance<unsigned char>(pData); | ||
183 | - } | ||
184 | - | ||
185 | -} | ||
186 | - | ||
187 | -void writeFrameHeader(const FrameHeader &header, unsigned char *&pData) | ||
188 | -{ | ||
189 | - unsigned char aTemp[128]; | ||
190 | - unsigned char *pTemp = aTemp; | ||
191 | - | ||
192 | - writeAndAdvance<unsigned char>(pTemp, header.nSamplePrecision); | ||
193 | - writeAndAdvance<unsigned short>(pTemp, header.nHeight); | ||
194 | - writeAndAdvance<unsigned short>(pTemp, header.nWidth); | ||
195 | - writeAndAdvance<unsigned char>(pTemp, header.nComponents); | ||
196 | - | ||
197 | - for (int c = 0; c<header.nComponents; ++c) | ||
198 | - { | ||
199 | - writeAndAdvance<unsigned char>(pTemp, header.aComponentIdentifier[c]); | ||
200 | - writeAndAdvance<unsigned char>(pTemp, header.aSamplingFactors[c]); | ||
201 | - writeAndAdvance<unsigned char>(pTemp, header.aQuantizationTableSelector[c]); | ||
202 | - } | ||
203 | - | ||
204 | - unsigned short nLength = (unsigned short)(pTemp - aTemp); | ||
205 | - | ||
206 | - writeMarker(0x0C0, pData); | ||
207 | - writeAndAdvance<unsigned short>(pData, nLength + 2); | ||
208 | - memcpy(pData, aTemp, nLength); | ||
209 | - pData += nLength; | ||
210 | -} | ||
211 | - | ||
212 | - | ||
213 | -void readScanHeader(const unsigned char *pData, ScanHeader &header) | ||
214 | -{ | ||
215 | - readAndAdvance<unsigned short>(pData); | ||
216 | - | ||
217 | - header.nComponents = readAndAdvance<unsigned char>(pData); | ||
218 | - | ||
219 | - for (int c = 0; c<header.nComponents; ++c) | ||
220 | - { | ||
221 | - header.aComponentSelector[c] = readAndAdvance<unsigned char>(pData); | ||
222 | - header.aHuffmanTablesSelector[c] = readAndAdvance<unsigned char>(pData); | ||
223 | - } | ||
224 | - | ||
225 | - header.nSs = readAndAdvance<unsigned char>(pData); | ||
226 | - header.nSe = readAndAdvance<unsigned char>(pData); | ||
227 | - header.nA = readAndAdvance<unsigned char>(pData); | ||
228 | -} | ||
229 | - | ||
230 | - | ||
231 | -void writeScanHeader(const ScanHeader &header, unsigned char *&pData) | ||
232 | -{ | ||
233 | - unsigned char aTemp[128]; | ||
234 | - unsigned char *pTemp = aTemp; | ||
235 | - | ||
236 | - writeAndAdvance<unsigned char>(pTemp, header.nComponents); | ||
237 | - | ||
238 | - for (int c = 0; c<header.nComponents; ++c) | ||
239 | - { | ||
240 | - writeAndAdvance<unsigned char>(pTemp, header.aComponentSelector[c]); | ||
241 | - writeAndAdvance<unsigned char>(pTemp, header.aHuffmanTablesSelector[c]); | ||
242 | - } | ||
243 | - | ||
244 | - writeAndAdvance<unsigned char>(pTemp, header.nSs); | ||
245 | - writeAndAdvance<unsigned char>(pTemp, header.nSe); | ||
246 | - writeAndAdvance<unsigned char>(pTemp, header.nA); | ||
247 | - | ||
248 | - unsigned short nLength = (unsigned short)(pTemp - aTemp); | ||
249 | - | ||
250 | - writeMarker(0x0DA, pData); | ||
251 | - writeAndAdvance<unsigned short>(pData, nLength + 2); | ||
252 | - memcpy(pData, aTemp, nLength); | ||
253 | - pData += nLength; | ||
254 | -} | ||
255 | - | ||
256 | - | ||
257 | -void readQuantizationTables(const unsigned char *pData, QuantizationTable *pTables) | ||
258 | -{ | ||
259 | - unsigned short nLength = readAndAdvance<unsigned short>(pData) -2; | ||
260 | - | ||
261 | - while (nLength > 0) | ||
262 | - { | ||
263 | - unsigned char nPrecisionAndIdentifier = readAndAdvance<unsigned char>(pData); | ||
264 | - int nIdentifier = nPrecisionAndIdentifier & 0x0f; | ||
265 | - | ||
266 | - pTables[nIdentifier].nPrecisionAndIdentifier = nPrecisionAndIdentifier; | ||
267 | - memcpy(pTables[nIdentifier].aTable, pData, 64); | ||
268 | - pData += 64; | ||
269 | - | ||
270 | - nLength -= 65; | ||
271 | - } | ||
272 | -} | ||
273 | - | ||
274 | -void writeQuantizationTable(const QuantizationTable &table, unsigned char *&pData) | ||
275 | -{ | ||
276 | - writeMarker(0x0DB, pData); | ||
277 | - writeAndAdvance<unsigned short>(pData, sizeof(QuantizationTable) + 2); | ||
278 | - memcpy(pData, &table, sizeof(QuantizationTable)); | ||
279 | - pData += sizeof(QuantizationTable); | ||
280 | -} | ||
281 | - | ||
282 | -void readHuffmanTables(const unsigned char *pData, HuffmanTable *pTables) | ||
283 | -{ | ||
284 | - unsigned short nLength = readAndAdvance<unsigned short>(pData) -2; | ||
285 | - | ||
286 | - while (nLength > 0) | ||
287 | - { | ||
288 | - unsigned char nClassAndIdentifier = readAndAdvance<unsigned char>(pData); | ||
289 | - int nClass = nClassAndIdentifier >> 4; // AC or DC | ||
290 | - int nIdentifier = nClassAndIdentifier & 0x0f; | ||
291 | - int nIdx = nClass * 2 + nIdentifier; | ||
292 | - pTables[nIdx].nClassAndIdentifier = nClassAndIdentifier; | ||
293 | - | ||
294 | - // Number of Codes for Bit Lengths [1..16] | ||
295 | - int nCodeCount = 0; | ||
296 | - | ||
297 | - for (int i = 0; i < 16; ++i) | ||
298 | - { | ||
299 | - pTables[nIdx].aCodes[i] = readAndAdvance<unsigned char>(pData); | ||
300 | - nCodeCount += pTables[nIdx].aCodes[i]; | ||
301 | - } | ||
302 | - | ||
303 | - memcpy(pTables[nIdx].aTable, pData, nCodeCount); | ||
304 | - pData += nCodeCount; | ||
305 | - | ||
306 | - nLength -= 17 + nCodeCount; | ||
307 | - } | ||
308 | -} | ||
309 | - | ||
310 | -void writeHuffmanTable(const HuffmanTable &table, unsigned char *&pData) | ||
311 | -{ | ||
312 | - writeMarker(0x0C4, pData); | ||
313 | - | ||
314 | - // Number of Codes for Bit Lengths [1..16] | ||
315 | - int nCodeCount = 0; | ||
316 | - | ||
317 | - for (int i = 0; i < 16; ++i) | ||
318 | - { | ||
319 | - nCodeCount += table.aCodes[i]; | ||
320 | - } | ||
321 | - | ||
322 | - writeAndAdvance<unsigned short>(pData, 17 + nCodeCount + 2); | ||
323 | - memcpy(pData, &table, 17 + nCodeCount); | ||
324 | - pData += 17 + nCodeCount; | ||
325 | -} | ||
326 | - | ||
327 | - | ||
328 | -void readRestartInterval(const unsigned char *pData, int &nRestartInterval) | ||
329 | -{ | ||
330 | - readAndAdvance<unsigned short>(pData); | ||
331 | - nRestartInterval = readAndAdvance<unsigned short>(pData); | ||
332 | -} | ||
333 | - | ||
334 | -void printHelp() | ||
335 | -{ | ||
336 | - cout << "jpegNPP usage" << endl; | ||
337 | - cout << " -input=srcfile.jpg (input file JPEG image)" << endl; | ||
338 | - cout << " -output=destfile.jpg (output file JPEG image)" << endl; | ||
339 | - cout << " -scale=1.0 (scale multiplier for width and height)" << endl << endl; | ||
340 | -} | ||
341 | - | ||
342 | -bool printfNPPinfo(int argc, char *argv[], int cudaVerMajor, int cudaVerMinor) | ||
343 | -{ | ||
344 | - const NppLibraryVersion *libVer = nppGetLibVersion(); | ||
345 | - | ||
346 | - printf("NPP Library Version %d.%d.%d\n", libVer->major, libVer->minor, libVer->build); | ||
347 | - | ||
348 | - int driverVersion, runtimeVersion; | ||
349 | - cudaDriverGetVersion(&driverVersion); | ||
350 | - cudaRuntimeGetVersion(&runtimeVersion); | ||
351 | - | ||
352 | - printf(" CUDA Driver Version: %d.%d\n", driverVersion / 1000, (driverVersion % 100) / 10); | ||
353 | - printf(" CUDA Runtime Version: %d.%d\n", runtimeVersion / 1000, (runtimeVersion % 100) / 10); | ||
354 | - | ||
355 | - bool bVal = checkCudaCapabilities(cudaVerMajor, cudaVerMinor); | ||
356 | - return bVal; | ||
357 | -} | ||
358 | - | ||
359 | -const char *szInputFile; | ||
360 | -const char *szOutputFile; | ||
361 | -NppiSize aSrcSize[3]; | ||
362 | -Npp16s *aphDCT[3] = { 0, 0, 0 }; | ||
363 | -Npp16s *apdDCT[3] = { 0, 0, 0 }; | ||
364 | -Npp16s *apdDCT_My[3] = { 0, 0, 0 }; | ||
365 | -Npp32s aDCTStep[3]; | ||
366 | - | ||
367 | -Npp8u *apSrcImage[3] = { 0, 0, 0 }; | ||
368 | -Npp32s aSrcImageStep[3]; | ||
369 | - | ||
370 | -Npp8u *apDstImage[3] = { 0, 0, 0 }; | ||
371 | -Npp32s aDstImageStep[3]; | ||
372 | -NppiSize aDstSize[3]; | ||
373 | - | ||
374 | -HuffmanTable aHuffmanTables[4]; | ||
375 | -HuffmanTable *pHuffmanDCTables = aHuffmanTables; | ||
376 | -HuffmanTable *pHuffmanACTables = &aHuffmanTables[2]; | ||
377 | - | ||
378 | -ScanHeader oScanHeader; | ||
379 | -FrameHeader oFrameHeader; | ||
380 | -QuantizationTable aQuantizationTables[4]; | ||
381 | -Npp8u *pdQuantizationTables; | ||
382 | -NppiDCTState *pDCTState; | ||
383 | -int nMCUBlocksH = 0; | ||
384 | -int nMCUBlocksV = 0; | ||
385 | -unsigned char *pJpegData = 0; | ||
386 | -int nInputLength = 0; | ||
387 | - | ||
388 | - | ||
389 | - | ||
390 | -int DecodeJPEG() | ||
391 | -{ | ||
392 | - //float nScaleFactor; | ||
393 | - | ||
394 | - szInputFile = "G:\\TestData\\人车物\\18.jpg"; | ||
395 | - cout << "Source File: " << szInputFile << endl; | ||
396 | - szOutputFile = "scaled.jpg"; | ||
397 | - cout << "Output File: " << szOutputFile << endl; | ||
398 | - | ||
399 | - /*if (checkCmdLineFlag(argc, (const char **)argv, "scale")) | ||
400 | - { | ||
401 | - nScaleFactor = max(0.0f, min(getCmdLineArgumentFloat(argc, (const char **)argv, "scale"), 1.0f)); | ||
402 | - } | ||
403 | - else | ||
404 | - { | ||
405 | - nScaleFactor = 1.0f; | ||
406 | - } | ||
407 | - | ||
408 | - cout << "Scale Factor: " << nScaleFactor << endl;*/ | ||
409 | - | ||
410 | - | ||
411 | - NPP_CHECK_NPP(nppiDCTInitAlloc(&pDCTState)); | ||
412 | - | ||
413 | - | ||
414 | - | ||
415 | - // Load Jpeg | ||
416 | - loadJpeg(szInputFile, pJpegData, nInputLength); | ||
417 | - | ||
418 | - if (pJpegData == 0) | ||
419 | - { | ||
420 | - cerr << "1. Input File Error: " << szInputFile << endl; | ||
421 | - return EXIT_FAILURE; | ||
422 | - } | ||
423 | - | ||
424 | - /*************************** | ||
425 | - * | ||
426 | - * Input | ||
427 | - * | ||
428 | - ***************************/ | ||
429 | - | ||
430 | - | ||
431 | - // Check if this is a valid JPEG file | ||
432 | - int nPos = 0; | ||
433 | - int nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
434 | - | ||
435 | - if (nMarker != 0x0D8) | ||
436 | - { | ||
437 | - cerr << "Invalid Jpeg Image" << endl; | ||
438 | - return EXIT_FAILURE; | ||
439 | - } | ||
440 | - | ||
441 | - nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
442 | - | ||
443 | - // Parsing and Huffman Decoding (on host) | ||
444 | - | ||
445 | - cudaMalloc(&pdQuantizationTables, 64 * 4); | ||
446 | - | ||
447 | - | ||
448 | - memset(&oFrameHeader, 0, sizeof(FrameHeader)); | ||
449 | - memset(aQuantizationTables, 0, 4 * sizeof(QuantizationTable)); | ||
450 | - memset(aHuffmanTables, 0, 4 * sizeof(HuffmanTable)); | ||
451 | - | ||
452 | - int nRestartInterval = -1; | ||
453 | - | ||
454 | - | ||
455 | - | ||
456 | - while (nMarker != -1) | ||
457 | - { | ||
458 | - if (nMarker == 0x0D8) | ||
459 | - { | ||
460 | - // Embedded Thumbnail, skip it | ||
461 | - int nNextMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
462 | - | ||
463 | - while (nNextMarker != -1 && nNextMarker != 0x0D9) | ||
464 | - { | ||
465 | - nNextMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
466 | - } | ||
467 | - } | ||
468 | - | ||
469 | - if (nMarker == 0x0DD) | ||
470 | - { | ||
471 | - readRestartInterval(pJpegData + nPos, nRestartInterval); | ||
472 | - } | ||
473 | - | ||
474 | - if ((nMarker == 0x0C0) | (nMarker == 0x0C2)) | ||
475 | - { | ||
476 | - //Assert Baseline for this Sample | ||
477 | - //Note: NPP does support progressive jpegs for both encode and decode | ||
478 | - if (nMarker != 0x0C0) | ||
479 | - { | ||
480 | - cerr << "The sample does only support baseline JPEG images" << endl; | ||
481 | - return EXIT_SUCCESS; | ||
482 | - } | ||
483 | - | ||
484 | - // Baseline or Progressive Frame Header | ||
485 | - //读取JPEG文件头 | ||
486 | - readFrameHeader(pJpegData + nPos, oFrameHeader); | ||
487 | - cout << "Image Size: " << oFrameHeader.nWidth << "x" << oFrameHeader.nHeight << "x" << static_cast<int>(oFrameHeader.nComponents) << endl; | ||
488 | - | ||
489 | - //Assert 3-Channel Image for this Sample | ||
490 | - if (oFrameHeader.nComponents != 3) | ||
491 | - { | ||
492 | - cerr << "The sample does only support color JPEG images" << endl; | ||
493 | - return EXIT_SUCCESS; | ||
494 | - } | ||
495 | - | ||
496 | - // Compute channel sizes as stored in the JPEG (8x8 blocks & MCU block layout) | ||
497 | - for (int i = 0; i < oFrameHeader.nComponents; ++i) | ||
498 | - { | ||
499 | - nMCUBlocksV = max(nMCUBlocksV, oFrameHeader.aSamplingFactors[i] & 0x0f); //2 1 1 | ||
500 | - nMCUBlocksH = max(nMCUBlocksH, oFrameHeader.aSamplingFactors[i] >> 4); //2 1 1 | ||
501 | - } | ||
502 | - | ||
503 | - for (int i = 0; i < oFrameHeader.nComponents; ++i) | ||
504 | - { | ||
505 | - NppiSize oBlocks; | ||
506 | - NppiSize oBlocksPerMCU = { oFrameHeader.aSamplingFactors[i] >> 4, oFrameHeader.aSamplingFactors[i] & 0x0f }; //水平采样因子 和 垂直采样因子 | ||
507 | - | ||
508 | - cout << "oBlocksPerMCU Size: " << oBlocksPerMCU.width << " " << oBlocksPerMCU.height << endl; | ||
509 | - | ||
510 | - oBlocks.width = (int)ceil((oFrameHeader.nWidth + 7) / 8 * | ||
511 | - static_cast<float>(oBlocksPerMCU.width) / nMCUBlocksH); | ||
512 | - oBlocks.width = DivUp(oBlocks.width, oBlocksPerMCU.width) * oBlocksPerMCU.width; //相除 并且 上取整 确保够所有的MCU Block的大小 | ||
513 | - | ||
514 | - oBlocks.height = (int)ceil((oFrameHeader.nHeight + 7) / 8 * | ||
515 | - static_cast<float>(oBlocksPerMCU.height) / nMCUBlocksV); | ||
516 | - oBlocks.height = DivUp(oBlocks.height, oBlocksPerMCU.height) * oBlocksPerMCU.height; | ||
517 | - | ||
518 | - aSrcSize[i].width = oBlocks.width * 8; | ||
519 | - aSrcSize[i].height = oBlocks.height * 8; | ||
520 | - | ||
521 | - cout << "oBlock Size: " << oBlocks.width << " " << oBlocks.height << endl; | ||
522 | - | ||
523 | - // Allocate Memory | ||
524 | - size_t nPitch; //返回分配的一行的内存大小 | ||
525 | - NPP_CHECK_CUDA(cudaMallocPitch(&apdDCT[i], &nPitch, oBlocks.width * 64 * sizeof(Npp16s), oBlocks.height)); | ||
526 | - NPP_CHECK_CUDA(cudaMallocPitch(&apdDCT_My[i], &nPitch, oBlocks.width * 64 * sizeof(Npp16s), oBlocks.height)); | ||
527 | - aDCTStep[i] = static_cast<Npp32s>(nPitch); | ||
528 | - | ||
529 | - NPP_CHECK_CUDA(cudaMallocPitch(&apSrcImage[i], &nPitch, aSrcSize[i].width, aSrcSize[i].height)); | ||
530 | - aSrcImageStep[i] = static_cast<Npp32s>(nPitch); | ||
531 | - | ||
532 | - NPP_CHECK_CUDA(cudaHostAlloc(&aphDCT[i], aDCTStep[i] * oBlocks.height, cudaHostAllocDefault)); | ||
533 | - } | ||
534 | - } | ||
535 | - | ||
536 | - //从压缩数据中读取量化表 | ||
537 | - if (nMarker == 0x0DB) | ||
538 | - { | ||
539 | - // Quantization Tables | ||
540 | - readQuantizationTables(pJpegData + nPos, aQuantizationTables); | ||
541 | - } | ||
542 | - | ||
543 | - //从压缩数据中读取码表 熵编码表 | ||
544 | - if (nMarker == 0x0C4) | ||
545 | - { | ||
546 | - // Huffman Tables | ||
547 | - readHuffmanTables(pJpegData + nPos, aHuffmanTables); | ||
548 | - } | ||
549 | - | ||
550 | - if (nMarker == 0x0DA) | ||
551 | - { | ||
552 | - // Scan | ||
553 | - readScanHeader(pJpegData + nPos, oScanHeader); | ||
554 | - nPos += 6 + oScanHeader.nComponents * 2; | ||
555 | - | ||
556 | - int nAfterNextMarkerPos = nPos; | ||
557 | - int nAfterScanMarker = nextMarker(pJpegData, nAfterNextMarkerPos, nInputLength); | ||
558 | - | ||
559 | - if (nRestartInterval > 0) | ||
560 | - { | ||
561 | - while (nAfterScanMarker >= 0x0D0 && nAfterScanMarker <= 0x0D7) | ||
562 | - { | ||
563 | - // This is a restart marker, go on | ||
564 | - nAfterScanMarker = nextMarker(pJpegData, nAfterNextMarkerPos, nInputLength); | ||
565 | - } | ||
566 | - } | ||
567 | - | ||
568 | - NppiDecodeHuffmanSpec *apHuffmanDCTable[3]; | ||
569 | - NppiDecodeHuffmanSpec *apHuffmanACTable[3]; | ||
570 | - | ||
571 | - for (int i = 0; i < 3; ++i) | ||
572 | - { | ||
573 | - nppiDecodeHuffmanSpecInitAllocHost_JPEG(pHuffmanDCTables[(oScanHeader.aHuffmanTablesSelector[i] >> 4)].aCodes, nppiDCTable, &apHuffmanDCTable[i]); | ||
574 | - nppiDecodeHuffmanSpecInitAllocHost_JPEG(pHuffmanACTables[(oScanHeader.aHuffmanTablesSelector[i] & 0x0f)].aCodes, nppiACTable, &apHuffmanACTable[i]); | ||
575 | - } | ||
576 | - | ||
577 | - //恢复图像数据 | ||
578 | - NPP_CHECK_NPP(nppiDecodeHuffmanScanHost_JPEG_8u16s_P3R(pJpegData + nPos, nAfterNextMarkerPos - nPos - 2, | ||
579 | - nRestartInterval, oScanHeader.nSs, oScanHeader.nSe, oScanHeader.nA >> 4, oScanHeader.nA & 0x0f, | ||
580 | - aphDCT, aDCTStep, | ||
581 | - apHuffmanDCTable, | ||
582 | - apHuffmanACTable, | ||
583 | - aSrcSize)); | ||
584 | - | ||
585 | - for (int i = 0; i < 3; ++i) | ||
586 | - { | ||
587 | - nppiDecodeHuffmanSpecFreeHost_JPEG(apHuffmanDCTable[i]); | ||
588 | - nppiDecodeHuffmanSpecFreeHost_JPEG(apHuffmanACTable[i]); | ||
589 | - } | ||
590 | - } | ||
591 | - | ||
592 | - nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
593 | - } | ||
594 | - | ||
595 | - // Copy DCT coefficients and Quantization Tables from host to device | ||
596 | - for (int i = 0; i < 4; ++i) | ||
597 | - { | ||
598 | - NPP_CHECK_CUDA(cudaMemcpyAsync(pdQuantizationTables + i * 64, aQuantizationTables[i].aTable, 64, cudaMemcpyHostToDevice)); | ||
599 | - } | ||
600 | - | ||
601 | - for (int i = 0; i < 3; ++i) | ||
602 | - { | ||
603 | - | ||
604 | - cout << aDCTStep[i] << " " << aSrcSize[i].height << " " << aDCTStep[i] * aSrcSize[i].height / 8 << endl; | ||
605 | - NPP_CHECK_CUDA(cudaMemcpyAsync(apdDCT[i], aphDCT[i], aDCTStep[i] * aSrcSize[i].height / 8, cudaMemcpyHostToDevice)); | ||
606 | - } | ||
607 | - | ||
608 | - /* Inverse DCT | ||
609 | - 该函数实现了将jpeg图像 解码成 YUV数据*/ | ||
610 | - for (int i = 0; i < 3; ++i) | ||
611 | - { | ||
612 | - NPP_CHECK_NPP(nppiDCTQuantInv8x8LS_JPEG_16s8u_C1R_NEW(apdDCT[i], aDCTStep[i], | ||
613 | - apSrcImage[i], aSrcImageStep[i], | ||
614 | - pdQuantizationTables + oFrameHeader.aQuantizationTableSelector[i] * 64, | ||
615 | - aSrcSize[i], | ||
616 | - pDCTState)); | ||
617 | - } | ||
618 | - | ||
619 | - //Npp16s | ||
620 | -} | ||
621 | - | ||
622 | -int EncodeJPEG(char* SaveFileName) | ||
623 | -{ | ||
624 | - | ||
625 | - | ||
626 | - /*Npp8u *apSrcImageTest[3]; | ||
627 | - | ||
628 | - | ||
629 | - for (int i = 0; i < 3; i++) | ||
630 | - { | ||
631 | - size_t nPitch; | ||
632 | - NPP_CHECK_CUDA(cudaMalloc(&apSrcImageTest[i], 1920 * 1080 * sizeof(Npp8u))); | ||
633 | - NPP_CHECK_CUDA(cudaMemcpy(apSrcImageTest[i], imgData[i], 1920 * 1080 * sizeof(Npp8u), cudaMemcpyDeviceToDevice)); | ||
634 | - } | ||
635 | -*/ | ||
636 | - for (int i = 0; i < 3; i++) | ||
637 | - { | ||
638 | - NPP_CHECK_NPP(nppiDCTQuantFwd8x8LS_JPEG_8u16s_C1R_NEW(apSrcImage[i], aSrcImageStep[i], | ||
639 | - apdDCT_My[i], aDCTStep[i], | ||
640 | - pdQuantizationTables + oFrameHeader.aQuantizationTableSelector[i] * 64, | ||
641 | - aSrcSize[i], | ||
642 | - pDCTState | ||
643 | - )); | ||
644 | - } | ||
645 | - | ||
646 | - //后面的代码是关于图像编码的 | ||
647 | - /*************************** | ||
648 | - * | ||
649 | - * Processing | ||
650 | - * | ||
651 | - ***************************/ | ||
652 | - | ||
653 | - // Compute channel sizes as stored in the output JPEG (8x8 blocks & MCU block layout) | ||
654 | - /*************** 1. 求输出图像的大小********************/ | ||
655 | - NppiSize oDstImageSize; | ||
656 | - float frameWidth = floor((float)oFrameHeader.nWidth); //原图像大小 * 防缩比例 | ||
657 | - float frameHeight = floor((float)oFrameHeader.nHeight); | ||
658 | - | ||
659 | - oDstImageSize.width = (int)max(1.0f, frameWidth); | ||
660 | - oDstImageSize.height = (int)max(1.0f, frameHeight); | ||
661 | - | ||
662 | - //cout << "Output Size: " << oDstImageSize.width << "x" << oDstImageSize.height << "x" << static_cast<int>(oFrameHeader.nComponents) << endl; | ||
663 | - | ||
664 | - | ||
665 | - /*************** 2. 求aDstSize的大小********************/ | ||
666 | - for (int i = 0; i < oFrameHeader.nComponents; ++i) //3次 | ||
667 | - { | ||
668 | - NppiSize oBlocks; | ||
669 | - NppiSize oBlocksPerMCU = { oFrameHeader.aSamplingFactors[i] & 0x0f, oFrameHeader.aSamplingFactors[i] >> 4 }; | ||
670 | - | ||
671 | - oBlocks.width = (int)ceil((oDstImageSize.width + 7) / 8 * | ||
672 | - static_cast<float>(oBlocksPerMCU.width) / nMCUBlocksH); | ||
673 | - oBlocks.width = DivUp(oBlocks.width, oBlocksPerMCU.width) * oBlocksPerMCU.width; | ||
674 | - | ||
675 | - oBlocks.height = (int)ceil((oDstImageSize.height + 7) / 8 * | ||
676 | - static_cast<float>(oBlocksPerMCU.height) / nMCUBlocksV); | ||
677 | - oBlocks.height = DivUp(oBlocks.height, oBlocksPerMCU.height) * oBlocksPerMCU.height; | ||
678 | - | ||
679 | - aDstSize[i].width = oBlocks.width * 8; | ||
680 | - aDstSize[i].height = oBlocks.height * 8; | ||
681 | - | ||
682 | - //cout << "***********" << aDstSize[i].width << " " << aDstSize[i].height << "***********" << endl; | ||
683 | - ////不影响保存 但是不确定能不能删除 | ||
684 | - //Allocate Memory | ||
685 | - size_t nPitch; | ||
686 | - NPP_CHECK_CUDA(cudaMallocPitch(&apDstImage[i], &nPitch, aDstSize[i].width, aDstSize[i].height)); | ||
687 | - aDstImageStep[i] = static_cast<Npp32s>(nPitch); | ||
688 | - } | ||
689 | - | ||
690 | - /*************** 3. Huffman Encoding********************/ | ||
691 | - // Huffman Encoding | ||
692 | - Npp8u *pdScan; | ||
693 | - Npp32s nScanLength; | ||
694 | - NPP_CHECK_CUDA(cudaMalloc(&pdScan, 4 << 20)); | ||
695 | - | ||
696 | - Npp8u *pJpegEncoderTemp; | ||
697 | - Npp32s nTempSize; | ||
698 | - NPP_CHECK_NPP(nppiEncodeHuffmanGetSize(aSrcSize[0], 3, &nTempSize)); | ||
699 | - NPP_CHECK_CUDA(cudaMalloc(&pJpegEncoderTemp, nTempSize)); | ||
700 | - | ||
701 | - NppiEncodeHuffmanSpec *apHuffmanDCTable[3]; | ||
702 | - NppiEncodeHuffmanSpec *apHuffmanACTable[3]; | ||
703 | - | ||
704 | - for (int i = 0; i < 3; ++i) | ||
705 | - { | ||
706 | - nppiEncodeHuffmanSpecInitAlloc_JPEG(pHuffmanDCTables[(oScanHeader.aHuffmanTablesSelector[i] >> 4)].aCodes, nppiDCTable, &apHuffmanDCTable[i]); | ||
707 | - nppiEncodeHuffmanSpecInitAlloc_JPEG(pHuffmanACTables[(oScanHeader.aHuffmanTablesSelector[i] & 0x0f)].aCodes, nppiACTable, &apHuffmanACTable[i]); | ||
708 | - } | ||
709 | - | ||
710 | - //Npp16s *apdDCT1[3] = { 0, 0, 0 }; | ||
711 | - //Huffman Encode | ||
712 | - //apdDCT = (Npp16s*)(img); | ||
713 | - NPP_CHECK_NPP(nppiEncodeHuffmanScan_JPEG_8u16s_P3R(apdDCT_My, aDCTStep, | ||
714 | - 0, oScanHeader.nSs, oScanHeader.nSe, oScanHeader.nA >> 4, oScanHeader.nA & 0x0f, | ||
715 | - pdScan, &nScanLength, | ||
716 | - apHuffmanDCTable, //在这之前申请 在这之后释放 | ||
717 | - apHuffmanACTable, //在这之前申请 在这之后释放 | ||
718 | - aDstSize, | ||
719 | - pJpegEncoderTemp)); | ||
720 | - | ||
721 | - for (int i = 0; i < 3; ++i) | ||
722 | - { | ||
723 | - nppiEncodeHuffmanSpecFree_JPEG(apHuffmanDCTable[i]); | ||
724 | - nppiEncodeHuffmanSpecFree_JPEG(apHuffmanACTable[i]); | ||
725 | - } | ||
726 | - | ||
727 | - //Write JPEG | ||
728 | - unsigned char *pDstJpeg = new unsigned char[4 << 20]{}; | ||
729 | - unsigned char *pDstOutput = pDstJpeg; | ||
730 | - | ||
731 | - oFrameHeader.nWidth = oDstImageSize.width; | ||
732 | - oFrameHeader.nHeight = oDstImageSize.height; | ||
733 | - | ||
734 | - writeMarker(0x0D8, pDstOutput); | ||
735 | - writeJFIFTag(pDstOutput); | ||
736 | - writeQuantizationTable(aQuantizationTables[0], pDstOutput); | ||
737 | - writeQuantizationTable(aQuantizationTables[1], pDstOutput); | ||
738 | - writeFrameHeader(oFrameHeader, pDstOutput); | ||
739 | - writeHuffmanTable(pHuffmanDCTables[0], pDstOutput); | ||
740 | - writeHuffmanTable(pHuffmanACTables[0], pDstOutput); | ||
741 | - writeHuffmanTable(pHuffmanDCTables[1], pDstOutput); | ||
742 | - writeHuffmanTable(pHuffmanACTables[1], pDstOutput); | ||
743 | - writeScanHeader(oScanHeader, pDstOutput); | ||
744 | - NPP_CHECK_CUDA(cudaMemcpy(pDstOutput, pdScan, nScanLength, cudaMemcpyDeviceToHost)); | ||
745 | - pDstOutput += nScanLength; | ||
746 | - writeMarker(0x0D9, pDstOutput); | ||
747 | - | ||
748 | - { | ||
749 | - // Write result to file. | ||
750 | - std::ofstream outputFile(SaveFileName, ios::out | ios::binary); | ||
751 | - outputFile.write(reinterpret_cast<const char *>(pDstJpeg), static_cast<int>(pDstOutput - pDstJpeg)); | ||
752 | - } | ||
753 | - | ||
754 | - // Cleanup | ||
755 | - cudaFree(pJpegEncoderTemp); | ||
756 | - cudaFree(pdScan); | ||
757 | - //delete[] pJpegData; | ||
758 | - delete[] pDstJpeg; | ||
759 | -/* | ||
760 | - | ||
761 | - cudaFree(pdQuantizationTables); | ||
762 | - | ||
763 | - | ||
764 | - nppiDCTFree(pDCTState); | ||
765 | - */ | ||
766 | - for (int i = 0; i < 3; ++i) | ||
767 | - { | ||
768 | - /* cudaFree(apdDCT[i]); | ||
769 | - cudaFree(apdDCT_My[i]); | ||
770 | - cudaFreeHost(aphDCT[i]); | ||
771 | - cudaFree(apSrcImage[i]);*/ | ||
772 | - cudaFree(apDstImage[i]); | ||
773 | - } | ||
774 | - | ||
775 | - return EXIT_SUCCESS; | ||
776 | -} | ||
777 | - | ||
778 | - | ||
779 | - | ||
780 | -// | ||
781 | -//int main(int argc, char **argv) | ||
782 | -//{ | ||
783 | -// // Min spec is SM 2.0 devices | ||
784 | -// if (printfNPPinfo(argc, argv, 2, 0) == false) | ||
785 | -// { | ||
786 | -// cerr << "jpegNPP requires a GPU with Compute Capability 2.0 or higher" << endl; | ||
787 | -// return EXIT_SUCCESS; | ||
788 | -// } | ||
789 | -// | ||
790 | -// const char *szInputFile; | ||
791 | -// const char *szOutputFile; | ||
792 | -// //float nScaleFactor; | ||
793 | -// | ||
794 | -// if ((argc == 1) || checkCmdLineFlag(argc, (const char **)argv, "help")) | ||
795 | -// { | ||
796 | -// printHelp(); | ||
797 | -// } | ||
798 | -// | ||
799 | -// if (checkCmdLineFlag(argc, (const char **)argv, "input")) | ||
800 | -// { | ||
801 | -// getCmdLineArgumentString(argc, (const char **)argv, "input", (char **)&szInputFile); | ||
802 | -// } | ||
803 | -// else | ||
804 | -// { | ||
805 | -// szInputFile = sdkFindFilePath("18.jpg", argv[0]); | ||
806 | -// } | ||
807 | -// | ||
808 | -// cout << "Source File: " << szInputFile << endl; | ||
809 | -// | ||
810 | -// if (checkCmdLineFlag(argc, (const char **)argv, "output")) | ||
811 | -// { | ||
812 | -// getCmdLineArgumentString(argc, (const char **)argv, "output", (char **)&szOutputFile); | ||
813 | -// } | ||
814 | -// else | ||
815 | -// { | ||
816 | -// szOutputFile = "scaled.jpg"; | ||
817 | -// } | ||
818 | -// | ||
819 | -// cout << "Output File mm: " << szOutputFile << endl; | ||
820 | -// | ||
821 | -// /*if (checkCmdLineFlag(argc, (const char **)argv, "scale")) | ||
822 | -// { | ||
823 | -// nScaleFactor = max(0.0f, min(getCmdLineArgumentFloat(argc, (const char **)argv, "scale"), 1.0f)); | ||
824 | -// } | ||
825 | -// else | ||
826 | -// { | ||
827 | -// nScaleFactor = 1.0f; | ||
828 | -// } | ||
829 | -// | ||
830 | -// cout << "Scale Factor: " << nScaleFactor << endl;*/ | ||
831 | -// | ||
832 | -// NppiDCTState *pDCTState; | ||
833 | -// NPP_CHECK_NPP(nppiDCTInitAlloc(&pDCTState)); | ||
834 | -// | ||
835 | -// unsigned char *pJpegData = 0; | ||
836 | -// int nInputLength = 0; | ||
837 | -// | ||
838 | -// // Load Jpeg | ||
839 | -// loadJpeg(szInputFile, pJpegData, nInputLength); | ||
840 | -// | ||
841 | -// if (pJpegData == 0) | ||
842 | -// { | ||
843 | -// cerr << "Input File Error: " << szInputFile << endl; | ||
844 | -// return EXIT_FAILURE; | ||
845 | -// } | ||
846 | -// | ||
847 | -// /*************************** | ||
848 | -// * | ||
849 | -// * Input | ||
850 | -// * | ||
851 | -// ***************************/ | ||
852 | -// | ||
853 | -// | ||
854 | -// // Check if this is a valid JPEG file | ||
855 | -// int nPos = 0; | ||
856 | -// int nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
857 | -// | ||
858 | -// if (nMarker != 0x0D8) | ||
859 | -// { | ||
860 | -// cerr << "Invalid Jpeg Image" << endl; | ||
861 | -// return EXIT_FAILURE; | ||
862 | -// } | ||
863 | -// | ||
864 | -// nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
865 | -// | ||
866 | -// // Parsing and Huffman Decoding (on host) | ||
867 | -// FrameHeader oFrameHeader; | ||
868 | -// QuantizationTable aQuantizationTables[4]; | ||
869 | -// Npp8u *pdQuantizationTables; | ||
870 | -// cudaMalloc(&pdQuantizationTables, 64 * 4); | ||
871 | -// | ||
872 | -// HuffmanTable aHuffmanTables[4]; | ||
873 | -// HuffmanTable *pHuffmanDCTables = aHuffmanTables; | ||
874 | -// HuffmanTable *pHuffmanACTables = &aHuffmanTables[2]; | ||
875 | -// ScanHeader oScanHeader; | ||
876 | -// memset(&oFrameHeader, 0, sizeof(FrameHeader)); | ||
877 | -// memset(aQuantizationTables, 0, 4 * sizeof(QuantizationTable)); | ||
878 | -// memset(aHuffmanTables, 0, 4 * sizeof(HuffmanTable)); | ||
879 | -// int nMCUBlocksH = 0; | ||
880 | -// int nMCUBlocksV = 0; | ||
881 | -// | ||
882 | -// int nRestartInterval = -1; | ||
883 | -// | ||
884 | -// NppiSize aSrcSize[3]; | ||
885 | -// Npp16s *aphDCT[3] = { 0, 0, 0 }; | ||
886 | -// Npp16s *apdDCT[3] = { 0, 0, 0 }; | ||
887 | -// Npp32s aDCTStep[3]; | ||
888 | -// | ||
889 | -// Npp8u *apSrcImage[3] = { 0, 0, 0 }; | ||
890 | -// Npp32s aSrcImageStep[3]; | ||
891 | -// | ||
892 | -// Npp8u *apDstImage[3] = { 0, 0, 0 }; | ||
893 | -// Npp32s aDstImageStep[3]; | ||
894 | -// NppiSize aDstSize[3]; | ||
895 | -// | ||
896 | -// while (nMarker != -1) | ||
897 | -// { | ||
898 | -// if (nMarker == 0x0D8) | ||
899 | -// { | ||
900 | -// // Embedded Thumbnail, skip it | ||
901 | -// int nNextMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
902 | -// | ||
903 | -// while (nNextMarker != -1 && nNextMarker != 0x0D9) | ||
904 | -// { | ||
905 | -// nNextMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
906 | -// } | ||
907 | -// } | ||
908 | -// | ||
909 | -// if (nMarker == 0x0DD) | ||
910 | -// { | ||
911 | -// readRestartInterval(pJpegData + nPos, nRestartInterval); | ||
912 | -// } | ||
913 | -// | ||
914 | -// if ((nMarker == 0x0C0) | (nMarker == 0x0C2)) | ||
915 | -// { | ||
916 | -// //Assert Baseline for this Sample | ||
917 | -// //Note: NPP does support progressive jpegs for both encode and decode | ||
918 | -// if (nMarker != 0x0C0) | ||
919 | -// { | ||
920 | -// cerr << "The sample does only support baseline JPEG images" << endl; | ||
921 | -// return EXIT_SUCCESS; | ||
922 | -// } | ||
923 | -// | ||
924 | -// // Baseline or Progressive Frame Header | ||
925 | -// readFrameHeader(pJpegData + nPos, oFrameHeader); | ||
926 | -// cout << "Image Size: " << oFrameHeader.nWidth << "x" << oFrameHeader.nHeight << "x" << static_cast<int>(oFrameHeader.nComponents) << endl; | ||
927 | -// | ||
928 | -// //Assert 3-Channel Image for this Sample | ||
929 | -// if (oFrameHeader.nComponents != 3) | ||
930 | -// { | ||
931 | -// cerr << "The sample does only support color JPEG images" << endl; | ||
932 | -// return EXIT_SUCCESS; | ||
933 | -// } | ||
934 | -// | ||
935 | -// // Compute channel sizes as stored in the JPEG (8x8 blocks & MCU block layout) | ||
936 | -// for (int i = 0; i < oFrameHeader.nComponents; ++i) | ||
937 | -// { | ||
938 | -// nMCUBlocksV = max(nMCUBlocksV, oFrameHeader.aSamplingFactors[i] & 0x0f); | ||
939 | -// nMCUBlocksH = max(nMCUBlocksH, oFrameHeader.aSamplingFactors[i] >> 4); | ||
940 | -// } | ||
941 | -// | ||
942 | -// for (int i = 0; i < oFrameHeader.nComponents; ++i) | ||
943 | -// { | ||
944 | -// NppiSize oBlocks; | ||
945 | -// NppiSize oBlocksPerMCU = { oFrameHeader.aSamplingFactors[i] >> 4, oFrameHeader.aSamplingFactors[i] & 0x0f }; | ||
946 | -// | ||
947 | -// oBlocks.width = (int)ceil((oFrameHeader.nWidth + 7) / 8 * | ||
948 | -// static_cast<float>(oBlocksPerMCU.width) / nMCUBlocksH); | ||
949 | -// oBlocks.width = DivUp(oBlocks.width, oBlocksPerMCU.width) * oBlocksPerMCU.width; | ||
950 | -// | ||
951 | -// oBlocks.height = (int)ceil((oFrameHeader.nHeight + 7) / 8 * | ||
952 | -// static_cast<float>(oBlocksPerMCU.height) / nMCUBlocksV); | ||
953 | -// oBlocks.height = DivUp(oBlocks.height, oBlocksPerMCU.height) * oBlocksPerMCU.height; | ||
954 | -// | ||
955 | -// aSrcSize[i].width = oBlocks.width * 8; | ||
956 | -// aSrcSize[i].height = oBlocks.height * 8; | ||
957 | -// | ||
958 | -// // Allocate Memory | ||
959 | -// size_t nPitch; | ||
960 | -// NPP_CHECK_CUDA(cudaMallocPitch(&apdDCT[i], &nPitch, oBlocks.width * 64 * sizeof(Npp16s), oBlocks.height)); | ||
961 | -// aDCTStep[i] = static_cast<Npp32s>(nPitch); | ||
962 | -// | ||
963 | -// NPP_CHECK_CUDA(cudaMallocPitch(&apSrcImage[i], &nPitch, aSrcSize[i].width, aSrcSize[i].height)); | ||
964 | -// aSrcImageStep[i] = static_cast<Npp32s>(nPitch); | ||
965 | -// | ||
966 | -// NPP_CHECK_CUDA(cudaHostAlloc(&aphDCT[i], aDCTStep[i] * oBlocks.height, cudaHostAllocDefault)); | ||
967 | -// } | ||
968 | -// } | ||
969 | -// | ||
970 | -// if (nMarker == 0x0DB) | ||
971 | -// { | ||
972 | -// // Quantization Tables | ||
973 | -// readQuantizationTables(pJpegData + nPos, aQuantizationTables); | ||
974 | -// } | ||
975 | -// | ||
976 | -// if (nMarker == 0x0C4) | ||
977 | -// { | ||
978 | -// // Huffman Tables | ||
979 | -// readHuffmanTables(pJpegData + nPos, aHuffmanTables); | ||
980 | -// } | ||
981 | -// | ||
982 | -// if (nMarker == 0x0DA) | ||
983 | -// { | ||
984 | -// // Scan | ||
985 | -// readScanHeader(pJpegData + nPos, oScanHeader); | ||
986 | -// nPos += 6 + oScanHeader.nComponents * 2; | ||
987 | -// | ||
988 | -// int nAfterNextMarkerPos = nPos; | ||
989 | -// int nAfterScanMarker = nextMarker(pJpegData, nAfterNextMarkerPos, nInputLength); | ||
990 | -// | ||
991 | -// if (nRestartInterval > 0) | ||
992 | -// { | ||
993 | -// while (nAfterScanMarker >= 0x0D0 && nAfterScanMarker <= 0x0D7) | ||
994 | -// { | ||
995 | -// // This is a restart marker, go on | ||
996 | -// nAfterScanMarker = nextMarker(pJpegData, nAfterNextMarkerPos, nInputLength); | ||
997 | -// } | ||
998 | -// } | ||
999 | -// | ||
1000 | -// NppiDecodeHuffmanSpec *apHuffmanDCTable[3]; | ||
1001 | -// NppiDecodeHuffmanSpec *apHuffmanACTable[3]; | ||
1002 | -// | ||
1003 | -// for (int i = 0; i < 3; ++i) | ||
1004 | -// { | ||
1005 | -// nppiDecodeHuffmanSpecInitAllocHost_JPEG(pHuffmanDCTables[(oScanHeader.aHuffmanTablesSelector[i] >> 4)].aCodes, nppiDCTable, &apHuffmanDCTable[i]); | ||
1006 | -// nppiDecodeHuffmanSpecInitAllocHost_JPEG(pHuffmanACTables[(oScanHeader.aHuffmanTablesSelector[i] & 0x0f)].aCodes, nppiACTable, &apHuffmanACTable[i]); | ||
1007 | -// } | ||
1008 | -// | ||
1009 | -// NPP_CHECK_NPP(nppiDecodeHuffmanScanHost_JPEG_8u16s_P3R(pJpegData + nPos, nAfterNextMarkerPos - nPos - 2, | ||
1010 | -// nRestartInterval, oScanHeader.nSs, oScanHeader.nSe, oScanHeader.nA >> 4, oScanHeader.nA & 0x0f, | ||
1011 | -// aphDCT, aDCTStep, | ||
1012 | -// apHuffmanDCTable, | ||
1013 | -// apHuffmanACTable, | ||
1014 | -// aSrcSize)); | ||
1015 | -// | ||
1016 | -// for (int i = 0; i < 3; ++i) | ||
1017 | -// { | ||
1018 | -// nppiDecodeHuffmanSpecFreeHost_JPEG(apHuffmanDCTable[i]); | ||
1019 | -// nppiDecodeHuffmanSpecFreeHost_JPEG(apHuffmanACTable[i]); | ||
1020 | -// } | ||
1021 | -// } | ||
1022 | -// | ||
1023 | -// nMarker = nextMarker(pJpegData, nPos, nInputLength); | ||
1024 | -// } | ||
1025 | -// | ||
1026 | -// // Copy DCT coefficients and Quantization Tables from host to device | ||
1027 | -// for (int i = 0; i < 4; ++i) | ||
1028 | -// { | ||
1029 | -// NPP_CHECK_CUDA(cudaMemcpyAsync(pdQuantizationTables + i * 64, aQuantizationTables[i].aTable, 64, cudaMemcpyHostToDevice)); | ||
1030 | -// } | ||
1031 | -// | ||
1032 | -// for (int i = 0; i < 3; ++i) | ||
1033 | -// { | ||
1034 | -// NPP_CHECK_CUDA(cudaMemcpyAsync(apdDCT[i], aphDCT[i], aDCTStep[i] * aSrcSize[i].height / 8, cudaMemcpyHostToDevice)); | ||
1035 | -// } | ||
1036 | -// | ||
1037 | -// // Inverse DCT | ||
1038 | -// //该函数实现了将jpeg图像 解码成 YUV数据 | ||
1039 | -// //for (int i = 0; i < 3; ++i) | ||
1040 | -// //{ | ||
1041 | -// // NPP_CHECK_NPP(nppiDCTQuantInv8x8LS_JPEG_16s8u_C1R_NEW(apdDCT[i], aDCTStep[i], | ||
1042 | -// // apSrcImage[i], aSrcImageStep[i], | ||
1043 | -// // pdQuantizationTables + oFrameHeader.aQuantizationTableSelector[i] * 64, | ||
1044 | -// // aSrcSize[i], | ||
1045 | -// // pDCTState)); | ||
1046 | -// //} | ||
1047 | -// | ||
1048 | -// //后面的代码是关于图像编码的 | ||
1049 | -// /*************************** | ||
1050 | -// * | ||
1051 | -// * Processing | ||
1052 | -// * | ||
1053 | -// ***************************/ | ||
1054 | -// | ||
1055 | -// // Compute channel sizes as stored in the output JPEG (8x8 blocks & MCU block layout) | ||
1056 | -// /*************** 1. 求输出图像的大小********************/ | ||
1057 | -// NppiSize oDstImageSize; | ||
1058 | -// float frameWidth = floor((float)oFrameHeader.nWidth); //原图像大小 * 防缩比例 | ||
1059 | -// float frameHeight = floor((float)oFrameHeader.nHeight); | ||
1060 | -// | ||
1061 | -// oDstImageSize.width = (int)max(1.0f, frameWidth); | ||
1062 | -// oDstImageSize.height = (int)max(1.0f, frameHeight); | ||
1063 | -// | ||
1064 | -// cout << "Output Size: " << oDstImageSize.width << "x" << oDstImageSize.height << "x" << static_cast<int>(oFrameHeader.nComponents) << endl; | ||
1065 | -// | ||
1066 | -// | ||
1067 | -// /*************** 2. 求aDstSize的大小********************/ | ||
1068 | -// for (int i = 0; i < oFrameHeader.nComponents; ++i) //3次 | ||
1069 | -// { | ||
1070 | -// NppiSize oBlocks; | ||
1071 | -// NppiSize oBlocksPerMCU = { oFrameHeader.aSamplingFactors[i] & 0x0f, oFrameHeader.aSamplingFactors[i] >> 4 }; | ||
1072 | -// | ||
1073 | -// oBlocks.width = (int)ceil((oDstImageSize.width + 7) / 8 * | ||
1074 | -// static_cast<float>(oBlocksPerMCU.width) / nMCUBlocksH); | ||
1075 | -// oBlocks.width = DivUp(oBlocks.width, oBlocksPerMCU.width) * oBlocksPerMCU.width; | ||
1076 | -// | ||
1077 | -// oBlocks.height = (int)ceil((oDstImageSize.height + 7) / 8 * | ||
1078 | -// static_cast<float>(oBlocksPerMCU.height) / nMCUBlocksV); | ||
1079 | -// oBlocks.height = DivUp(oBlocks.height, oBlocksPerMCU.height) * oBlocksPerMCU.height; | ||
1080 | -// | ||
1081 | -// aDstSize[i].width = oBlocks.width * 8; | ||
1082 | -// aDstSize[i].height = oBlocks.height * 8; | ||
1083 | -// | ||
1084 | -// cout << "***********" << aDstSize[i].width << " " << aDstSize[i].height << "***********" << endl; | ||
1085 | -// ////不影响保存 但是不确定能不能删除 | ||
1086 | -// //Allocate Memory | ||
1087 | -// /*size_t nPitch; | ||
1088 | -// NPP_CHECK_CUDA(cudaMallocPitch(&apDstImage[i], &nPitch, aDstSize[i].width, aDstSize[i].height)); | ||
1089 | -// aDstImageStep[i] = static_cast<Npp32s>(nPitch);*/ | ||
1090 | -// } | ||
1091 | -// | ||
1092 | -// /*************** 3. Huffman Encoding********************/ | ||
1093 | -// // Huffman Encoding | ||
1094 | -// Npp8u *pdScan; | ||
1095 | -// Npp32s nScanLength; | ||
1096 | -// NPP_CHECK_CUDA(cudaMalloc(&pdScan, 4 << 20)); | ||
1097 | -// | ||
1098 | -// Npp8u *pJpegEncoderTemp; | ||
1099 | -// Npp32s nTempSize; | ||
1100 | -// NPP_CHECK_NPP(nppiEncodeHuffmanGetSize(aSrcSize[0], 3, &nTempSize)); | ||
1101 | -// NPP_CHECK_CUDA(cudaMalloc(&pJpegEncoderTemp, nTempSize)); | ||
1102 | -// | ||
1103 | -// NppiEncodeHuffmanSpec *apHuffmanDCTable[3]; | ||
1104 | -// NppiEncodeHuffmanSpec *apHuffmanACTable[3]; | ||
1105 | -// | ||
1106 | -// for (int i = 0; i < 3; ++i) | ||
1107 | -// { | ||
1108 | -// nppiEncodeHuffmanSpecInitAlloc_JPEG(pHuffmanDCTables[(oScanHeader.aHuffmanTablesSelector[i] >> 4)].aCodes, nppiDCTable, &apHuffmanDCTable[i]); | ||
1109 | -// nppiEncodeHuffmanSpecInitAlloc_JPEG(pHuffmanACTables[(oScanHeader.aHuffmanTablesSelector[i] & 0x0f)].aCodes, nppiACTable, &apHuffmanACTable[i]); | ||
1110 | -// } | ||
1111 | -// | ||
1112 | -// //Npp16s *apdDCT1[3] = { 0, 0, 0 }; | ||
1113 | -// //Huffman Encode | ||
1114 | -// NPP_CHECK_NPP(nppiEncodeHuffmanScan_JPEG_8u16s_P3R(apdDCT, aDCTStep, | ||
1115 | -// 0, oScanHeader.nSs, oScanHeader.nSe, oScanHeader.nA >> 4, oScanHeader.nA & 0x0f, | ||
1116 | -// pdScan, &nScanLength, | ||
1117 | -// apHuffmanDCTable, //在这之前申请 在这之后释放 | ||
1118 | -// apHuffmanACTable, //在这之前申请 在这之后释放 | ||
1119 | -// aDstSize, | ||
1120 | -// pJpegEncoderTemp)); | ||
1121 | -// | ||
1122 | -// for (int i = 0; i < 3; ++i) | ||
1123 | -// { | ||
1124 | -// nppiEncodeHuffmanSpecFree_JPEG(apHuffmanDCTable[i]); | ||
1125 | -// nppiEncodeHuffmanSpecFree_JPEG(apHuffmanACTable[i]); | ||
1126 | -// } | ||
1127 | -// | ||
1128 | -// //Write JPEG | ||
1129 | -// unsigned char *pDstJpeg = new unsigned char[4 << 20]; | ||
1130 | -// unsigned char *pDstOutput = pDstJpeg; | ||
1131 | -// | ||
1132 | -// oFrameHeader.nWidth = oDstImageSize.width; | ||
1133 | -// oFrameHeader.nHeight = oDstImageSize.height; | ||
1134 | -// | ||
1135 | -// writeMarker(0x0D8, pDstOutput); | ||
1136 | -// writeJFIFTag(pDstOutput); | ||
1137 | -// writeQuantizationTable(aQuantizationTables[0], pDstOutput); | ||
1138 | -// writeQuantizationTable(aQuantizationTables[1], pDstOutput); | ||
1139 | -// writeFrameHeader(oFrameHeader, pDstOutput); | ||
1140 | -// writeHuffmanTable(pHuffmanDCTables[0], pDstOutput); | ||
1141 | -// writeHuffmanTable(pHuffmanACTables[0], pDstOutput); | ||
1142 | -// writeHuffmanTable(pHuffmanDCTables[1], pDstOutput); | ||
1143 | -// writeHuffmanTable(pHuffmanACTables[1], pDstOutput); | ||
1144 | -// writeScanHeader(oScanHeader, pDstOutput); | ||
1145 | -// NPP_CHECK_CUDA(cudaMemcpy(pDstOutput, pdScan, nScanLength, cudaMemcpyDeviceToHost)); | ||
1146 | -// pDstOutput += nScanLength; | ||
1147 | -// writeMarker(0x0D9, pDstOutput); | ||
1148 | -// | ||
1149 | -// { | ||
1150 | -// // Write result to file. | ||
1151 | -// std::ofstream outputFile(szOutputFile, ios::out | ios::binary); | ||
1152 | -// outputFile.write(reinterpret_cast<const char *>(pDstJpeg), static_cast<int>(pDstOutput - pDstJpeg)); | ||
1153 | -// } | ||
1154 | -// | ||
1155 | -// // Cleanup | ||
1156 | -// delete[] pJpegData; | ||
1157 | -// delete[] pDstJpeg; | ||
1158 | -// | ||
1159 | -// cudaFree(pJpegEncoderTemp); | ||
1160 | -// cudaFree(pdQuantizationTables); | ||
1161 | -// cudaFree(pdScan); | ||
1162 | -// | ||
1163 | -// nppiDCTFree(pDCTState); | ||
1164 | -// | ||
1165 | -// for (int i = 0; i < 3; ++i) | ||
1166 | -// { | ||
1167 | -// cudaFree(apdDCT[i]); | ||
1168 | -// cudaFreeHost(aphDCT[i]); | ||
1169 | -// cudaFree(apSrcImage[i]); | ||
1170 | -// cudaFree(apDstImage[i]); | ||
1171 | -// } | ||
1172 | -// | ||
1173 | -// return EXIT_SUCCESS; | ||
1174 | -//} |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/putText.cpp-- deleted
1 | -#include "putText.h" | ||
2 | - | ||
3 | -void GetStringSize(HDC hDC, const char* str, int* w, int* h) | ||
4 | -{ | ||
5 | - SIZE size; | ||
6 | - GetTextExtentPoint32A(hDC, str, strlen(str), &size); | ||
7 | - if (w != 0) *w = size.cx; | ||
8 | - if (h != 0) *h = size.cy; | ||
9 | -} | ||
10 | - | ||
11 | -void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline) | ||
12 | -{ | ||
13 | - CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3)); | ||
14 | - | ||
15 | - int x, y, r, b; | ||
16 | - if (org.x > dst.cols || org.y > dst.rows) return; | ||
17 | - x = org.x < 0 ? -org.x : 0; | ||
18 | - y = org.y < 0 ? -org.y : 0; | ||
19 | - | ||
20 | - LOGFONTA lf; | ||
21 | - lf.lfHeight = -fontSize; | ||
22 | - lf.lfWidth = 0; | ||
23 | - lf.lfEscapement = 0; | ||
24 | - lf.lfOrientation = 0; | ||
25 | - lf.lfWeight = 5; | ||
26 | - lf.lfItalic = italic; //斜体 | ||
27 | - lf.lfUnderline = underline; //下划线 | ||
28 | - lf.lfStrikeOut = 0; | ||
29 | - lf.lfCharSet = DEFAULT_CHARSET; | ||
30 | - lf.lfOutPrecision = 0; | ||
31 | - lf.lfClipPrecision = 0; | ||
32 | - lf.lfQuality = PROOF_QUALITY; | ||
33 | - lf.lfPitchAndFamily = 0; | ||
34 | - strcpy_s(lf.lfFaceName, fn); | ||
35 | - | ||
36 | - HFONT hf = CreateFontIndirectA(&lf); | ||
37 | - HDC hDC = CreateCompatibleDC(0); | ||
38 | - HFONT hOldFont = (HFONT)SelectObject(hDC, hf); | ||
39 | - | ||
40 | - int strBaseW = 0, strBaseH = 0; | ||
41 | - int singleRow = 0; | ||
42 | - char buf[1 << 12]; | ||
43 | - strcpy_s(buf, str); | ||
44 | - char *bufT[1 << 12]; // 这个用于分隔字符串后剩余的字符,可能会超出。 | ||
45 | - //处理多行 | ||
46 | - { | ||
47 | - int nnh = 0; | ||
48 | - int cw, ch; | ||
49 | - | ||
50 | - const char* ln = strtok_s(buf, "\n", bufT); | ||
51 | - while (ln != 0) | ||
52 | - { | ||
53 | - GetStringSize(hDC, ln, &cw, &ch); | ||
54 | - strBaseW = max(strBaseW, cw); | ||
55 | - strBaseH = max(strBaseH, ch); | ||
56 | - | ||
57 | - ln = strtok_s(0, "\n", bufT); | ||
58 | - nnh++; | ||
59 | - } | ||
60 | - singleRow = strBaseH; | ||
61 | - strBaseH *= nnh; | ||
62 | - } | ||
63 | - | ||
64 | - if (org.x + strBaseW < 0 || org.y + strBaseH < 0) | ||
65 | - { | ||
66 | - SelectObject(hDC, hOldFont); | ||
67 | - DeleteObject(hf); | ||
68 | - DeleteObject(hDC); | ||
69 | - return; | ||
70 | - } | ||
71 | - | ||
72 | - r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1; | ||
73 | - b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1; | ||
74 | - org.x = org.x < 0 ? 0 : org.x; | ||
75 | - org.y = org.y < 0 ? 0 : org.y; | ||
76 | - | ||
77 | - BITMAPINFO bmp = { 0 }; | ||
78 | - BITMAPINFOHEADER& bih = bmp.bmiHeader; | ||
79 | - int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4)); | ||
80 | - | ||
81 | - bih.biSize = sizeof(BITMAPINFOHEADER); | ||
82 | - bih.biWidth = strBaseW; | ||
83 | - bih.biHeight = strBaseH; | ||
84 | - bih.biPlanes = 1; | ||
85 | - bih.biBitCount = 24; | ||
86 | - bih.biCompression = BI_RGB; | ||
87 | - bih.biSizeImage = strBaseH * strDrawLineStep; | ||
88 | - bih.biClrUsed = 0; | ||
89 | - bih.biClrImportant = 0; | ||
90 | - | ||
91 | - void* pDibData = 0; | ||
92 | - HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0); | ||
93 | - | ||
94 | - CV_Assert(pDibData != 0); | ||
95 | - HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp); | ||
96 | - | ||
97 | - //color.val[2], color.val[1], color.val[0] | ||
98 | - SetTextColor(hDC, RGB(255, 255, 255)); | ||
99 | - SetBkColor(hDC, 0); | ||
100 | - //SetStretchBltMode(hDC, COLORONCOLOR); | ||
101 | - | ||
102 | - strcpy_s(buf, str); | ||
103 | - const char* ln = strtok_s(buf, "\n", bufT); | ||
104 | - int outTextY = 0; | ||
105 | - while (ln != 0) | ||
106 | - { | ||
107 | - TextOutA(hDC, 0, outTextY, ln, strlen(ln)); | ||
108 | - outTextY += singleRow; | ||
109 | - ln = strtok_s(0, "\n", bufT); | ||
110 | - } | ||
111 | - uchar* dstData = (uchar*)dst.data; | ||
112 | - int dstStep = dst.step / sizeof(dstData[0]); | ||
113 | - unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep; | ||
114 | - unsigned char* pStr = (unsigned char*)pDibData + x * 3; | ||
115 | - for (int tty = y; tty <= b; ++tty) | ||
116 | - { | ||
117 | - unsigned char* subImg = pImg + (tty - y) * dstStep; | ||
118 | - unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep; | ||
119 | - for (int ttx = x; ttx <= r; ++ttx) | ||
120 | - { | ||
121 | - for (int n = 0; n < dst.channels(); ++n){ | ||
122 | - double vtxt = subStr[n] / 255.0; | ||
123 | - int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n]; | ||
124 | - subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv); | ||
125 | - } | ||
126 | - | ||
127 | - subStr += 3; | ||
128 | - subImg += dst.channels(); | ||
129 | - } | ||
130 | - } | ||
131 | - | ||
132 | - SelectObject(hDC, hOldBmp); | ||
133 | - SelectObject(hDC, hOldFont); | ||
134 | - DeleteObject(hf); | ||
135 | - DeleteObject(hBmp); | ||
136 | - DeleteDC(hDC); | ||
137 | -} | ||
138 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/putText.h- deleted
1 | -#ifndef PUTTEXT_H_ | ||
2 | -#define PUTTEXT_H_ | ||
3 | - | ||
4 | -#include <windows.h> | ||
5 | -#include <string> | ||
6 | -#include <opencv2/opencv.hpp> | ||
7 | - | ||
8 | -using namespace cv; | ||
9 | - | ||
10 | -void GetStringSize(HDC hDC, const char* str, int* w, int* h); | ||
11 | -void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, | ||
12 | - const char *fn = "Arial", bool italic = false, bool underline = false); | ||
13 | - | ||
14 | -#endif // PUTTEXT_H_ | ||
15 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/script.mri deleted
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/FaceDetModule.cpp
@@ -35,40 +35,29 @@ int face_det_module::face_det_module_init(int gpuid, char* auth_license) | @@ -35,40 +35,29 @@ int face_det_module::face_det_module_init(int gpuid, char* auth_license) | ||
35 | { | 35 | { |
36 | m_face_det_handle = nullptr; | 36 | m_face_det_handle = nullptr; |
37 | 37 | ||
38 | - //��������ʼ�� | ||
39 | - fd_param fd_param_; | ||
40 | - fd_param_.thresld = 0.7; | ||
41 | - fd_param_.gpuid = gpuid; | ||
42 | - fd_param_.mode = DEVICE_GPU; | ||
43 | - fd_param_.log = SY_CONFIG_OPEN; | ||
44 | - fd_param_.facial_fea_point_config = SY_CONFIG_OPEN; | ||
45 | - fd_param_.pose_config = SY_CONFIG_OPEN; | ||
46 | - fd_param_.quality_config = SY_CONFIG_OPEN; | ||
47 | - fd_param_.score_config = SY_CONFIG_OPEN; | ||
48 | - fd_param_.max_result_count = 100; | ||
49 | - fd_param_.max_batch_size_detect = 10; | ||
50 | - fd_param_.max_batch_size_ldmk = 10; | ||
51 | - fd_param_.max_batch_size_pose = 10; | ||
52 | - fd_param_.max_batch_size_score = 10; | ||
53 | - fd_param_.max_batch_size_blurglass = 10; | ||
54 | - fd_param_.max_batch_size_occlusion = 10; | ||
55 | - fd_param_.serialize_file = "./serialize_file/FD"; | ||
56 | - fd_param_.auth_license = "sy_tsl_aiplatform_sdk_2021"; | ||
57 | - | ||
58 | - // fd_param param; | ||
59 | - // param.thresld = 0.6; | ||
60 | - // param.gpuid = gpuid; | ||
61 | - // param.mode = DEVICE_GPU; | ||
62 | - // param.log = SY_CONFIG_OPEN; | ||
63 | - // param.facial_fea_point_config = SY_CONFIG_OPEN; //�Ƿ������ؼ����� | ||
64 | - // param.pose_config = SY_CONFIG_OPEN; //�Ƿ�������̬�� | ||
65 | - // param.quality_config = SY_CONFIG_OPEN; //�Ƿ������������ | ||
66 | - // param.score_config = SY_CONFIG_OPEN; //�Ƿ������������Ŷ� //SY_CONFIG_OPEN SY_CONFIG_CLOSE | ||
67 | - // param.max_result_count = 100; | ||
68 | - // param.auth_license = "sy_tsl_aiplatform_sdk_2021"; | ||
69 | - | ||
70 | - // if (SUCCESS != fd_init(&m_face_det_handle, fd_param_, "")) | ||
71 | - if (SUCCESS != fd_init(&m_face_det_handle, fd_param_)) // 220512 | 38 | + fd_param param; |
39 | + param.thresld = 0.6; | ||
40 | + param.gpuid = 0; | ||
41 | + param.mode = DEVICE_GPU; | ||
42 | + param.log = SY_CONFIG_OPEN; | ||
43 | + param.facial_fea_point_config = SY_CONFIG_OPEN; //�Ƿ������ؼ����� | ||
44 | + param.pose_config = SY_CONFIG_OPEN; //�Ƿ�������̬�� | ||
45 | + param.quality_config = SY_CONFIG_OPEN; //�Ƿ������������ | ||
46 | + param.score_config = SY_CONFIG_OPEN; //�Ƿ������������Ŷ� //SY_CONFIG_OPEN SY_CONFIG_CLOSE | ||
47 | + param.max_result_count = 100; | ||
48 | + param.auth_license = "sy_va_sub_sdk_2023"; | ||
49 | + // param.max_batch_size_detect = 10; | ||
50 | + // param.max_batch_size_ldmk = 10; | ||
51 | + // param.max_batch_size_pose = 10; | ||
52 | + // param.max_batch_size_score = 10; | ||
53 | + // param.max_batch_size_blurglass = 10; | ||
54 | + // //param.max_batch_size_hat = 4; | ||
55 | + // param.max_batch_size_occlusion = 10; | ||
56 | + param.serialize_file = "./serialize_file/FD"; | ||
57 | + | ||
58 | + | ||
59 | + int flagFD = fd_init(&m_face_det_handle, param); | ||
60 | + if(flagFD != 0) | ||
72 | { | 61 | { |
73 | printf("fd_init failed\n"); | 62 | printf("fd_init failed\n"); |
74 | return FAILED; | 63 | return FAILED; |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/HumanCarParsing.cpp
@@ -4,42 +4,44 @@ | @@ -4,42 +4,44 @@ | ||
4 | #include "opencv2/opencv.hpp" | 4 | #include "opencv2/opencv.hpp" |
5 | #include "opencv2/highgui/highgui.hpp" | 5 | #include "opencv2/highgui/highgui.hpp" |
6 | 6 | ||
7 | -//string up[12] = { "TÐô", "Âí¼×/µõ´ø/±³ÐÄ", "³ÄÉÀ", "Î÷·þ", "ëÒÂ", "ƤÒÂ/¼Ð¿Ë", "ÓðÈÞ·þ", "´óÒÂ/·çÒÂ", "ÍâÌ×", "Á¬ÒÂȹ", "ÎÞÉÏÒÂ", "ÆäËû" }; | ||
8 | -//string up_color[12] = { "ºÚ", "°×", "ºì", "»Æ", "À¶", "ÂÌ", "×Ï", "ר", "»Ò", "³È", "¶àÉ«", "ÆäËû" }; | ||
9 | -//string down[6] = { "³¤¿ã", "¶Ì¿ã", "³¤È¹", "¶Ìȹ", "Á¬ÒÂȹ", "ÆäËû" }; | ||
10 | -//string down_color[12] = { "ºÚ", "°×", "ºì", "»Æ", "À¶", "ÂÌ", "×Ï", "ר", "»Ò", "³È", "¶àÉ«", "ÆäËû" }; | ||
11 | -//string bao[5] = { "ÎÞ°ü", "µ¥¼ç°ü", "Ë«¼ç°ü", "ÆäËû", "Ç®°ü" }; | ||
12 | -//string bag_color[12] = { "ºÚ", "°×", "ºì", "»Æ", "À¶", "ÂÌ", "×Ï", "ר", "»Ò", "³È", "¶àÉ«", "ÆäËû" }; | ||
13 | -//string head[6] = { "³¤·¢", "¶Ì·¢", "¹âÍ·", "ñ×Ó", "Í·¿ø", "ÆäËû" }; | ||
14 | -//string clothing_text[5] = { "´¿É«", "Ë黨", "ÌõÎÆ", "¸ñ×Ó", "ÆäËû" }; | ||
15 | -//string sex[3] = { "ÄÐ", "Å®", "²»Ã÷" }; | ||
16 | -//string figure[3] = { "ÅÖ", "ÊÝ", "ÖÐ" }; | ||
17 | -//string nationality[5] = { "ºº×å", "ά×å", "ºÚÈË", "°×ÈË", "ÆäËû" }; | ||
18 | -//string age[6] = { "Ó×¶ù", "¶ùͯ", "ÇàÄê", "ÖÐÄê", "ÀÏÄê", "²»Ã÷" }; | ||
19 | -//string eye[4] = { "Õý³£ÑÛ¾¦", "ÑÛ¾µ", "Ä«¾µ", "ÆäËû" }; | ||
20 | -//string mouth[3] = { "Õý³£×ì", "´÷¿ÚÕÖ", "ÆäËû" }; | ||
21 | -//string weibo[3] = { "ÎÞΧ½í", "ÆÕͨΧ½í", "°üͷΧ½í" }; | 7 | +#include "../../FFNvDecoder/logger.hpp" |
8 | + | ||
9 | +//string up[12] = { "Tæ¤", "马甲/åŠå¸¦/背心", "衬衫", "西æœ", "毛衣", "皮衣/夹克", "羽绒æœ", "大衣/风衣", "外套", "连衣裙", "æ— ä¸Šè¡£", "å…¶ä»–" }; | ||
10 | +//string up_color[12] = { "黑", "白", "红", "黄", "è“", "绿", "ç´«", "棕", "ç°", "æ©™", "多色", "å…¶ä»–" }; | ||
11 | +//string down[6] = { "长裤", "çŸè£¤", "长裙", "çŸè£™", "连衣裙", "å…¶ä»–" }; | ||
12 | +//string down_color[12] = { "黑", "白", "红", "黄", "è“", "绿", "ç´«", "棕", "ç°", "æ©™", "多色", "å…¶ä»–" }; | ||
13 | +//string bao[5] = { "æ— åŒ…", "å•肩包", "åŒè‚©åŒ…", "å…¶ä»–", "钱包" }; | ||
14 | +//string bag_color[12] = { "黑", "白", "红", "黄", "è“", "绿", "ç´«", "棕", "ç°", "æ©™", "多色", "å…¶ä»–" }; | ||
15 | +//string head[6] = { "é•¿å‘", "çŸå‘", "光头", "帽å", "头盔", "å…¶ä»–" }; | ||
16 | +//string clothing_text[5] = { "纯色", "碎花", "æ¡çº¹", "æ ¼å", "å…¶ä»–" }; | ||
17 | +//string sex[3] = { "ç”·", "女", "䏿˜Ž" }; | ||
18 | +//string figure[3] = { "胖", "瘦", "ä¸" }; | ||
19 | +//string nationality[5] = { "汉æ—", "ç»´æ—", "黑人", "白人", "å…¶ä»–" }; | ||
20 | +//string age[6] = { "幼儿", "å„¿ç«¥", "é’å¹´", "ä¸å¹´", "è€å¹´", "䏿˜Ž" }; | ||
21 | +//string eye[4] = { "æ£å¸¸çœ¼ç›", "眼镜", "墨镜", "å…¶ä»–" }; | ||
22 | +//string mouth[3] = { "æ£å¸¸å˜´", "戴å£ç½©", "å…¶ä»–" }; | ||
23 | +//string weibo[3] = { "æ— å›´å·¾", "普通围巾", "包头围巾" }; | ||
22 | // | 24 | // |
23 | -//string carColor[13] = { "ºÚ", "°×", "ºì", "»Æ", "À¶", "ÂÌ", "×Ï", "ר", "»Ò", "³È", "¶àÉ«", "ÆäËû", "Òø" }; | ||
24 | -//string orient[3] = { "ÕýÃæ", "±³Ãæ", "²àÃæ" }; | ||
25 | -//string drivenum[4] = { "0ÈË", "1ÈË", "2ÈË", "¸ü¶àÈË" }; | ||
26 | -//string dasan[2] = { "ÎÞ", "ÓÐ" }; | ||
27 | -//string take[2] = { "ÎÞ", "ÎïÆ·" }; | ||
28 | - | ||
29 | -//static std::string hcp_head[] = { "³¤·¢", "¶Ì·¢", "Í·¿ø", "ÆäËû" }; | ||
30 | -//static std::string hcp_eye[] = { "δ´÷ÑÛ¾µ", "´÷ÑÛ¾µ" }; | ||
31 | -//static std::string hcp_mouth[] = { "δ´÷¿ÚÕÖ", "´÷¿ÚÕÖ" }; | ||
32 | -//static std::string hcp_weibo[] = { "δ´øÎ§½í", "´øÎ§½í" }; | ||
33 | -//static std::string hcp_up[] = { "TÐô/±³ÐÄ", "³ÄÉÀ", "ëÒÂ", "ÍâÌ×", "Á¬ÒÂȹ", "ÆäËû" }; | ||
34 | -//static std::string hcp_up_color[] = { "ºÚ", "°×", "»Ò", "ºì", "À¶", "»Æ", "ÂÌ", "¶àÉ«", "²»Ã÷" }; | ||
35 | -//static std::string hcp_clothing_text[] = { "´¿É«", "Ë黨", "ÌõÎÆ¸ñ×Ó", "ÆäËû" }; | ||
36 | -//static std::string hcp_bao[] = { "ÎÞ°ü", "±³°ü" }; | ||
37 | -//static std::string hcp_sex[] = { "ÄÐ", "Å®", "²»Ã÷" }; | ||
38 | -//static std::string hcp_age[] = { "Сº¢", "³ÉÈË", "²»Ã÷" }; | ||
39 | -//static std::string hcp_carColor[] = { "ºÚ", "°×", "ºì", "ÆäËû" }; | ||
40 | -//static std::string hcp_orient[] = { "ÕýÃæ", "±³Ãæ", "²àÃæ" }; | ||
41 | -//static std::string hcp_dasan[] = { "ÎÞ", "ÓÐ" }; | ||
42 | -//static std::string hcp_take[] = { "ÎÞ", "ÓÐ" }; | 25 | +//string carColor[13] = { "黑", "白", "红", "黄", "è“", "绿", "ç´«", "棕", "ç°", "æ©™", "多色", "å…¶ä»–", "é“¶" }; |
26 | +//string orient[3] = { "æ£é¢", "背é¢", "ä¾§é¢" }; | ||
27 | +//string drivenum[4] = { "0人", "1人", "2人", "更多人" }; | ||
28 | +//string dasan[2] = { "æ— ", "有" }; | ||
29 | +//string take[2] = { "æ— ", "物å“" }; | ||
30 | + | ||
31 | +//static std::string hcp_head[] = { "é•¿å‘", "çŸå‘", "头盔", "å…¶ä»–" }; | ||
32 | +//static std::string hcp_eye[] = { "未戴眼镜", "戴眼镜" }; | ||
33 | +//static std::string hcp_mouth[] = { "未戴å£ç½©", "戴å£ç½©" }; | ||
34 | +//static std::string hcp_weibo[] = { "未带围巾", "带围巾" }; | ||
35 | +//static std::string hcp_up[] = { "Tæ¤/背心", "衬衫", "毛衣", "外套", "连衣裙", "å…¶ä»–" }; | ||
36 | +//static std::string hcp_up_color[] = { "黑", "白", "ç°", "红", "è“", "黄", "绿", "多色", "䏿˜Ž" }; | ||
37 | +//static std::string hcp_clothing_text[] = { "纯色", "碎花", "æ¡çº¹æ ¼å", "å…¶ä»–" }; | ||
38 | +//static std::string hcp_bao[] = { "æ— åŒ…", "背包" }; | ||
39 | +//static std::string hcp_sex[] = { "ç”·", "女", "䏿˜Ž" }; | ||
40 | +//static std::string hcp_age[] = { "å°å©", "æˆäºº", "䏿˜Ž" }; | ||
41 | +//static std::string hcp_carColor[] = { "黑", "白", "红", "其他" }; | ||
42 | +//static std::string hcp_orient[] = { "æ£é¢", "背é¢", "ä¾§é¢" }; | ||
43 | +//static std::string hcp_dasan[] = { "æ— ", "有" }; | ||
44 | +//static std::string hcp_take[] = { "æ— ", "有" }; | ||
43 | 45 | ||
44 | const int FIR_INDEX_SIZE = 14; | 46 | const int FIR_INDEX_SIZE = 14; |
45 | const int SEC_INDEX_SIZE[FIR_INDEX_SIZE] = {4,2,2,2,6,9,4,2,3,3,4,3,2,2 }; | 47 | const int SEC_INDEX_SIZE[FIR_INDEX_SIZE] = {4,2,2,2,6,9,4,2,3,3,4,3,2,2 }; |
@@ -64,15 +66,42 @@ int HumanCarParsing_Init(void *&handle, int gpuid, char* auth_license) | @@ -64,15 +66,42 @@ int HumanCarParsing_Init(void *&handle, int gpuid, char* auth_license) | ||
64 | #include <fstream> | 66 | #include <fstream> |
65 | int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, hcp_analysis_result *&result) | 67 | int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, hcp_analysis_result *&result) |
66 | { | 68 | { |
67 | - //ctools_result *result=NULL; | 69 | + // vector<sy_img> vec_batch_img(batch_size); |
70 | + // for (int i = 0; i < batch_size; i++) | ||
71 | + // { | ||
72 | + // if (batch_img[i].data_ == NULL) { | ||
73 | + // cout << i << " data null" << endl; | ||
74 | + // return -1; | ||
75 | + // } | ||
76 | + // int data_size = batch_img[i].c_ * batch_img[i].h_ * batch_img[i].w_ ; | ||
77 | + // cout << "data size:" << data_size << endl; | ||
78 | + // unsigned char *snapshotDataHost = new unsigned char[data_size] {}; | ||
79 | + // cudaMemcpy(snapshotDataHost, batch_img[i].data_, data_size * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
80 | + | ||
81 | + // sy_img tmp_img = batch_img[i]; | ||
82 | + // tmp_img.data_ = snapshotDataHost; | ||
83 | + | ||
84 | + // vec_batch_img.push_back(tmp_img); | ||
85 | + // } | ||
86 | + | ||
87 | + sy_img cpu_batch_img[batch_size]; | ||
68 | for (int i = 0; i < batch_size; i++) | 88 | for (int i = 0; i < batch_size; i++) |
69 | { | 89 | { |
70 | if (batch_img[i].data_ == NULL) | 90 | if (batch_img[i].data_ == NULL) |
91 | + { | ||
71 | cout << i << " data null" << endl; | 92 | cout << i << " data null" << endl; |
93 | + LOG_ERROR("") | ||
94 | + return FAILED; | ||
95 | + } | ||
96 | + cpu_batch_img[i].data_ = (unsigned char *)malloc(batch_img[i].w_ *batch_img[i].h_ * batch_img[i].c_ * sizeof(unsigned char)); | ||
97 | + cudaMemcpy(cpu_batch_img[i].data_, batch_img[i].data_, batch_img[i].w_ *batch_img[i].h_ * batch_img[i].c_ * sizeof(unsigned char), cudaMemcpyDeviceToHost); | ||
98 | + cpu_batch_img[i].w_ = batch_img[i].w_; | ||
99 | + cpu_batch_img[i].h_ = batch_img[i].h_; | ||
100 | + cpu_batch_img[i].c_ = batch_img[i].c_; | ||
72 | } | 101 | } |
73 | 102 | ||
74 | //cout << "begin hcp ProcessBatch" << endl; | 103 | //cout << "begin hcp ProcessBatch" << endl; |
75 | - hcp_batch(handle, batch_img, batch_size, result); | 104 | + hcp_batch(handle, cpu_batch_img, batch_size, result); |
76 | 105 | ||
77 | for (int b = 0; b < batch_size; b++) | 106 | for (int b = 0; b < batch_size; b++) |
78 | { | 107 | { |
@@ -93,6 +122,8 @@ int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, | @@ -93,6 +122,8 @@ int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, | ||
93 | //printf("HumanCarParsing_Process ERROR!!!!!!!!!!!! %d %d %d\n", i, cur_result.res_objs[i].res_index, SEC_INDEX_SIZE[i]); | 122 | //printf("HumanCarParsing_Process ERROR!!!!!!!!!!!! %d %d %d\n", i, cur_result.res_objs[i].res_index, SEC_INDEX_SIZE[i]); |
94 | } | 123 | } |
95 | } | 124 | } |
125 | + | ||
126 | + free(cpu_batch_img[b].data_) ; | ||
96 | } | 127 | } |
97 | 128 | ||
98 | //cout << "end hcp ProcessBatch" << endl; | 129 | //cout << "end hcp ProcessBatch" << endl; |
@@ -124,7 +155,7 @@ int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, | @@ -124,7 +155,7 @@ int HumanCarParsing_Process(void * handle, sy_img * batch_img, int batch_size, | ||
124 | // //int resIndex = result[j][i].index; | 155 | // //int resIndex = result[j][i].index; |
125 | // int resIndex = index_score.data_[i * 2]; | 156 | // int resIndex = index_score.data_[i * 2]; |
126 | //cout << "resIndex" << endl; | 157 | //cout << "resIndex" << endl; |
127 | - // //Êä³ö½á¹û | 158 | + // //������ |
128 | // switch (i) | 159 | // switch (i) |
129 | // { | 160 | // { |
130 | // case 0: | 161 | // case 0: |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/HumanFeatures.cppbk deleted
1 | -#include "HumanFeatures.h" | ||
2 | -#include <iostream> | ||
3 | -#include "sy_errorinfo.h" | ||
4 | -using namespace std; | ||
5 | - | ||
6 | -int human_features_init(void *&handle, char*dbpath, int gpuid) | ||
7 | -{ | ||
8 | - hf_param params; | ||
9 | - params.gpuid = gpuid; | ||
10 | - params.mode = DEVICE_GPU; | ||
11 | -// params.db_path = dbpath; | ||
12 | - if (hf_init(&handle, params) !=0) | ||
13 | - { | ||
14 | - cout << "Init HF Failed!" << endl; | ||
15 | - return FAILED; | ||
16 | - | ||
17 | - } | ||
18 | - return SUCCESS; | ||
19 | -} | ||
20 | - | ||
21 | -int human_features_process(void * handle, sy_img * batch_img, int batch_size, hf_result*& result) | ||
22 | -{ | ||
23 | - for (int i = 0; i < batch_size; i++) | ||
24 | - { | ||
25 | - if (batch_img[i].data_ == NULL) | ||
26 | - cout << i << " data null" << endl; | ||
27 | - } | ||
28 | - | ||
29 | - hf_feature_batch(handle, batch_img, batch_size, result); | ||
30 | - return SUCCESS; | ||
31 | -} | ||
32 | - | ||
33 | -int human_feature_release(void *& handle) | ||
34 | -{ | ||
35 | - hf_release(&handle); | ||
36 | - return SUCCESS; | ||
37 | -} |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/HumanFeatures.hbk deleted
1 | -#ifndef _HUMANFEATURES_H_ | ||
2 | -#define _HUMANFEATURES_H_ | ||
3 | -#include "human_features.h" | ||
4 | - | ||
5 | -int human_features_init(void *&handle, char*dbpath, int gpuid); | ||
6 | - | ||
7 | -int human_features_process(void * handle, sy_img * batch_img, int batch_size, hf_result*& result); | ||
8 | - | ||
9 | -int human_feature_release(void *& handle); | ||
10 | -#endif |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/CycleQueue.h deleted
1 | -#include <iostream> | ||
2 | - | ||
3 | -using namespace std; | ||
4 | - | ||
5 | -#define MAX_LENGTH 100 | ||
6 | - | ||
7 | -typedef struct TRACK_POINT | ||
8 | -{ | ||
9 | - int x; | ||
10 | - int y; | ||
11 | -}TRACK_POINT; | ||
12 | - | ||
13 | -//template <class T> | ||
14 | -class cycleQueue | ||
15 | -{ | ||
16 | -private: | ||
17 | - unsigned int m_size; | ||
18 | - int m_front; | ||
19 | - int m_rear; | ||
20 | - TRACK_POINT m_data[MAX_LENGTH]; | ||
21 | - | ||
22 | - bool firstPush; | ||
23 | - bool full_size; | ||
24 | - | ||
25 | -public: | ||
26 | - | ||
27 | - cycleQueue() {} | ||
28 | - | ||
29 | - cycleQueue(unsigned size) | ||
30 | - :m_size(size), | ||
31 | - m_front(0), | ||
32 | - m_rear(0) | ||
33 | - { | ||
34 | - //m_data = new TRACK_POINT[size]; | ||
35 | - full_size = false; | ||
36 | - firstPush = true; | ||
37 | - } | ||
38 | - | ||
39 | - void set_param(unsigned size) | ||
40 | - { | ||
41 | - m_size = size; | ||
42 | - //m_data = new TRACK_POINT[size]; | ||
43 | - full_size = false; | ||
44 | - firstPush = true; | ||
45 | - m_front = 0; | ||
46 | - m_rear = 0; | ||
47 | - } | ||
48 | - | ||
49 | - ~cycleQueue() | ||
50 | - { | ||
51 | - //delete[] m_data; | ||
52 | - } | ||
53 | - | ||
54 | - bool isEmpty() | ||
55 | - { | ||
56 | - return m_front == m_rear; | ||
57 | - } | ||
58 | - | ||
59 | - bool isFull() | ||
60 | - { | ||
61 | - return m_front == (m_rear + 1) % m_size; | ||
62 | - } | ||
63 | - | ||
64 | - int getFront() | ||
65 | - { | ||
66 | - return m_front; | ||
67 | - } | ||
68 | - | ||
69 | - int getRear() | ||
70 | - { | ||
71 | - return m_rear; | ||
72 | - } | ||
73 | - | ||
74 | - int size() | ||
75 | - { | ||
76 | - if (full_size) return m_size; | ||
77 | - else if (m_rear == m_front && firstPush == false) return m_size; | ||
78 | - else return m_rear - m_front; | ||
79 | - } | ||
80 | - | ||
81 | - void push(TRACK_POINT ele)throw(bad_exception) | ||
82 | - { | ||
83 | - if (m_front == m_rear && firstPush==false) | ||
84 | - { | ||
85 | - m_front = (m_front + 1) % m_size; | ||
86 | - full_size = true; | ||
87 | - //cout << "full_size" << endl; | ||
88 | - } | ||
89 | - | ||
90 | - m_data[m_rear] = ele; | ||
91 | - m_rear = (m_rear + 1) % m_size; | ||
92 | - firstPush = false; | ||
93 | - } | ||
94 | - | ||
95 | - TRACK_POINT pop() throw(bad_exception) | ||
96 | - { | ||
97 | - if (isEmpty()) | ||
98 | - { | ||
99 | - throw bad_exception(); | ||
100 | - } | ||
101 | - TRACK_POINT tmp = m_data[m_front]; | ||
102 | - m_front = (m_front + 1) % m_size; | ||
103 | - return tmp; | ||
104 | - } | ||
105 | - | ||
106 | - TRACK_POINT& get(int i) | ||
107 | - { | ||
108 | - //T tmp = m_data[i]; | ||
109 | - return m_data[i]; | ||
110 | - } | ||
111 | -}; | ||
112 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/HungarianAlgorithm.cpp deleted
1 | -#include <vector> | ||
2 | -#include <assert.h> | ||
3 | -#include "HungarianAlgorithm.h" | ||
4 | - | ||
5 | -using namespace std; | ||
6 | - | ||
7 | - | ||
8 | -// B = A( extractRows, extractCols ) | ||
9 | -// Require: | ||
10 | -// extractRows.size()==A.rows, extractCols.size()==A.cols | ||
11 | -// sum(extractRows)==B.rows, sum(extractCols)==B.cols | ||
12 | -void extractGrids(const cv::Mat &A, const vector<bool> &extractRows, const vector<bool> &extractCols, cv::Mat &B) | ||
13 | -{ | ||
14 | - typedef float ValueType; | ||
15 | - ValueType *pt1 = (ValueType*)A.data, *pt2 = (ValueType*)B.data, *pt3, *pt4; | ||
16 | - const int step1 = A.step1(), rows = A.rows, cols = A.cols, step2 = B.step1(); | ||
17 | - vector<bool>::const_iterator it1, it2, it3 = extractRows.end(), it4 = extractCols.end(); | ||
18 | - for (it1 = extractRows.begin(); it1 != it3; pt1 += step1){ | ||
19 | - pt3 = pt1; | ||
20 | - if (*(it1++)){ | ||
21 | - pt4 = pt2; | ||
22 | - for (it2 = extractCols.begin(); it2 != it4; pt3++) | ||
23 | - if (*(it2++)) | ||
24 | - *(pt4++) = *pt3; | ||
25 | - pt2 += step2; | ||
26 | - } | ||
27 | - } | ||
28 | -} | ||
29 | - | ||
30 | -// B = A( extract ) | ||
31 | -// Require: | ||
32 | -// min(A.rows,A.cols) ==1 | ||
33 | -// if(A.rows)==1, then require: A.cols==extract.size(), B.rows==1, sum(extract)==B.cols | ||
34 | -// if(A.cols)==1, then require: A.rows==extract.size(), B.cols==1, sum(extract)==B.rows | ||
35 | -void extractDots(const cv::Mat &A, const vector<bool> &extract, cv::Mat &B) | ||
36 | -{ | ||
37 | - assert(A.rows == 1 || A.cols == 1); | ||
38 | - typedef float ValueType; | ||
39 | - ValueType *pt1 = (ValueType*)A.data, *pt2 = (ValueType*)B.data; | ||
40 | - vector<bool>::const_iterator it = extract.begin(), it2 = extract.end(); | ||
41 | - if (A.rows == 1){ | ||
42 | - for (; it != it2; pt1++) | ||
43 | - if (*(it++)) | ||
44 | - *(pt2++) = *pt1; | ||
45 | - } | ||
46 | - else{ | ||
47 | - int step1 = A.step1(), step2 = B.step1(); | ||
48 | - for (; it != it2; pt1 += step1) | ||
49 | - if (*(it++)){ | ||
50 | - *pt2 = *pt1; | ||
51 | - pt2 += step2; | ||
52 | - } | ||
53 | - } | ||
54 | -} | ||
55 | - | ||
56 | - | ||
57 | -/* Initial Matlab code comes from: | ||
58 | -http://www.mathworks.com/matlabcentral/fileexchange/20652-hungarian-algorithm-for-linear-assignment-problems--v2-3- | ||
59 | - | ||
60 | -Hungarian algorithm for matrix assignment problem. | ||
61 | -costMat: there are (rows) works and (cols) jobs. costMat(i,j) means the cost of assigning job (j) to worker (i). | ||
62 | -The problem is to solve a holistic optimization problem of assigning each worker a job! | ||
63 | -The algorithm allows partial assignment - if there is no proper job for worker (i) we would set assignment(i) to -1, meaning no assignment for worker (i). | ||
64 | - | ||
65 | -Negatives in costMat means the corresponding assignments are forbidden. | ||
66 | -*/ | ||
67 | -void munkres(cv::Mat &IoUMat, vector<int> &assignment) | ||
68 | -{ | ||
69 | - assert(IoUMat.type() == CV_32FC1); | ||
70 | - const int rows = IoUMat.rows, cols = IoUMat.cols; | ||
71 | - assignment.assign(rows, -1); | ||
72 | - // modify input port O - IoU = cost | ||
73 | - cv::Mat O = cv::Mat::ones(rows, cols, CV_32FC1); | ||
74 | - cv::Mat costMat(rows, cols, CV_32FC1); | ||
75 | - absdiff(O, IoUMat, costMat); | ||
76 | - | ||
77 | - cv::Mat validMat(rows, cols, CV_8UC1); | ||
78 | - compare(costMat, cv::Scalar(0), validMat, cv::CMP_GE); | ||
79 | - | ||
80 | - float *ptF, *ptF2; | ||
81 | - uchar *ptU, *ptU2; | ||
82 | - int stepGap; | ||
83 | - int r, c, i; | ||
84 | - unsigned j; | ||
85 | - vector<bool>::iterator it1, it2; | ||
86 | - vector<int>::iterator it3, it4; | ||
87 | - | ||
88 | - // validCol & validRow | ||
89 | - vector<bool> validRow(rows, false); | ||
90 | - ptU = validMat.data; | ||
91 | - for (r = 0; r<rows; r++){ | ||
92 | - ptU2 = ptU; | ||
93 | - for (c = 0; c<cols; c++) if (*(ptU2++)) break; | ||
94 | - if (c<cols) validRow[r] = true; | ||
95 | - ptU += validMat.step; | ||
96 | - } | ||
97 | - vector<bool> validCol(cols, false); | ||
98 | - ptU = validMat.data; | ||
99 | - for (c = 0; c<cols; c++){ | ||
100 | - ptU2 = ptU; | ||
101 | - for (r = 0; r<rows; r++) if (*ptU2) break; else ptU2 += validMat.step; | ||
102 | - if (r<rows) validCol[c] = true; | ||
103 | - ptU++; | ||
104 | - } | ||
105 | - | ||
106 | - // nRows & nCols | ||
107 | - int nRows = 0, nCols = 0; | ||
108 | - it1 = validRow.begin(), it2 = validCol.begin(); | ||
109 | - r = 0; while (r++<rows) if (*(it1++)) nRows++; | ||
110 | - c = 0; while (c++<cols) if (*(it2++)) nCols++; | ||
111 | - const int n = nRows>nCols ? nRows : nCols; | ||
112 | - if (!n) | ||
113 | - return; | ||
114 | - | ||
115 | - // sumValid & maxValid | ||
116 | - float sumValid = 0, maxValid = -1.f; | ||
117 | - ptF = (float*)costMat.data; | ||
118 | - ptU = validMat.data; | ||
119 | - stepGap = validMat.step - validMat.cols; | ||
120 | - r = 0; while (r++<rows){ | ||
121 | - c = 0; while (c++<cols){ | ||
122 | - if (*(ptU++)){ | ||
123 | - float v = *(ptF++); sumValid += v; | ||
124 | - if (v>maxValid) maxValid = v; | ||
125 | - } | ||
126 | - else ptF++; | ||
127 | - } ptU += stepGap; | ||
128 | - } | ||
129 | - | ||
130 | - // bigM & maxValid | ||
131 | - maxValid *= 10.f; | ||
132 | - float bigM = log10f(sumValid); | ||
133 | - int power = (int)ceilf(bigM) + 1; | ||
134 | - bigM = 1.f; //bigM = pow( 10, power ); | ||
135 | - for (i = 0; i<power; i++) | ||
136 | - bigM *= 10; | ||
137 | - | ||
138 | - // costMat(~validMat) = bigM; | ||
139 | - validMat = ~validMat; // validMat 其实已经是 invalidMat! | ||
140 | - costMat.setTo(bigM, validMat); | ||
141 | - | ||
142 | - // dMat | ||
143 | - cv::Mat dMat(n, n, CV_32FC1, cv::Scalar(maxValid)); | ||
144 | - | ||
145 | - | ||
146 | - cv::Mat temp = dMat(cv::Rect(0, 0, nCols, nRows)); //by zl | ||
147 | - extractGrids(costMat, validRow, validCol, temp); | ||
148 | - | ||
149 | - //extractGrids(costMat, validRow, validCol, dMat(cv::Rect(0, 0, nCols, nRows))); | ||
150 | - | ||
151 | - //************************************************* | ||
152 | - // Munkres' Assignment Algorithm starts here | ||
153 | - //************************************************* | ||
154 | - | ||
155 | - // some storage for temporary usage | ||
156 | - cv::Mat tmp1(n, n, CV_32FC1); // size and type accords with dMat | ||
157 | - cv::Mat tmp2(n, n, CV_32FC1); | ||
158 | - cv::Mat tmp3(n, n, CV_32FC1); | ||
159 | - cv::Mat tmp4(n, n, CV_8UC1); | ||
160 | - cv::Mat tmp5(n, 1, CV_32FC1); | ||
161 | - cv::Mat tmp6(1, n, CV_32FC1); | ||
162 | - | ||
163 | - // STEP 1: Subtract the row minimum from each row. | ||
164 | - // minR & minC | ||
165 | - cv::Mat minR, minC; | ||
166 | - reduce(dMat, minR, 1, cv::REDUCE_MIN); | ||
167 | - repeat(minR, 1, n, tmp1); | ||
168 | - tmp2 = dMat - tmp1; | ||
169 | - reduce(tmp2, minC, 0, cv::REDUCE_MIN); | ||
170 | - repeat(minC, n, 1, tmp2); | ||
171 | - | ||
172 | - // STEP 2: Find a zero of dMat. If there are no starred zeros in its column or row start the zero. Repeat for each zero | ||
173 | - // zP | ||
174 | - cv::Mat zP(n, n, CV_8UC1); | ||
175 | - tmp3 = tmp1 + tmp2; | ||
176 | - compare(dMat, tmp3, zP, cv::CMP_EQ); | ||
177 | - | ||
178 | - // starZ | ||
179 | - vector<int> starZ(n, -1); | ||
180 | - ptU = zP.data; | ||
181 | - for (r = 0; r<n; r++){ | ||
182 | - ptU2 = ptU; | ||
183 | - for (c = 0; c<n; c++){ | ||
184 | - if (*(ptU2++)){ | ||
185 | - starZ[r] = c; | ||
186 | - memset(ptU, 0, r); // zP(r,:)=false; | ||
187 | - zP.col(c) = cv::Scalar(0); // zP(:,c)=false; | ||
188 | - break; | ||
189 | - } | ||
190 | - } | ||
191 | - ptU += zP.step; | ||
192 | - } | ||
193 | - | ||
194 | - int uZc, uZr; | ||
195 | - | ||
196 | - while (1){ // STEP 3 | ||
197 | - // Cover each column with a starred zero. If all the columns are covered then the matching is maximum | ||
198 | - it3 = starZ.begin(); | ||
199 | - for (; it3 != starZ.end(); it3++) if (*it3<0) break; | ||
200 | - if (it3 == starZ.end()) break; | ||
201 | - | ||
202 | - // validColumn & validRow & primeZ | ||
203 | - vector<bool> noncoverColumn(n, true); | ||
204 | - for (it3 = starZ.begin(); it3 != starZ.end(); it3++){ | ||
205 | - if (*it3<0) continue; | ||
206 | - noncoverColumn[*it3] = false; | ||
207 | - } | ||
208 | - vector<bool> noncoverRow(n, true); | ||
209 | - vector<int> primeZ(n, -1); | ||
210 | - | ||
211 | - // minC_uncovered & minR_uncovered | ||
212 | - int cnt1 = 0, cnt2 = 0; | ||
213 | - it1 = noncoverColumn.begin(), it2 = noncoverRow.begin(); | ||
214 | - i = 0; while (i++<n){ | ||
215 | - if (*(it1++)) cnt1++; // number of non-covered columns | ||
216 | - if (*(it2++)) cnt2++; // number of non-covered rows | ||
217 | - } | ||
218 | - cv::Mat minR_uncovered = tmp5.rowRange(0, cnt2); | ||
219 | - cv::Mat minC_uncovered = tmp6.colRange(0, cnt1); | ||
220 | - extractDots(minR, noncoverRow, minR_uncovered); | ||
221 | - extractDots(minC, noncoverColumn, minC_uncovered); | ||
222 | - | ||
223 | - // rIdx & cIdx | ||
224 | - cv::Mat temp1 = tmp1(cv::Rect(0, 0, cnt1, cnt2)); | ||
225 | - cv::Mat temp2 = tmp2(cv::Rect(0, 0, cnt1, cnt2)); | ||
226 | - cv::Mat temp3 = tmp3(cv::Rect(0, 0, cnt1, cnt2)); | ||
227 | - cv::Mat temp4 = tmp4(cv::Rect(0, 0, cnt1, cnt2)); | ||
228 | - repeat(minR_uncovered, 1, cnt1, temp1); | ||
229 | - repeat(minC_uncovered, cnt2, 1, temp2); | ||
230 | - temp2 = temp1 + temp2; | ||
231 | - extractGrids(dMat, noncoverRow, noncoverColumn, temp3); | ||
232 | - compare(temp2, temp3, temp4, cv::CMP_EQ); | ||
233 | - vector<int> rIdx, cIdx; // [rIdx,cIdx] = find(temp4); | ||
234 | - ptU = temp4.data; | ||
235 | - stepGap = temp4.step - temp4.cols; | ||
236 | - for (r = 0; r<temp4.rows; r++){ | ||
237 | - for (c = 0; c<temp4.cols; c++){ | ||
238 | - if (*(ptU++)){ | ||
239 | - rIdx.push_back(r); | ||
240 | - cIdx.push_back(c); | ||
241 | - } | ||
242 | - } | ||
243 | - ptU += stepGap; | ||
244 | - } | ||
245 | - | ||
246 | - while (1){ // STEP 4 | ||
247 | - // Find a non-covered zero and prime it. If there is no starred zero in the row containing this primed zero, Go to Step 5. | ||
248 | - // Otherwise, cover this row and uncover the column containing the starred zero. Continue in this manner until there are no | ||
249 | - // uncovered zeros left. Save the smallest uncovered value and Go to Step 6. | ||
250 | - | ||
251 | - // cR & cC | ||
252 | - vector<int> cR, cC; | ||
253 | - for (j = 0; j<noncoverRow.size(); j++) | ||
254 | - if (noncoverRow[j]) | ||
255 | - cR.push_back(j); | ||
256 | - for (j = 0; j<noncoverColumn.size(); j++) | ||
257 | - if (noncoverColumn[j]) | ||
258 | - cC.push_back(j); | ||
259 | - | ||
260 | - // rIdx = cR(rIdx), cIdx = cC(cIdx); | ||
261 | - for (j = 0; j<rIdx.size(); j++){ | ||
262 | - rIdx[j] = cR[rIdx[j]]; | ||
263 | - cIdx[j] = cC[cIdx[j]]; | ||
264 | - } | ||
265 | - | ||
266 | - int Step = 6; | ||
267 | - while (!cIdx.empty()){ | ||
268 | - uZr = rIdx[0]; | ||
269 | - uZc = cIdx[0]; | ||
270 | - primeZ[uZr] = uZc; | ||
271 | - int stz = starZ[uZr]; | ||
272 | - if (stz<0){ | ||
273 | - Step = 5; | ||
274 | - break; | ||
275 | - } | ||
276 | - noncoverRow[uZr] = false; | ||
277 | - noncoverColumn[stz] = true; | ||
278 | - // rIdx(rIdx==uZr) = [] | ||
279 | - vector<int> rIdx2, cIdx2; | ||
280 | - for (it3 = rIdx.begin(), it4 = cIdx.begin(); it3 != rIdx.end(); it3++, it4++) | ||
281 | - if (*it3 != uZr){ | ||
282 | - rIdx2.push_back(*it3); | ||
283 | - cIdx2.push_back(*it4); | ||
284 | - } | ||
285 | - rIdx = rIdx2, cIdx = cIdx2; | ||
286 | - // cR = find(~coverRow); | ||
287 | - cR.clear(); | ||
288 | - for (j = 0; j<noncoverRow.size(); j++) | ||
289 | - if (noncoverRow[j]) | ||
290 | - cR.push_back(j); | ||
291 | - // z = dMat(~coverRow,stz) == minR(~coverRow) + minC(stz); | ||
292 | - int sz = cR.size(); | ||
293 | - minR_uncovered = tmp5.rowRange(0, sz); | ||
294 | - extractDots(minR, noncoverRow, minR_uncovered); | ||
295 | - minR_uncovered = minR_uncovered + cv::Scalar(minC.at<float>(stz)); | ||
296 | - temp1 = tmp1(cv::Rect(0, 0, 1, sz)); | ||
297 | - extractDots(dMat.col(stz), noncoverRow, temp1); | ||
298 | - temp4 = tmp4(cv::Rect(0, 0, 1, sz)); | ||
299 | - compare(temp1, minR_uncovered, temp4, cv::CMP_EQ); | ||
300 | - // rIdx = [rIdx(:);cR(z)]; | ||
301 | - for (i = 0, ptU = temp4.data; i<temp4.rows; i++, ptU += temp4.step) | ||
302 | - if (*ptU){ | ||
303 | - rIdx.push_back(cR[i]); | ||
304 | - cIdx.push_back(stz); | ||
305 | - } | ||
306 | - } | ||
307 | - | ||
308 | - if (Step == 6){ | ||
309 | - // STEP 6: Add the minimum uncovered value to every element of each covered | ||
310 | - // row, and subtract it from every element of each uncovered column. | ||
311 | - // Return to Step 4 without altering any stars, primes, or covered lines. | ||
312 | - cnt1 = 0, cnt2 = 0; | ||
313 | - it1 = noncoverColumn.begin(), it2 = noncoverRow.begin(); | ||
314 | - i = 0; while (i++<n){ | ||
315 | - if (*(it1++)) cnt1++; // number of non-covered columns | ||
316 | - if (*(it2++)) cnt2++; // number of non-covered rows | ||
317 | - } | ||
318 | - temp1 = tmp1(cv::Rect(0, 0, cnt1, cnt2)); | ||
319 | - minR_uncovered = tmp5.rowRange(0, cnt2); | ||
320 | - minC_uncovered = tmp6.colRange(0, cnt1); | ||
321 | - extractGrids(dMat, noncoverRow, noncoverColumn, temp1); | ||
322 | - extractDots(minR, noncoverRow, minR_uncovered); | ||
323 | - extractDots(minC, noncoverColumn, minC_uncovered); | ||
324 | - | ||
325 | - // minVal & rIdx & cIdx | ||
326 | - temp2 = tmp2(cv::Rect(0, 0, cnt1, cnt2)); | ||
327 | - temp3 = tmp3(cv::Rect(0, 0, cnt1, cnt2)); | ||
328 | - repeat(minR_uncovered, 1, cnt1, temp2); | ||
329 | - repeat(minC_uncovered, cnt2, 1, temp3); | ||
330 | - temp3 = temp1 - temp2 - temp3; | ||
331 | - double minVal; | ||
332 | - cv::Point minLoc; | ||
333 | - minMaxLoc(temp3, &minVal, 0, &minLoc); | ||
334 | - rIdx.resize(1), cIdx.resize(1); | ||
335 | - rIdx[0] = minLoc.y, cIdx[0] = minLoc.x; | ||
336 | - | ||
337 | - // minC(~coverColumn) = minC(~coverColumn) + minval; | ||
338 | - ptF = (float*)minC.data, ptF2 = (float*)minR.data; | ||
339 | - it1 = noncoverColumn.begin(), it2 = noncoverRow.begin(); | ||
340 | - float minval = (float)minVal; | ||
341 | - i = 0; while (i++<n) if (*(it1++)) *(ptF++) += minval; else ptF++; | ||
342 | - // minR(coverRow) = minR(coverRow) - minval; | ||
343 | - i = 0; while (i++<n) if (*(it2++)) ptF2++; else *(ptF2++) -= minval; | ||
344 | - } | ||
345 | - else | ||
346 | - break; | ||
347 | - } | ||
348 | - | ||
349 | - // STEP 5 | ||
350 | - // Construct a series of alternating primed and starred zeros as follows: | ||
351 | - // Let Z0 represent the uncovered primed zero found in Step 4. | ||
352 | - // Let Z1 denote the starred zero in the column of Z0 (if any). | ||
353 | - // Let Z2 denote the primed zero in the row of Z1 (there will always | ||
354 | - // be one). Continue until the series terminates at a primed zero | ||
355 | - // that has no starred zero in its column. Unstar each starred | ||
356 | - // zero of the series, star each primed zero of the series, erase | ||
357 | - // all primes and uncover every line in the matrix. Return to Step 3. | ||
358 | - int rowZ1; | ||
359 | - for (j = 0; j<starZ.size(); j++) | ||
360 | - if (starZ[j] == uZc) | ||
361 | - break; | ||
362 | - if (j<starZ.size()) | ||
363 | - rowZ1 = j; | ||
364 | - else | ||
365 | - rowZ1 = -1; | ||
366 | - starZ[uZr] = uZc; | ||
367 | - while (rowZ1 >= 0){ | ||
368 | - starZ[rowZ1] = -1; | ||
369 | - uZc = primeZ[rowZ1]; | ||
370 | - uZr = rowZ1; | ||
371 | - for (j = 0; j<starZ.size(); j++) | ||
372 | - if (starZ[j] == uZc) | ||
373 | - break; | ||
374 | - if (j<starZ.size()) | ||
375 | - rowZ1 = j; | ||
376 | - else | ||
377 | - rowZ1 = -1; | ||
378 | - starZ[uZr] = uZc; | ||
379 | - } | ||
380 | - } | ||
381 | - | ||
382 | - // assignment | ||
383 | - // rowIdx = find(validRow); colIdx = find(validCol); | ||
384 | - vector<int> rowIdx(nRows), colIdx(nCols); | ||
385 | - it1 = validRow.begin(), it2 = validCol.begin(); | ||
386 | - for (i = 0, it3 = rowIdx.begin(); i<rows; i++) if (*(it1++)) *(it3++) = i; | ||
387 | - for (i = 0, it3 = colIdx.begin(); i<cols; i++) if (*(it2++)) *(it3++) = i; | ||
388 | - // vIdx = starZ(1:nRows) <= nCols; | ||
389 | - vector<bool> vIdx(nRows, false); | ||
390 | - it1 = vIdx.begin(), it3 = starZ.begin(); | ||
391 | - i = 0; while (i++<nRows) if (*(it3++)<nCols) *(it1++) = true; else it1++; | ||
392 | - // assignment(rowIdx(vIdx)) = colIdx(starZ(vIdx)); | ||
393 | - for (j = 0, it1 = vIdx.begin(); j<vIdx.size(); j++){ | ||
394 | - if (*(it1++)){ | ||
395 | - r = rowIdx[j], c = starZ[j]; | ||
396 | - assignment[r] = colIdx[c]; | ||
397 | - } | ||
398 | - } | ||
399 | - for (j = 0; j<assignment.size(); j++){ | ||
400 | - int job = assignment[j]; | ||
401 | - if (job>-1){ | ||
402 | - uchar isInvalid = validMat.at<uchar>(j, job); // validMat is now "invalidMat" | ||
403 | - if (isInvalid) | ||
404 | - assignment[j] = -1; | ||
405 | - } | ||
406 | - } | ||
407 | -} | ||
408 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/HungarianAlgorithm.h deleted
1 | -#ifndef HUNGARIANALGORITHM_H_ | ||
2 | -#define HUNGARIANALGORITHM_H_ | ||
3 | - | ||
4 | -#include <vector> | ||
5 | -#ifdef _MSC_VER | ||
6 | - #include <cv.h> | ||
7 | -#else | ||
8 | - #include <opencv2/core/core.hpp> | ||
9 | - #include <opencv2/highgui/highgui.hpp> | ||
10 | - #include <opencv2/imgproc/imgproc.hpp> | ||
11 | -#endif | ||
12 | - | ||
13 | -#include <assert.h> | ||
14 | -#include <iostream> | ||
15 | - | ||
16 | -using namespace std; | ||
17 | - | ||
18 | - | ||
19 | - | ||
20 | -void extractGrids(const cv::Mat &A, const vector<bool> &extractRows, const vector<bool> &extractCols, cv::Mat &B); | ||
21 | -void extractDots(const cv::Mat &A, const vector<bool> &extract, cv::Mat &B); | ||
22 | -void munkres(cv::Mat &IoUMat, vector<int> &assignment); | ||
23 | - | ||
24 | -#endif |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/KalmanBoxTracker.cpp deleted
1 | -#include "KalmanBoxTracker.h" | ||
2 | - | ||
3 | - | ||
4 | -float IoU(vector<float> &bb_test, vector<float> &bb_gt) | ||
5 | -{ | ||
6 | - float xx1, yy1, xx2, yy2, w, h, wh, o; | ||
7 | - xx1 = max(bb_test[0], bb_gt[0]); | ||
8 | - yy1 = max(bb_test[1], bb_gt[1]); | ||
9 | - xx2 = min(bb_test[2], bb_gt[2]); | ||
10 | - yy2 = min(bb_test[3], bb_gt[3]); | ||
11 | - w = max(float(0), (xx2 - xx1)); | ||
12 | - h = max(float(0), (yy2 - yy1)); | ||
13 | - wh = w * h; | ||
14 | - o = wh / ((bb_test[2] - bb_test[0])*(bb_test[3] - bb_test[1]) | ||
15 | - + (bb_gt[2] - bb_gt[0])*(bb_gt[3] - bb_gt[1]) - wh); | ||
16 | - return o; | ||
17 | -} | ||
18 | - | ||
19 | -void convert_bbox_to_z(vector<float> &bbox, vector<float> &z) | ||
20 | -{ | ||
21 | - float w, h, x, y, s, r; | ||
22 | - w = bbox[2] - bbox[0]; | ||
23 | - h = bbox[3] - bbox[1]; | ||
24 | - x = bbox[0] + w / 2; | ||
25 | - y = bbox[1] + h / 2; | ||
26 | - s = w * h; //scale is just area | ||
27 | - r = w / h; | ||
28 | - z.push_back(x); | ||
29 | - z.push_back(y); | ||
30 | - z.push_back(s); | ||
31 | - z.push_back(r); | ||
32 | - | ||
33 | -} | ||
34 | - | ||
35 | -void convert_x_to_bbox(cv::Mat &x, vector<float> &bbox) | ||
36 | -{ | ||
37 | - float w, h; | ||
38 | - w = sqrt(x.at<float>(2) * x.at<float>(3)); | ||
39 | - h = x.at<float>(2) / w; | ||
40 | - //bbox[x1,y1,x2,y2]; | ||
41 | - bbox.push_back(x.at<float>(0) - w / 2); | ||
42 | - bbox.push_back(x.at<float>(1) - h / 2); | ||
43 | - bbox.push_back(x.at<float>(0) + w / 2); | ||
44 | - bbox.push_back(x.at<float>(1) + h / 2); | ||
45 | -} | ||
46 | - | ||
47 | - | ||
48 | - | ||
49 | -KalmanBoxTracker::KalmanBoxTracker(vector<float> &bbox, int trackLength) | ||
50 | -{ | ||
51 | - KF.init(7, 4, 0); //初始化卡尔曼滤波器对象KF | ||
52 | - state = cv::Mat::zeros(7, 1, CV_32F); | ||
53 | - processNoise = cv::Mat::zeros(7, 1, CV_32F); | ||
54 | - measurement = cv::Mat::zeros(4, 1, CV_32F); //定义测量值 | ||
55 | - | ||
56 | - KF.transitionMatrix = (cv::Mat_<float>(7, 7) << \ | ||
57 | - 1, 0, 0, 0, 1, 0, 0, \ | ||
58 | - 0, 1, 0, 0, 0, 1, 0, \ | ||
59 | - 0, 0, 1, 0, 0, 0, 1, \ | ||
60 | - 0, 0, 0, 1, 0, 0, 0, \ | ||
61 | - 0, 0, 0, 0, 1, 0, 0, \ | ||
62 | - 0, 0, 0, 0, 0, 1, 0, \ | ||
63 | - 0, 0, 0, 0, 0, 0, 1); //状态转移矩阵A | ||
64 | - | ||
65 | - KF.measurementMatrix = (cv::Mat_<float>(4, 7) << \ | ||
66 | - 1, 0, 0, 0, 0, 0, 0, \ | ||
67 | - 0, 1, 0, 0, 0, 0, 0, \ | ||
68 | - 0, 0, 1, 0, 0, 0, 0, \ | ||
69 | - 0, 0, 0, 1, 0, 0, 0); //测量矩阵H | ||
70 | - | ||
71 | - KF.measurementNoiseCov = (cv::Mat_<float>(4, 4) << \ | ||
72 | - 1, 0, 0, 0, \ | ||
73 | - 0, 1, 0, 0, \ | ||
74 | - 0, 0, 10, 0, \ | ||
75 | - 0, 0, 0, 10); //测量噪声方差矩阵R | ||
76 | - | ||
77 | - KF.errorCovPost = (cv::Mat_<float>(7, 7) << \ | ||
78 | - 10, 0, 0, 0, 0, 0, 0, \ | ||
79 | - 0, 10, 0, 0, 0, 0, 0, \ | ||
80 | - 0, 0, 10, 0, 0, 0, 0, \ | ||
81 | - 0, 0, 0, 10, 0, 0, 0, \ | ||
82 | - 0, 0, 0, 0, 10000, 0, 0, \ | ||
83 | - 0, 0, 0, 0, 0, 10000, 0, \ | ||
84 | - 0, 0, 0, 0, 0, 0, 10000); //后验错误估计协方差矩阵P | ||
85 | - | ||
86 | - KF.processNoiseCov = (cv::Mat_<float>(7, 7) << \ | ||
87 | - 1, 0, 0, 0, 0, 0, 0, \ | ||
88 | - 0, 1, 0, 0, 0, 0, 0, \ | ||
89 | - 0, 0, 1, 0, 0, 0, 0, \ | ||
90 | - 0, 0, 0, 1, 0, 0, 0, \ | ||
91 | - 0, 0, 0, 0, 0.01, 0, 0, \ | ||
92 | - 0, 0, 0, 0, 0, 0.01, 0, \ | ||
93 | - 0, 0, 0, 0, 0, 0, 0.0001); //系统噪声方差矩阵Q | ||
94 | - | ||
95 | - vector<float> z; | ||
96 | - convert_bbox_to_z(bbox, z); | ||
97 | - KF.statePost = (cv::Mat_<float>(7, 1) << z[0], z[1], z[2], z[3], 0, 0, 0); //corrected state | ||
98 | - state = (cv::Mat_<float>(7, 1) << z[0], z[1], z[2], z[3], 0, 0, 0); | ||
99 | - time_since_update = 0; | ||
100 | - cls = bbox[5]; | ||
101 | - //history | ||
102 | - //hits = 0; | ||
103 | - hit_streak = 0; | ||
104 | - age = 0; | ||
105 | - | ||
106 | - m_trackLength = trackLength; | ||
107 | - //history = new cycleQueue<vector<float>>(trackLength); | ||
108 | - history.set_param(trackLength); | ||
109 | -} | ||
110 | - | ||
111 | -KalmanBoxTracker::~KalmanBoxTracker() | ||
112 | -{ | ||
113 | - | ||
114 | - /*int trackerSize = history.size(); | ||
115 | - | ||
116 | - for (int i = 0; i < trackerSize; i++) | ||
117 | - { | ||
118 | - history.get(i).clear(); | ||
119 | - vector<float>().swap(history.get(i)); | ||
120 | - | ||
121 | - }*/ | ||
122 | - | ||
123 | - /*if (history != NULL) | ||
124 | - { | ||
125 | - delete history; | ||
126 | - history = NULL; | ||
127 | - }*/ | ||
128 | -} | ||
129 | - | ||
130 | -void KalmanBoxTracker::update(vector<float> &bbox) | ||
131 | -{ | ||
132 | - time_since_update = 0; | ||
133 | - //history | ||
134 | - //hits += 1; | ||
135 | - hit_streak += 1; | ||
136 | - vector<float> z; | ||
137 | - convert_bbox_to_z(bbox, z); | ||
138 | - measurement = (cv::Mat_<float>(4, 1) << z[0], z[1], z[2], z[3]); | ||
139 | - KF.correct(measurement); | ||
140 | -} | ||
141 | - | ||
142 | -vector<float> KalmanBoxTracker::predict(bool isUseDet) | ||
143 | -{ | ||
144 | - if ((KF.statePost.at<float>(6) + KF.statePost.at<float>(2)) <= 0) | ||
145 | - KF.statePost.at<float>(6) *= 0.0; | ||
146 | - | ||
147 | - KF.predict(); | ||
148 | - | ||
149 | - age += 1; | ||
150 | - //cout << "33333FusionInterval:" << FusionInterval << endl; | ||
151 | - if (time_since_update >= FusionInterval) | ||
152 | - hit_streak = 0; | ||
153 | - if (isUseDet) | ||
154 | - time_since_update += 1; | ||
155 | - vector<float> bbox; | ||
156 | - convert_x_to_bbox(KF.statePost, bbox); | ||
157 | - //history.push_back(bbox); | ||
158 | - | ||
159 | - TRACK_POINT tmp_point; | ||
160 | - tmp_point.x = bbox[0] + (bbox[2] - bbox[0]) / 2; | ||
161 | - tmp_point.y = bbox[1] + (bbox[3] - bbox[1]) / 2; | ||
162 | - history.push(tmp_point); | ||
163 | - | ||
164 | - return bbox; | ||
165 | -} | ||
166 | - | ||
167 | -vector<float> KalmanBoxTracker::get_state() | ||
168 | -{ | ||
169 | - vector<float> bbox; | ||
170 | - convert_x_to_bbox(KF.statePost, bbox); | ||
171 | - return bbox; | ||
172 | -} | ||
173 | - |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/KalmanBoxTracker.h deleted
1 | -#ifndef KALMANBOXTRACKER_H_ | ||
2 | -#define KALMANBOXTRACKER_H_ | ||
3 | - | ||
4 | -#include <opencv2/video/tracking.hpp> | ||
5 | -#include <highgui.hpp> | ||
6 | -#include <iostream> | ||
7 | -#include <stdio.h> | ||
8 | -#include <math.h> | ||
9 | -#include <vector> | ||
10 | -#include "CycleQueue.h" | ||
11 | - | ||
12 | -using namespace std; | ||
13 | - | ||
14 | -//#define FusionInterval 5 //控制算法跳帧 | ||
15 | -class KalmanBoxTracker | ||
16 | -{ | ||
17 | -public: | ||
18 | - //int count = 0; | ||
19 | - int time_since_update = 0; | ||
20 | - int FusionInterval = 5; // 221007 | ||
21 | - int id = 0; | ||
22 | - int cls = 0; | ||
23 | - float score = 0.00; | ||
24 | - //vector< vector<float> > history; | ||
25 | - | ||
26 | - cycleQueue history; //固定大小的轨迹 | ||
27 | - | ||
28 | - //int hits; | ||
29 | - int hit_streak = 0; | ||
30 | - int age = 0; | ||
31 | - int m_trackLength = 0; | ||
32 | - | ||
33 | -public: | ||
34 | - KalmanBoxTracker(vector<float> &bbox, int trackLength); | ||
35 | - ~KalmanBoxTracker(); | ||
36 | - void update(vector<float> &bbox); | ||
37 | - vector<float> predict(bool isUseDet); | ||
38 | - vector<float> get_state(); | ||
39 | -private: | ||
40 | - cv::KalmanFilter KF; //创建卡尔曼滤波器对象KF | ||
41 | - cv::Mat measurement; | ||
42 | - cv::Mat state;// (7, 1, CV_32F); //state = x | ||
43 | - cv::Mat processNoise; | ||
44 | -}; | ||
45 | - | ||
46 | -float IoU(vector<float> &bb_test, vector<float> &bb_gt); | ||
47 | -void convert_bbox_to_z(vector<float> &bbox, vector<float> &z); | ||
48 | -void convert_x_to_bbox(cv::Mat &x, vector<float> &bbox); | ||
49 | - | ||
50 | - | ||
51 | -#endif | ||
52 | \ No newline at end of file | 0 | \ No newline at end of file |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/Sort.cpp deleted
1 | -#include "Sort.h" | ||
2 | -#include <opencv2/opencv.hpp> | ||
3 | -#include "../../DxDecoder/ImageSaveGPU.h" | ||
4 | - | ||
5 | -#ifdef _MSC_VER | ||
6 | -#include <io.h> | ||
7 | -#include <direct.h> | ||
8 | -#define _ACCESS _access | ||
9 | -#define _MKDIR(a) _mkdir((a)) | ||
10 | -#else | ||
11 | -#include <unistd.h> | ||
12 | -#include <stdarg.h> | ||
13 | -#include <sys/stat.h> | ||
14 | -#define _ACCESS access | ||
15 | -#define _MKDIR(a) mkdir((a),0755) | ||
16 | -#endif | ||
17 | -#include <time.h> | ||
18 | - | ||
19 | -const int color[11][3] = { { 255, 0, 0 }, { 255, 128, 255 }, { 255, 128, 0 }, { 255, 215, 0 }, { 154, 205, 50 }, { 0, 128, 0 }, \ | ||
20 | - {0, 128, 255}, { 186, 85, 211 }, { 91, 46, 0 }, { 0, 0, 0 }, { 255, 255, 255 } }; | ||
21 | - | ||
22 | - | ||
23 | -Sort::Sort() | ||
24 | -{ | ||
25 | - // max_age = 10; | ||
26 | - max_lost_times = 1; | ||
27 | - min_hits = 1; | ||
28 | - input_det_count = 0; | ||
29 | - WORK = true; | ||
30 | - //-----------------by zl---------------------// | ||
31 | - istraffic = false; //by zl 不统计交通量 | ||
32 | - trackcount = 0; | ||
33 | - //-----------------by zl---------------------// | ||
34 | - | ||
35 | - max_track_length = MAX_LENGTH; | ||
36 | - trackers.clear(); | ||
37 | -} | ||
38 | - | ||
39 | - | ||
40 | -int Sort::update(int width, int height, bool isUseDet, vector< vector<float> > &dets, VPT_ObjInfo *result, vector<int> &deleteObjectID) | ||
41 | -{ | ||
42 | - //get predicted locations from existing trackers. | ||
43 | - vector< vector<float> > trks; | ||
44 | - vector<float> pos; | ||
45 | - int ObjCount = 0; //by zl 本帧图像中的有效前景个数 | ||
46 | - vector<float> bbox; | ||
47 | - | ||
48 | - //cout << "trackers size: " << trackers.size() << endl; | ||
49 | - for (int i = 0; i < trackers.size(); i++ ) | ||
50 | - { | ||
51 | - pos = trackers[i].predict(isUseDet); | ||
52 | - pos.push_back(1); | ||
53 | - pos.push_back(trackers[i].cls); | ||
54 | - trks.push_back(pos); | ||
55 | - pos.clear(); | ||
56 | - } | ||
57 | - | ||
58 | - if (isUseDet == true) | ||
59 | - { | ||
60 | - vector< vector<int> > matched; | ||
61 | - vector<int> unmatched_dets; | ||
62 | - vector<int> unmatched_trks; | ||
63 | - | ||
64 | - Sort::associate_detections_to_trackers(matched, unmatched_dets, unmatched_trks, dets, trks, 0.3); | ||
65 | - | ||
66 | - //update matched trackers with assigned detections | ||
67 | - for (int matched_number = 0; matched_number < matched.size(); matched_number++) | ||
68 | - { | ||
69 | - trackers[matched[matched_number][1]].update(dets[matched[matched_number][0]]); | ||
70 | - trackers[matched[matched_number][1]].score = dets[matched[matched_number][0]][4]; | ||
71 | - trackers[matched[matched_number][1]].cls = dets[matched[matched_number][0]][5]; | ||
72 | - } | ||
73 | - | ||
74 | - //create and initialise new trackers for unmatched detections | ||
75 | - for (int unmatched_dets_number = 0; unmatched_dets_number < unmatched_dets.size(); unmatched_dets_number++) | ||
76 | - { | ||
77 | - KalmanBoxTracker tracker = KalmanBoxTracker(dets[unmatched_dets[unmatched_dets_number]], max_track_length); | ||
78 | - tracker.id = -1; | ||
79 | - // tracker.FusionInterval = FusionInterval; //221007 | ||
80 | - trackers.push_back(tracker); | ||
81 | - trackers[trackers.size() - 1].score = dets[unmatched_dets[unmatched_dets_number]][4];//by zl 20170525 解决第一次检测时置信度为0问题 | ||
82 | - // cout << "trackers size: " << trackers.size() << endl; | ||
83 | - } | ||
84 | - | ||
85 | - for (int trackers_number = 0; trackers_number < trackers.size();) | ||
86 | - { | ||
87 | - //cout << trackers[trackers_number].id << " " <<trackers[trackers_number].time_since_update << " " << trackers[trackers_number].hit_streak << " " << min_hits << " " << frame_count << endl; | ||
88 | - // if (trackers[trackers_number].time_since_update > max_age) | ||
89 | - if (trackers[trackers_number].time_since_update > max_lost_times) | ||
90 | - { | ||
91 | - if (trackers[trackers_number].id != -1) | ||
92 | - { | ||
93 | - deleteObjectID.push_back(trackers[trackers_number].id); | ||
94 | - } | ||
95 | - trackcount++; | ||
96 | - trackers.erase(trackers.begin() + trackers_number); | ||
97 | - continue; | ||
98 | - } | ||
99 | - //cout << "22222FusionInterval:" << trackers[trackers_number].FusionInterval << endl; | ||
100 | - if ((ObjCount < MAX_OBJ_COUNT && (trackers[trackers_number].time_since_update < max_lost_times)) && ((trackers[trackers_number].hit_streak >= min_hits) || (input_det_count <= min_hits))) | ||
101 | - // if (ObjCount < MAX_OBJ_COUNT && (trackers[trackers_number].time_since_update < trackers[trackers_number].FusionInterval) && ((trackers[trackers_number].hit_streak >= min_hits) || (frame_count <= (min_hits*trackers[trackers_number].FusionInterval)))) //221007 | ||
102 | - { | ||
103 | - | ||
104 | - if (trackers[trackers_number].id == -1) | ||
105 | - trackers[trackers_number].id = trackcount++; | ||
106 | - result[ObjCount].id = trackers[trackers_number].id; | ||
107 | - bbox = trackers[trackers_number].get_state(); | ||
108 | - result[ObjCount].left = bbox[0]; // bbout[i][0]; | ||
109 | - result[ObjCount].top = bbox[1]; //bbout[i][1]; | ||
110 | - result[ObjCount].right = bbox[2]; //bbout[i][2]; | ||
111 | - result[ObjCount].bottom = bbox[3]; //bbout[i][3]; | ||
112 | - result[ObjCount].confidence = trackers[trackers_number].score; // bbout[i][4]; | ||
113 | - // result[ObjCount].index = trackers[trackers_number].cls - 1; //针对FPN检测模型 id底层给出的值大了1 所以此处-1 | ||
114 | - result[ObjCount].index = trackers[trackers_number].cls; // 针对检测模型 底层库给出正确的index值 此处无须特殊处理 | ||
115 | - RectboundCheck(width, height, &result[ObjCount]); | ||
116 | - result[ObjCount].center_x = result[ObjCount].left + (result[ObjCount].right - result[ObjCount].left) * 0.5; // 中心点 add by 20170227 | ||
117 | - result[ObjCount].center_y = result[ObjCount].top + (result[ObjCount].bottom - result[ObjCount].top) * 0.5; // 中心点 | ||
118 | - //if(trackers[trackers_number].age==2*FusionInterval) | ||
119 | - if (trackers[trackers_number].age == 2 * trackers[trackers_number].FusionInterval) //221007 | ||
120 | - { | ||
121 | - result[ObjCount].snap_flag = 1; // 中心点 | ||
122 | - } | ||
123 | - else | ||
124 | - { | ||
125 | - result[ObjCount].snap_flag = 0; // 中心点 | ||
126 | - } | ||
127 | - | ||
128 | -#if _Debug | ||
129 | - printf("trackers_number = %d, trackers.size() = %d, update: index = %d, id = %d, (%d, %d), (%d, %d)\n", trackers_number, trackers.size(), result[ObjCount].index, result[ObjCount].id, result[ObjCount].left, result[ObjCount].top, result[ObjCount].right, result[ObjCount].bottom); | ||
130 | -#endif | ||
131 | - ObjCount++; | ||
132 | - } | ||
133 | - trackers_number++;//共多少条轨迹 | ||
134 | - | ||
135 | - } | ||
136 | - | ||
137 | - input_det_count += 1; //帧数加一 | ||
138 | - } | ||
139 | - else | ||
140 | - { | ||
141 | - for (int trackers_number = 0; trackers_number < trackers.size() && ObjCount < MAX_OBJ_COUNT; trackers_number++) | ||
142 | - { | ||
143 | - // printf("trackers_number: %d\n", trackers_number); | ||
144 | - //cout << "44444FusionInterval:" << trackers[trackers_number].FusionInterval << endl; | ||
145 | - if (trackers[trackers_number].id == -1) | ||
146 | - trackers[trackers_number].id = trackcount++; | ||
147 | - bbox = trackers[trackers_number].get_state(); | ||
148 | - result[trackers_number].id = trackers[trackers_number].id; | ||
149 | - result[trackers_number].left = bbox[0]; // bbout[i][0]; | ||
150 | - result[trackers_number].top = bbox[1]; //bbout[i][1]; | ||
151 | - result[trackers_number].right = bbox[2]; //bbout[i][2]; | ||
152 | - result[trackers_number].bottom = bbox[3]; //bbout[i][3]; | ||
153 | - result[trackers_number].confidence = trackers[trackers_number].score; // bbout[i][4]; | ||
154 | - // result[trackers_number].index = trackers[trackers_number].cls - 1;//bbox[5] - 1;// trackers[trackers_number].cls - 1; // bbout[i][5] - 1; | ||
155 | - result[trackers_number].index = trackers[trackers_number].cls;//bbox[5] - 1;// trackers[trackers_number].cls - 1; // bbout[i][5] - 1; | ||
156 | - RectboundCheck(width, height, &result[trackers_number]); | ||
157 | - result[trackers_number].center_x = (int)(result[trackers_number].left + (result[trackers_number].right - result[trackers_number].left) * 0.5); // 中心点 add by 20170227 | ||
158 | - result[trackers_number].center_y = (int)(result[trackers_number].top + (result[trackers_number].bottom - result[trackers_number].top) * 0.5); // 中心点 | ||
159 | - | ||
160 | - result[ObjCount].snap_flag = 0; // 中心点 | ||
161 | - | ||
162 | - ObjCount++; | ||
163 | - } | ||
164 | - } | ||
165 | - | ||
166 | - //---------------------------注释掉了这步操作 用了新的绘制轨迹的函数 需要绘制调用addTracker(Mat *img)方法 by lm---------------------------------------------/ | ||
167 | - //addTracker(result, ObjCount); | ||
168 | - | ||
169 | - | ||
170 | - return ObjCount; | ||
171 | - | ||
172 | -} | ||
173 | - | ||
174 | -// | ||
175 | -////---------------------------by zl ---------------------------------------------/ | ||
176 | -//int Sort::addTracker(VPT_ObjInfo *result, int resultcount) | ||
177 | -//{ | ||
178 | -// for (int i = 0; i < resultcount; i++) | ||
179 | -// { | ||
180 | -// bool flag = false; | ||
181 | -// for (int j = 0; j < tracker.size(); j++) | ||
182 | -// { | ||
183 | -// if (result[i].id == tracker[j].id) //若有匹配的 则更新 | ||
184 | -// { | ||
185 | -// tracker[j].listinfo.push_back(result[i]); | ||
186 | -// tracker[j].lost = 0; | ||
187 | -// tracker[j].isupdate = true; | ||
188 | -// tracker[j].num++; //每个ID的计数 | ||
189 | -// result[i].num = tracker[j].num; | ||
190 | -// | ||
191 | -// if (tracker[j].istraffic == false && istraffic) | ||
192 | -// { | ||
193 | -// int listmax = tracker[j].listinfo.size() - 1; | ||
194 | -// } | ||
195 | -// flag = true; | ||
196 | -// break; | ||
197 | -// } | ||
198 | -// } | ||
199 | -// if (!flag) //没有找到匹配项 新添加 | ||
200 | -// { | ||
201 | -// mylist m_list; | ||
202 | -// m_list.listinfo.push_back(result[i]); | ||
203 | -// m_list.isupdate = true; | ||
204 | -// m_list.lost = 0; | ||
205 | -// m_list.id = result[i].id; | ||
206 | -// m_list.index = result[i].index;; | ||
207 | -// m_list.istraffic = false; | ||
208 | -// m_list.num = 0; //20170306 | ||
209 | -// result[i].num = 0; | ||
210 | -// m_list.startframe = frame_count; | ||
211 | -//#if _Debug | ||
212 | -// printf("addTracker_pushback :index = %d, id = %d, (%d, %d), (%d, %d)\n", m_list.index, m_list.id, result[i].left, result[i].top, result[i].right, result[i].bottom); | ||
213 | -//#endif | ||
214 | -// tracker.push_back(m_list); | ||
215 | -// } | ||
216 | -// } | ||
217 | -// //绘制轨迹部分 | ||
218 | -// | ||
219 | -// for (vector <mylist>::iterator iter = tracker.begin(); iter != tracker.end();) | ||
220 | -// { | ||
221 | -// if (iter->isupdate == false) //未更新的不绘制轨迹 | ||
222 | -// { | ||
223 | -// iter->lost++; | ||
224 | -// if (iter->lost > LOSTMAXFRAMECCOUNT) //若丢失太多 则删除该轨迹 | ||
225 | -// { | ||
226 | -// iter->endframe = frame_count; //结束帧 | ||
227 | -// iter = tracker.erase(iter);//删除 | ||
228 | -// continue; | ||
229 | -// } | ||
230 | -// } | ||
231 | -// else //只对更新后的绘制轨迹 | ||
232 | -// { | ||
233 | -// ; | ||
234 | -// } | ||
235 | -// iter->isupdate = false; | ||
236 | -// iter++; | ||
237 | -// } | ||
238 | -// | ||
239 | -// return 1; | ||
240 | -//} | ||
241 | - | ||
242 | - | ||
243 | -//---------------------------利用trackers中的history 绘制路径 -by lm ---------------------------------------------/ | ||
244 | -//固定长度的轨迹,采用循环队列,仅保存目前最前N length的轨迹,避免对于停留在画面中目标 导致的内存一直增长 | ||
245 | -int Sort::addTracker(cv::Mat *img) | ||
246 | -{ | ||
247 | - map<int, pair<int, int>> tracker; | ||
248 | - vector<float> bbox; | ||
249 | - | ||
250 | - | ||
251 | - int x_1, y_1, x_2, y_2; | ||
252 | - for (auto iter : trackers) | ||
253 | - { | ||
254 | - //if (iter.time_since_update < FusionInterval) | ||
255 | - //cout << "55555FusionInterval:" << iter.FusionInterval << endl; | ||
256 | - if (iter.time_since_update < iter.FusionInterval) //221007 | ||
257 | - { | ||
258 | - int index = iter.history.getFront(); | ||
259 | - int trackerSize = iter.history.size(); | ||
260 | - | ||
261 | - for (int i = 0; i < trackerSize; i++) | ||
262 | - { | ||
263 | - if (i == 0) | ||
264 | - { | ||
265 | - x_1 = iter.history.get(index).x; | ||
266 | - y_1 = iter.history.get(index).y; | ||
267 | - } | ||
268 | - else | ||
269 | - { | ||
270 | - x_2 = iter.history.get(index).x; | ||
271 | - y_2 = iter.history.get(index).y; | ||
272 | - int colorIndex = iter.id % 11; | ||
273 | - cv::line(*img, cv::Point(x_1, y_1), cv::Point(x_2, y_2), cv::Scalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 1); | ||
274 | - | ||
275 | - //drawLineOnGPU() | ||
276 | - | ||
277 | - x_1 = x_2; | ||
278 | - y_1 = y_2; | ||
279 | - } | ||
280 | - | ||
281 | - //if (i == 0) | ||
282 | - //{ | ||
283 | - // x_1 = iter.history.get(index)[0] + (iter.history.get(index)[2] - iter.history.get(index)[0]) / 2; | ||
284 | - // y_1 = iter.history.get(index)[1] + (iter.history.get(index)[3] - iter.history.get(index)[1]) / 2; | ||
285 | - //} | ||
286 | - //else | ||
287 | - //{ | ||
288 | - // x_2 = iter.history.get(index)[0] + (iter.history.get(index)[2] - iter.history.get(index)[0]) / 2; | ||
289 | - // y_2 = iter.history.get(index)[1] + (iter.history.get(index)[3] - iter.history.get(index)[1]) / 2; | ||
290 | - // int colorIndex = iter.id % 11; | ||
291 | - // cv::line(*img, cvPoint(x_1, y_1), cvPoint(x_2, y_2), cvScalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 1); | ||
292 | - | ||
293 | - // //drawLineOnGPU() | ||
294 | - | ||
295 | - // x_1 = x_2; | ||
296 | - // y_1 = y_2; | ||
297 | - //} | ||
298 | - | ||
299 | - index = (index + 1) % trackerSize; | ||
300 | - } | ||
301 | - | ||
302 | - //int index = iter.history->getFront(); | ||
303 | - //int trackerSize = iter.history->size(); | ||
304 | - | ||
305 | - //for (int i = 0; i < trackerSize; i++) | ||
306 | - //{ | ||
307 | - // if (i == 0) | ||
308 | - // { | ||
309 | - // x_1 = iter.history->get(index)[0] + (iter.history->get(index)[2] - iter.history->get(index)[0]) / 2; | ||
310 | - // y_1 = iter.history->get(index)[1] + (iter.history->get(index)[3] - iter.history->get(index)[1]) / 2; | ||
311 | - // } | ||
312 | - // else | ||
313 | - // { | ||
314 | - // x_2 = iter.history->get(index)[0] + (iter.history->get(index)[2] - iter.history->get(index)[0]) / 2; | ||
315 | - // y_2 = iter.history->get(index)[1] + (iter.history->get(index)[3] - iter.history->get(index)[1]) / 2; | ||
316 | - // int colorIndex = iter.id % 11; | ||
317 | - // cv::line(*img, cvPoint(x_1, y_1), cvPoint(x_2, y_2), cvScalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 1); | ||
318 | - | ||
319 | - // //drawLineOnGPU() | ||
320 | - | ||
321 | - // x_1 = x_2; | ||
322 | - // y_1 = y_2; | ||
323 | - // } | ||
324 | - | ||
325 | - // index = (index + 1) % trackerSize; | ||
326 | - //} | ||
327 | - } | ||
328 | - | ||
329 | - } | ||
330 | - | ||
331 | - return 1; | ||
332 | -} | ||
333 | - | ||
334 | -//不固定长度的轨迹版本 采用vector,轨迹一直保留,对于停留在画面中的物体,会有内存一直增长的隐患 | ||
335 | -//int Sort::addTracker(cv::Mat *img) | ||
336 | -//{ | ||
337 | -// map<int, pair<int, int>> tracker; | ||
338 | -// vector<float> bbox; | ||
339 | -// | ||
340 | -// | ||
341 | -// int x_1, y_1, x_2, y_2; | ||
342 | -// for (auto iter : trackers) | ||
343 | -// { | ||
344 | -// if (iter.time_since_update < FusionInterval) | ||
345 | -// { | ||
346 | -// for (int i = 0; i < iter.history.size(); i++) | ||
347 | -// { | ||
348 | -// | ||
349 | -// if (i == 0) | ||
350 | -// { | ||
351 | -// x_1 = iter.history[i][0] + (iter.history[i][2] - iter.history[i][0]) / 2; | ||
352 | -// y_1 = iter.history[i][1] + (iter.history[i][3] - iter.history[i][1]) / 2; | ||
353 | -// } | ||
354 | -// else | ||
355 | -// { | ||
356 | -// x_2 = iter.history[i][0] + (iter.history[i][2] - iter.history[i][0]) / 2; | ||
357 | -// y_2 = iter.history[i][1] + (iter.history[i][3] - iter.history[i][1]) / 2; | ||
358 | -// int colorIndex = iter.id % 11; | ||
359 | -// cv::line(*img, cvPoint(x_1, y_1), cvPoint(x_2, y_2), cvScalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 1); | ||
360 | -// | ||
361 | -// //drawLineOnGPU() | ||
362 | -// | ||
363 | -// x_1 = x_2; | ||
364 | -// y_1 = y_2; | ||
365 | -// } | ||
366 | -// } | ||
367 | -// } | ||
368 | -// | ||
369 | -// } | ||
370 | -// | ||
371 | -// return 1; | ||
372 | -//} | ||
373 | - | ||
374 | -void Sort::Release() | ||
375 | -{ | ||
376 | - //tracker.clear(); | ||
377 | - //vector <mylist>().swap(tracker); | ||
378 | - trackers.clear(); | ||
379 | - vector<KalmanBoxTracker>().swap(trackers); | ||
380 | -} | ||
381 | -bool Sort::GetState() | ||
382 | -{ | ||
383 | - return WORK; | ||
384 | -} | ||
385 | - | ||
386 | -void Sort::Pause() | ||
387 | -{ | ||
388 | - WORK = false; | ||
389 | -} | ||
390 | - | ||
391 | -void Sort::ReSet() | ||
392 | -{ | ||
393 | - WORK = true; | ||
394 | - //Release(); | ||
395 | - //max_age = 1; | ||
396 | - //min_hits = 3; | ||
397 | - //frame_count = 0; | ||
398 | - | ||
399 | - ////-----------------by zl---------------------// | ||
400 | - //istraffic = false; //by zl 不统计交通量 | ||
401 | - //trackcount = 0; | ||
402 | - ////-----------------by zl---------------------// | ||
403 | -} | ||
404 | - | ||
405 | -//---------------------------by zl ---------------------------------------------/ | ||
406 | -bool line_rect_intersection(cv::Point start_p, cv::Point end_p, int left, int top, int right, int bottom) | ||
407 | -{ | ||
408 | - int a = start_p.y - end_p.y; | ||
409 | - int b = end_p.x - start_p.x; | ||
410 | - int c = start_p.x* end_p.y - end_p.x* start_p.y; | ||
411 | - | ||
412 | - ////思路:先看线段所在直线是否与矩形相交,如果不相交则必为 “F”, | ||
413 | - ////如果相交,则看线段的两个点是否在矩形的同一边(即两点的 x(y) 坐标都比矩形的小 x(y) 坐标小,或者大), | ||
414 | - ////若在同一边则为“F”,否则就是相交的情况。 | ||
415 | - if ((a* left + b*top + c >= 0 && a* right + b* bottom + c <= 0) || | ||
416 | - (a* left + b*top + c <= 0 && a* right + b* bottom + c >= 0) || | ||
417 | - (a* left + b*bottom + c >= 0 && a* right + b* top + c <= 0) || | ||
418 | - (a* left + b*bottom + c >= 0 && a* right + b* top + c <= 0)) | ||
419 | - { | ||
420 | - if (left > right) | ||
421 | - { | ||
422 | - swap(left, right); | ||
423 | - } | ||
424 | - if (top < bottom) | ||
425 | - { | ||
426 | - swap(top, bottom); | ||
427 | - } | ||
428 | - if ((start_p.x < left && end_p.x < left) || | ||
429 | - (start_p.x > right && end_p.x < left) || | ||
430 | - (start_p.y > top && end_p.y > top) || | ||
431 | - (start_p.y < bottom && end_p.y < bottom)) ///判断线段是否在矩形一侧 | ||
432 | - { | ||
433 | - return false; | ||
434 | - } | ||
435 | - else | ||
436 | - { | ||
437 | - return true; | ||
438 | - } | ||
439 | - } | ||
440 | - else | ||
441 | - { | ||
442 | - return false; | ||
443 | - } | ||
444 | -} | ||
445 | -void RectboundCheck(int Width, int Height, VPT_ObjInfo * result) //防止坐标越界 by zl | ||
446 | -{ | ||
447 | - if (result->left < 0) | ||
448 | - result->left = 0; | ||
449 | - if (result->left >= Width) | ||
450 | - result->left = Width; | ||
451 | - | ||
452 | - if (result->top < 0) | ||
453 | - result->top = 0; | ||
454 | - if (result->top >= Height) | ||
455 | - result->top = Height; | ||
456 | - | ||
457 | - if (result->right <= result->left) | ||
458 | - result->right = result->left + 1; | ||
459 | - if (result->right >= Width) | ||
460 | - result->right = Width; | ||
461 | - | ||
462 | - if (result->bottom < result->top) | ||
463 | - result->bottom = result->top + 1; | ||
464 | - if (result->bottom >= Height) | ||
465 | - result->bottom = Height; | ||
466 | - | ||
467 | - | ||
468 | -} | ||
469 | -//------------------------------------其他函数----------------------------------------// | ||
470 | -void Sort::associate_detections_to_trackers(vector< vector<int> > &matched, vector<int> &unmatched_dets, vector<int> &unmatched_trks, vector< vector<float> > &dets, vector< vector<float> > &trks, float iou_threshold) | ||
471 | -{ | ||
472 | - | ||
473 | - if (0 == trks.size()) | ||
474 | - { | ||
475 | - for (int x = 0; x < dets.size(); x++) | ||
476 | - { | ||
477 | - unmatched_dets.push_back(x); | ||
478 | - } | ||
479 | - } | ||
480 | - else if (0 == dets.size()) | ||
481 | - { | ||
482 | - for (int x = 0; x < trks.size(); x++) | ||
483 | - { | ||
484 | - unmatched_trks.push_back(x); | ||
485 | - } | ||
486 | - } | ||
487 | - else | ||
488 | - { | ||
489 | - cv::Mat IoUMat(dets.size(), trks.size(), CV_32FC1); | ||
490 | - for (int i = 0; i < dets.size(); i++) | ||
491 | - for (int j = 0; j < trks.size(); j++) | ||
492 | - { | ||
493 | - //cls区分 | ||
494 | - if (1) | ||
495 | - //if (dets[i][5] == trks[j][5]) | ||
496 | - { | ||
497 | - IoUMat.at<float>(i, j) = IoU(dets[i], trks[j]); | ||
498 | - } | ||
499 | - else | ||
500 | - { | ||
501 | - IoUMat.at<float>(i, j) = 0; | ||
502 | - } | ||
503 | - | ||
504 | - } | ||
505 | - | ||
506 | - //匈牙利算法 | ||
507 | - vector<int> assignment; | ||
508 | - munkres(IoUMat, assignment); | ||
509 | - | ||
510 | - vector<int>::iterator iter; | ||
511 | - for (int trackers_indices = 0; trackers_indices < trks.size(); trackers_indices++) | ||
512 | - { | ||
513 | - iter = find(assignment.begin(), assignment.end(), trackers_indices); | ||
514 | - if (iter == assignment.end()) | ||
515 | - { | ||
516 | - //assignment中不存在trackers_indices值 | ||
517 | - unmatched_trks.push_back(trackers_indices); | ||
518 | - } | ||
519 | - } | ||
520 | - | ||
521 | - vector<int> matched_row_col; | ||
522 | - for (int detections_indices = 0; detections_indices < assignment.size(); detections_indices++) | ||
523 | - { | ||
524 | - if (assignment[detections_indices] == -1) | ||
525 | - { | ||
526 | - unmatched_dets.push_back(detections_indices); | ||
527 | - } | ||
528 | - else if (IoUMat.at<float>(detections_indices, assignment[detections_indices]) > iou_threshold) | ||
529 | - { | ||
530 | - matched_row_col.push_back(detections_indices); | ||
531 | - matched_row_col.push_back(assignment[detections_indices]); | ||
532 | - matched.push_back(matched_row_col); | ||
533 | - matched_row_col.clear(); | ||
534 | - } | ||
535 | - else | ||
536 | - { | ||
537 | - unmatched_dets.push_back(detections_indices); | ||
538 | - unmatched_trks.push_back(assignment[detections_indices]); | ||
539 | - } | ||
540 | - } | ||
541 | - } | ||
542 | -} | ||
543 | -//判断两条线是否相交 | ||
544 | - | ||
545 | -///------------alg 2------------ | ||
546 | -//叉积 | ||
547 | -double mult(cv::Point a, cv::Point b, cv::Point c) | ||
548 | -{ | ||
549 | - return (a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y); | ||
550 | -} | ||
551 | - | ||
552 | -//aa, bb为一条线段两端点 cc, dd为另一条线段的两端点 相交返回true, 不相交返回false | ||
553 | -bool intersect(cv::Point aa, cv::Point bb, cv::Point cc, cv::Point dd) | ||
554 | -{ | ||
555 | - if (max(aa.x, bb.x)<min(cc.x, dd.x)) | ||
556 | - { | ||
557 | - return false; | ||
558 | - } | ||
559 | - if (max(aa.y, bb.y)<min(cc.y, dd.y)) | ||
560 | - { | ||
561 | - return false; | ||
562 | - } | ||
563 | - if (max(cc.x, dd.x)<min(aa.x, bb.x)) | ||
564 | - { | ||
565 | - return false; | ||
566 | - } | ||
567 | - if (max(cc.y, dd.y)<min(aa.y, bb.y)) | ||
568 | - { | ||
569 | - return false; | ||
570 | - } | ||
571 | - if (mult(cc, bb, aa)*mult(bb, dd, aa)<0) | ||
572 | - { | ||
573 | - return false; | ||
574 | - } | ||
575 | - if (mult(aa, dd, cc)*mult(dd, bb, cc)<0) | ||
576 | - { | ||
577 | - return false; | ||
578 | - } | ||
579 | - return true; | ||
580 | -} | ||
581 | -///------------alg 2------------ |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/sort1/Sort.h deleted
1 | -#ifndef SORT_H_ | ||
2 | -#define SORT_H_ | ||
3 | - | ||
4 | -#include "KalmanBoxTracker.h" | ||
5 | -#include "HungarianAlgorithm.h" | ||
6 | -#include <opencv2/video/tracking.hpp> | ||
7 | -#include <highgui.hpp> | ||
8 | -#include <iostream> | ||
9 | -#include <stdio.h> | ||
10 | -#include <math.h> | ||
11 | -#include<vector> | ||
12 | -#include "../VPTProcess.h" | ||
13 | - | ||
14 | - | ||
15 | -using namespace std; | ||
16 | - | ||
17 | - | ||
18 | -#define LOSTMAXFRAMECCOUNT 5 //by zl | ||
19 | -#define SNAPSHOTFRAMECOUNT 24 //下标从0开始 取第十帧为快照帧 | ||
20 | - | ||
21 | -struct TrackerResult | ||
22 | -{ | ||
23 | - vector< vector<float> > trackers_box; | ||
24 | - vector< vector< vector<float> > > trackers_history; | ||
25 | -}; | ||
26 | - | ||
27 | - | ||
28 | -typedef struct mylist | ||
29 | -{ | ||
30 | - vector <VPT_ObjInfo> listinfo; | ||
31 | - int lost; //丢失的帧数 >LOSTMAXFRAMECCOUNT 则认为彻底丢失目标 | ||
32 | - long id; | ||
33 | - bool isupdate; | ||
34 | - bool istraffic; | ||
35 | - int index;// 行人类别 | ||
36 | - int num; // 该ID序列下的第num帧 20170306 从0开始计数 | ||
37 | - int startframe; //轨迹开始帧 | ||
38 | - int endframe; //轨迹结束帧 | ||
39 | -}mylist; | ||
40 | - | ||
41 | - | ||
42 | - | ||
43 | -class Sort | ||
44 | -{ | ||
45 | -public: | ||
46 | - Sort(); | ||
47 | - int update(int width, int height, bool isUseDet, vector< vector<float> > &dets, VPT_ObjInfo *result, vector<int> &deleteObjectID); | ||
48 | - void Release(); | ||
49 | - void ReSet(); | ||
50 | - void Pause(); | ||
51 | - bool GetState(); | ||
52 | - int addTracker(cv::Mat *img); | ||
53 | -public: | ||
54 | - vector<KalmanBoxTracker> trackers; | ||
55 | - //int FusionInterval = 5; // 221007 | ||
56 | - //int max_age = 0; | ||
57 | - int max_lost_times = 3; | ||
58 | - int min_hits = 0; | ||
59 | - int input_det_count =0; | ||
60 | - int trackcount = 0; | ||
61 | - int max_track_length = 0; | ||
62 | - | ||
63 | -private: | ||
64 | - int linecount = 0; | ||
65 | - bool istraffic = 0; //by zl 是否统计交通量 | ||
66 | - //vector <mylist> tracker; | ||
67 | - bool WORK = false; | ||
68 | - | ||
69 | -private: | ||
70 | - void associate_detections_to_trackers(vector< vector<int> > &matched, vector<int> &unmatched_dets, vector<int> &unmatched_trks, vector< vector<float> > &dets, vector< vector<float> > &trks, float iou_threshold = 0.3); | ||
71 | - //int addTracker(VPT_ObjInfo *result, int resultcount); | ||
72 | - int Traffic(); | ||
73 | -}; | ||
74 | -//辅助函数 | ||
75 | -void RectboundCheck(int Width, int Height, VPT_ObjInfo * result); //防止坐标越界 by zl | ||
76 | -bool intersect(cv::Point aa, cv::Point bb, cv::Point cc, cv::Point dd); //判断两个线条是否相交 暂时未用到 | ||
77 | -bool line_rect_intersection(cv::Point start_p, cv::Point end_p, int left, int top, int right, int bottom); //判断矩形框与线条是否相交 | ||
78 | -#endif | ||
79 | \ No newline at end of file | 0 | \ No newline at end of file |