SnapShot.h 1.95 KB
#ifndef __SNAPSHOT_H__
#define __SNAPSHOT_H__
#include "../CD.h"
#include <map>
#include <opencv2/opencv.hpp>
#include <bitset>
#include <boost/thread/thread.hpp>


//using namespace cv;

const int SCALE_OUT = 10; //判断目标框初始位置时,在最小距离的基础上适当外扩
const int EDGESIZE = 4;

typedef struct OBJECT_SNAPSHOT_INFO
{
	VIDEO_OBJECT_SNAPSHOT    objInfo;  //快照基本信息(保存的最优信息)
	//unsigned char*         objImg;   //快照图像信息(保存最优图像)
	cv::Mat                  objImg;   //快照图像信息(保存最优图像),我先用Mat方便,之后看是否改为char*
	int                      area;     //改快照上一帧的面积(为了去除突变的快照)
	bitset<EDGESIZE>         flags;    //标志位,标记快照框应该如何判断,left:0  top:1  right:2  bottom:3

	vector<int>              voteIndex;

}OBJECT_SNAPSHOT_INFO;


class SnapShot
{
public:
	SnapShot(char* ResDir, VIDEO_OBJECT_SNAPSHOT_CALLBACK VideoObjSnapshotCallBack, SNAPSHOT_PARAMETER *ssParam);
	~SnapShot();

	void ResetSnapShot();

	void SnapshotProcess(CD_Result *result, cv::Mat img, vector<int> deleteTrackers, int frameCount);
	void AddSnapshot(CD_ObjInfo object, cv::Mat img, int frameCount);
	void UpdateSnapshot(CD_ObjInfo object, cv::Mat img, int frameCount);
	void SaveSnapshot(vector<int> deleteTrackers);
  
	//辅助函数
	bool LegalArea(int maxArea, int lastArea, int left, int top, int right, int bottom);
	bool LegalPos(bitset<EDGESIZE> flags, int left, int top, int right, int bottom, int imgHeight, int imgWidth);


	bool saveSnapshot;  //控制是否开启快照功能

public:
	char mResDir[260];
	map<int, OBJECT_SNAPSHOT_INFO> snapshots;
	VIDEO_OBJECT_SNAPSHOT_CALLBACK mVideoObjSnapshotCallBack;

	bool checkBoxSize, checkDistance;
	MRECT minBoxSize[DETECTTYPE];
	int minDistance[EDGES];

	boost::mutex threadMutex;
	boost::thread ProcessThread;
	vector<int> deleteID;
	vector<int> tempDeleteID;
	bool beginSaveSnapshot;

	int saveTimes;
};
#endif // __SNAPSHOT_H__