VPTTestThread.cppbk20200221 7.21 KB
#include <vector>
#include <iostream>
#include <fstream>
#include <time.h>
#ifdef _MSC_VER
#include "../VPT/VPT.h"
#include <windows.h>
#include <cv.h>
#include <highgui.h>
#include <opencv2/opencv.hpp>
#else
#include "VPT.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#endif
//#include "../VPT/header.h"

#ifndef _MSC_VER
#include<time.h>
#include <sys/time.h>
#include <unistd.h>
#define Sleep(a) usleep((a)*1000)
#define MACRO_COUNT_TIME_START(name)  struct timeval macro_tv_start_##name;\
		struct timeval macro_tv_end_##name;\
	gettimeofday(&macro_tv_start_##name,NULL);
#define MACRO_COUNT_TIME_END(name,___total_count___) gettimeofday(&macro_tv_end_##name,NULL);\
		printf("%s time cost: %.2f ms \n", #name, ( (double)(macro_tv_end_##name.tv_sec-macro_tv_start_##name.tv_sec)*1000000+(double)(macro_tv_end_##name.tv_usec-macro_tv_start_##name.tv_usec)   )/1000/___total_count___);
#endif

using namespace cv;
using namespace std;

//检测种类
const int detectType = 9;

//行人 自行车 摩托车 三轮车 小型车 大车 卡车 拖拉机 中巴
string type[detectType] = { "person", "bike", "motor", "tricycle", "car", "bigbus", "lorry", "tractor", "midibus" };
static int color[detectType][3] = { { 41, 244, 222 }, { 255, 128, 0 }, { 100, 13, 244 }, { 255, 215, 0 }, { 18, 220, 87 }, { 0, 128, 0 }, \
{0, 128, 255}, { 255, 0, 0 }, { 91, 46, 0 } };


//返回快照结果回调函数
void SnapshotInfoCallback(VIDEO_OBJECT_SNAPSHOT *videoObjectSnapshot)
{
	cout << videoObjectSnapshot->objectID << " " << videoObjectSnapshot->left << " " << videoObjectSnapshot->right << " " << videoObjectSnapshot->top << " " << videoObjectSnapshot->bottom
		<< " " << videoObjectSnapshot->firstPicPath << " " << videoObjectSnapshot->secondPicPath << " " << videoObjectSnapshot->taskFrameCount << " " << videoObjectSnapshot->objectIndex << endl;
}


//显示变量
Mat imgResized;
bool img_show = false;
bool show = true;

#ifdef _MSC_VER
//显示线程
DWORD WINAPI DiaplayThread(LPVOID param)
{
	LARGE_INTEGER nFreq, nSaveBeginTime, nSaveEndTime;
	QueryPerformanceFrequency(&nFreq);

	while (show)
	{
		if (img_show)
		{
			cv::imshow("RESULT", imgResized);
			cv::waitKey(1);
			img_show = false;
		}
		Sleep(1);
	}
	return 0;
}
#endif




void *pthread_1(void *arg)
{
   //字体初始化
	CvFont font;
	cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0, 0, 1, 3);
	int fontFace = CV_FONT_HERSHEY_COMPLEX;
	double fontScale = 1;
	int thickness = 2;

	//其他变量
	Mat img;


	int frameCount = 0;
	const int maxResultCount = 100;

#ifdef _MSC_VER
	LARGE_INTEGER nFreq, nBeginTime, nEndTime;
	QueryPerformanceFrequency(&nFreq);
#endif
	//初始化
	//快照保存参数设置
	SNAPSHOT_PARAMETER ssparam;
	ssparam.selectFromMinbox = true;
	ssparam.selectFromMindistance = true;

	//1.设置最小检测框,各种类目标小于最小检测框大小时不进行快照的保存
	MRECT m_boxsize[DETECTTYPE] = { MRECT(20, 20), MRECT(50, 80), MRECT(50, 80), MRECT(60, 80), MRECT(80, 80), MRECT(90, 90), MRECT(100, 100), MRECT(100, 100), MRECT(100, 100) };  //行人 自行车 摩托车 三轮车 小型车 大车 卡车 拖拉机 中巴
	//2.设置目标距离画面边框的最小距离,当目标位置与画面边框小于最小距离时不再更新快照
	int m_distance[EDGES] = { 20, 30, 20, 30 };   //left, top, right, bottom 

	memcpy(ssparam.minBoxsize, m_boxsize, sizeof(MRECT)* DETECTTYPE);
	memcpy(ssparam.minDistance, m_distance, sizeof(int)* EDGES);

	void * tools = NULL;
	VPT_PARAM vparam;
	vparam.gpuid = 0;
	vparam.maxResultCount = maxResultCount;        //限制算法内部输出的最大前景个数
	vparam.SnaoshotParameter = &ssparam;
#ifdef _MSC_VER
	int res = VPT_Init(tools, vparam, "G:/TestRes", SnapshotInfoCallback);
#else
	int res = VPT_Init(tools, vparam, "./", SnapshotInfoCallback);
#endif
	if (res != 0)
	{
		cout << "VPT Init Failed!" << endl;
		system("pause");
		return 0;
	}



int iter_count = 1;

//结果变量
	VPT_Result result;
	result.obj = new VPT_ObjInfo[maxResultCount];   //设置外部接收结果的最大前景个数
 
while(iter_count--)
{
	VideoCapture cap;
#ifdef _MSC_VER
	cap.open("G://TestData//人车物//测试视频1.avi");
#else
	cap.open("/mnt/data/sy_vpt_test_data/duan1.avi");
 //cap.open(argv[1]);
#endif
	cap.read(img);
 
 
 cv::imwrite("out.jpg", img);
 
	VideoWriter writer("720.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(img.cols, img.rows));
 
	

#ifdef _MSC_VER
	//创建显示线程
	DWORD dwThreadID = 0;
	HANDLE handle_display = CreateThread(NULL, 0, DiaplayThread, 0, 0, &dwThreadID);
#endif

	int start = 0;
	cap.set(CV_CAP_PROP_POS_FRAMES, start);

	double totalTime = 0.0;
	//检测

ofstream file("res.txt");

	while (cap.read(img) )
	{
		start++;
		cout << "---------------- " << frameCount << " -----------------" << endl;

#ifdef _MSC_VER
		QueryPerformanceCounter(&nBeginTime);
#else
		MACRO_COUNT_TIME_START(vpt_process);
#endif
		VPT_Process(tools, img.data, img.cols, img.rows, img.channels(), frameCount, &result, true);

#ifdef _MSC_VER
		QueryPerformanceCounter(&nEndTime);
		totalTime += (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;
		printf("Total Time: %.2fms  \n", (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart);
#else
		MACRO_COUNT_TIME_END(vpt_process, 1);
#endif
		for (int c = 0; c < result.objCount; c++)
		{
			char str_i[100];

			sprintf(str_i, "%d_%.2f", result.obj[c].id,result.obj[c].confidence );
			int colorIndex = result.obj[c].index;


			file << start << " " << result.obj[c].id << " " << result.obj[c].index << " " << result.obj[c].left << " " <<
				result.obj[c].top << " " << result.obj[c].right << " " << result.obj[c].bottom << endl;

			rectangle(img, cvPoint(result.obj[c].left - 5, result.obj[c].top - 15), cvPoint(result.obj[c].right + 5, result.obj[c].bottom + 10), cv::Scalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 3, 1);
			cv::putText(img, str_i, cv::Point(result.obj[c].left, result.obj[c].top), fontFace, fontScale, cv::Scalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), thickness, 8);
		}

		cv::resize(img, imgResized, cv::Size(1280, 720));
  // writer << img;
		img_show = true;
		frameCount++;
	}
	cout << "AVG TIME: " << totalTime / 5000 << endl;
	cap.release();
}

 
	//释放
	show = false;
	delete[] result.obj;


	VPT_Release(tools);


#ifdef _MSC_VER
	system("pause");
#endif
	//return 0;
}


int main(int argc, char** argv)
{
int iter = 1;
while(iter--)
{
 pthread_t tid1;//定义子线程标识符
   pthread_create(&tid1,NULL,pthread_1,NULL);//pthread_1即线程执行函数
   printf("child pthread1 create\n");
   
   /*
   pthread_t tid2;//定义子线程标识符
   pthread_create(&tid2,NULL,pthread_1,NULL);//pthread_1即线程执行函数
   printf("child pthread2 create\n");
   
    pthread_t tid3;//定义子线程标识符
   pthread_create(&tid3,NULL,pthread_1,NULL);//pthread_1即线程执行函数
   printf("child pthread3 create\n");
   */
   
    pthread_join(tid1,NULL);
    printf("child pthread1 exit\n");
    
    /*
    pthread_join(tid2,NULL);
    printf("child pthread2 exit\n");
    
    pthread_join(tid3,NULL);
    printf("child pthread3 exit\n");
    */
}

 printf("\n all finish \n");
 return 0;
}