#include "AppPipeController.h"
|
#include <basic/util/app/AppPreference.hpp>
|
#include <basic/util/app/AppUtil.h>
|
#include <algorithm>
|
#include <basic/util/app/AppConfig.h>
|
#include <QtCore/QDateTime>
|
#include <QtCore/QtGlobal>
|
#include <net_config.h>
|
|
#include <basic/pipe_element/ffmpeg/basic_struct_for_video_image.h>
|
//AppPipeController::AppPipeController(std::string folderPath, const Json::Value &json) :
|
// videoCaptureElement("filePath", 25, -1, appPref.getLongData("gpu.index")), m_index(0),
|
// m_folderPath(folderPath),
|
// m_json(json), fdfsClient(nullptr), yoloRpcElement(folderPath + "yoloRpc"), faceRpcElement(folderPath + "faceRpc"),
|
// faceExtractElement(folderPath + "faceExtract"), triggerElement(25, 10),
|
// recordVideoElement(-1, json["rtsp"].asString()), bRecordVideoEnable(false) {
|
|
// init();
|
|
//}
|
AppPipeController::AppPipeController(std::string folderPath, const SdkRuleMap &ruleMap) :
|
m_rpcClient("RtspAnalysServer", "127.0.0.1",appPref.getIntData("RpcServerPort"),"tcp"),
|
videoCaptureElement("filePath", 25, -1, appPref.getLongData("gpu.index")),
|
// videoCaptureElement(40),
|
m_index(0),
|
m_folderPath(folderPath),
|
m_sdkRuleMap(ruleMap),
|
fdfsClient(nullptr),
|
yoloRpcElement(folderPath + "yoloRpc"),
|
faceRpcElement(folderPath + "faceRpc", ruleMap[FaceSdk]),
|
faceExtractElement(folderPath + "faceExtract", ruleMap[FaceSdk]),
|
triggerElement(25, 10),
|
// recordVideoElement(-1, ""),
|
bRecordVideoEnable(false),
|
|
m_bSetWH(false)
|
{
|
|
init();
|
|
}
|
//AppPipeController::AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable) :
|
// videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index"), RecordVideoEnable),
|
// m_index(index), fdfsClient(nullptr), yoloRpcElement(to_string(index) + "yoloRpc"),
|
// faceRpcElement(to_string(index) + "faceRpc"), m_json(json), faceExtractElement(to_string(index) + "faceExtract"),
|
// triggerElement(25, 4), recordVideoElement(index, json["rtsp"].asString()), bRecordVideoEnable(RecordVideoEnable) {
|
// init();
|
//}
|
|
|
//AppPipeController::AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable) :
|
// videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index")),
|
// m_index(0),
|
// m_camId(camId),
|
// fdfsClient(nullptr),
|
// yoloRpcElement(camId + "yoloRpc"),
|
// faceRpcElement(camId + "faceRpc"),
|
// m_json(json),
|
// faceExtractElement(camId + "faceExtract"),
|
// triggerElement(25, 4),
|
// recordVideoElement(camId, json["rtsp"].asString()),
|
// newRecordVideoElement(camId),
|
// perimeterElement(1),
|
// crowdElement(json["crowd.num"].asInt()),
|
// bRecordVideoEnable(RecordVideoEnable)
|
//{
|
// init();
|
// initPerimeter();
|
// initCrowd();
|
// intKeepRight();
|
//}
|
AppPipeController::AppPipeController(std::string camId, const SdkRuleMap &ruleMap, bool RecordVideoEnable) :
|
m_rpcClient("RtspAnalysServer", "127.0.0.1",appPref.getIntData("RpcServerPort"),"tcp"),
|
videoCaptureElement(appPref.getStringData(camId + "rtsp"), 25, 3000, appPref.getLongData("gpu.index")),
|
// videoCaptureElement(40),
|
m_index(0),
|
m_camId(camId),
|
fdfsClient(nullptr),
|
yoloRpcElement(camId + "yoloRpc"),
|
faceRpcElement(camId + "faceRpc", ruleMap[FaceSdk]),
|
faceExtractElement(camId + "faceExtract", ruleMap[FaceSdk]),
|
triggerElement(25, 4),
|
// recordVideoElement(camId, appPref.getStringData(camId + "rtsp")),
|
// newRecordVideoElement(camId),
|
perimeterElement(ruleMap[PerimeterSdk]),
|
crowdElement(ruleMap[CrowdSdk]),
|
perStaticElement(ruleMap[PerStaticSdk]),
|
perHubElement(ruleMap[PerHubSdk]),
|
leftJudgment(ruleMap[KeepRightSdk]),
|
rightJudgment(ruleMap[KeepRightSdk]),
|
bRecordVideoEnable(RecordVideoEnable),
|
m_sdkRuleMap(ruleMap),
|
m_bSetWH(false)
|
|
{
|
DBG("camId" << camId);
|
init();
|
initPerimeter();
|
initCrowd();
|
initKeepRight();
|
initPerHub();
|
initPerStatic();
|
}
|
|
AppPipeController::~AppPipeController() {
|
|
}
|
|
//************************************
|
// Method: string_replace
|
// FullName: string_replace
|
// Access: public
|
// Returns: void
|
// Qualifier: 把字符串的strsrc替换成strdst
|
// Parameter: std::string & strBig
|
// Parameter: const std::string & strsrc
|
// Parameter: const std::string & strdst
|
//************************************
|
static void string_replace(std::string &strBig, const std::string &strsrc, const std::string &strdst) {
|
std::string::size_type pos = 0;
|
std::string::size_type srclen = strsrc.size();
|
std::string::size_type dstlen = strdst.size();
|
|
while ((pos = strBig.find(strsrc, pos)) != std::string::npos) {
|
strBig.replace(pos, srclen, strdst);
|
pos += dstlen;
|
}
|
}
|
|
bool AppPipeController::resetVideoCapturePath(std::string path) {
|
// videoCaptureElement.stop();
|
// videoCaptureElement.wait();
|
|
string_replace(path, "//", "/");
|
|
videoCaptureElement.setVideoPath(path);
|
auto dev_pos = path.find("/cut/") + 5;
|
auto ch_pos = path.find("/", dev_pos) + 1;
|
auto str_device_id = path.substr(dev_pos, ch_pos - dev_pos - 1);
|
auto str_ch_id = path.substr(ch_pos, path.find("/", ch_pos) - ch_pos);
|
faceExtractElement.setProperty("dev_id", str_device_id);
|
faceExtractElement.setProperty("ch_id", str_ch_id);
|
faceExtractElement.setProperty("path", path);
|
personElement.setProperty("dev_id", str_device_id);
|
personElement.setProperty("ch_id", str_ch_id);
|
personElement.setProperty("path", path);
|
|
//修改时间为实际发生时间
|
QString strPath = QString::fromStdString(path);
|
QStringList list = strPath.split("/");
|
QString fileName;
|
QString time;
|
QString strNewTime;
|
if (list.size() != 0) {
|
fileName = list.last();
|
time = fileName.split(".").first();
|
//#todo
|
// time = fileName.split("_").first();
|
} else {
|
ERR("list.size() == 0)");
|
}
|
|
if (!time.isEmpty()) {
|
m_dt = QDateTime::fromString(time, "yyyy-MM-dd hh:mm:ss");
|
} else {
|
m_dt = QDateTime::currentDateTime();
|
}
|
|
// deciceId
|
// chenle
|
|
}
|
|
bool AppPipeController::getRunning() {
|
//return videoCaptureElement.isRunning();
|
return false;
|
}
|
|
string test_str;
|
|
|
void AppPipeController::RecordVideo() {
|
/*std::string imgKeyYolo = yoloRpcElement.getProperty("imgKey");
|
|
std::string imgKeyFace = faceRpcElement.getProperty("imgKey");
|
if(faceRpcElement.getTriggerState() ||
|
personElement.getTriggerState() ||
|
leftJudgment.getTriggerState() ||
|
rightJudgment.getTriggerState() ||
|
perimeterElement.getTriggerState() ||
|
crowdElement.getTriggerState() ||
|
perHubElement.getTriggerState() ||
|
perStaticElement.getTriggerState())
|
{
|
try {
|
auto server = rpcClient.getServer();
|
if (!server)
|
{
|
ERR("server is null");
|
return;
|
}
|
|
if(imgKeyFace != imgKeyYolo)
|
{
|
server->recordVideo(imgKeyFace);
|
server->recordVideo(imgKeyYolo);
|
INFO("Record Video Face: "<<imgKeyFace);
|
INFO("Record Video Yolo: "<<imgKeyYolo);
|
} else {
|
INFO("Record Video: "<<imgKeyYolo);
|
server->recordVideo(imgKeyFace);
|
}
|
}
|
catch (std::exception &e)
|
{
|
ERR("Record Video ImgKeyFace: "<<imgKeyFace <<" ImgKeyYolo :"<<imgKeyYolo <<" Message: "<<e.what());
|
return ;
|
}
|
}
|
else {
|
INFO("ImageNoFace Yolo:"<<imgKeyYolo<<" Face:"<<imgKeyFace);
|
INFO("faceRpcElement: "<< faceRpcElement.getTriggerState() <<" "<<
|
"personElement: "<<personElement.getTriggerState() <<" "<<
|
"leftJudgment: "<<leftJudgment.getTriggerState() <<" "<<
|
"leftJudgment: "<<rightJudgment.getTriggerState() <<" "<<
|
"perimeterElement: "<<perimeterElement.getTriggerState()<<" "<<
|
"crowdElement: "<<crowdElement.getTriggerState()<<" "<<
|
"perHubElement: "<<perHubElement.getTriggerState()<<" "<<
|
"perStaticElement: "<<perStaticElement.getTriggerState());
|
}*/
|
}
|
void AppPipeController::init() {
|
|
unsigned char ip_old[15] = {0};
|
std::string net_ifname = appConfig.getStringProperty("netIfName");
|
if (!(GetIpAddress(net_ifname.c_str(), ip_old))) {
|
ERR("couldn't get ip");
|
}
|
m_localIp = std::string((char *) ip_old);
|
bUp = false;
|
|
personElement.setProperty("str_addr", m_sdkRuleMap[YoloSdk].strAddr.toStdString());
|
personElement.setProperty("local_ip", std::string((char *) ip_old));
|
|
faceExtractElement.setProperty("str_addr", m_sdkRuleMap[FaceSdk].strAddr.toStdString());
|
faceExtractElement.setProperty("local_ip", std::string((char *) ip_old));
|
|
|
if (bRecordVideoEnable) {
|
faceExtractElement.setProperty("dev_id", m_camId);
|
personElement.setProperty("dev_id", m_camId);
|
}
|
|
|
//#todo
|
// int max=appPref.getIntData("n_cut_max_duration");
|
// recordInit(40,100);
|
videoCaptureElement.registerConnector([&] {
|
|
std::string imgKey;
|
m_hiredisTool.listRpop(m_camId,imgKey);
|
if(imgKey.empty())
|
{
|
ERR("CamId "<<m_camId<<" No ImgKey");
|
return;
|
}
|
|
cv::Mat imageTemp;
|
m_hiredisTool.getKeyImage(imgKey,imageTemp);
|
if(!m_bSetWH)
|
{
|
INFO("SetWidth:"<<imageTemp.cols<<" Height:"<<imageTemp.rows);
|
appPref.setIntData(m_camId+"width",imageTemp.cols);
|
appPref.setIntData(m_camId+"height",imageTemp.rows);
|
m_bSetWH=true;
|
}
|
|
m_hiredisTool.delKey(imgKey);
|
if(imageTemp.empty())
|
{
|
ERR("No Image Data In: "<<m_camId<<" ImgKey:"<<imgKey);
|
return;
|
}
|
std::string strNewTime = AppUtil::getTimeUSecString();
|
|
ImageName_s_t imgSt = ImageName_s_t::fromString(imgKey);
|
|
if (m_camId.size() > 0) {
|
if (!faceRpcElement.isBusy()) {
|
//#todo
|
faceRpcElement.setProperty("time", strNewTime);
|
faceRpcElement.setProperty("imgKey",imgKey);
|
INFO("Write To FaceRPC ES time:"<<strNewTime<< " ImgKey: "<<imgKey);
|
faceRpcElement.setImage(imageTemp);
|
faceRpcElement.submit();
|
}
|
|
if (!yoloRpcElement.isBusy()) {
|
//#todo
|
yoloRpcElement.setProperty("time", strNewTime);
|
yoloRpcElement.setProperty("imgKey",imgKey);
|
INFO("Write To YoloES time:"<<strNewTime<< " ImgKey: "<<imgKey);
|
yoloRpcElement.setImage(imageTemp);
|
yoloRpcElement.submit();
|
}
|
|
|
if (appPref.getIntData("show.image") == 1 && !imageDrawElement.isBusy()) {
|
imageDrawElement.setImage(imageTemp);
|
imageDrawElement.submit();
|
}
|
//this->RecordVideo();
|
/*if(faceRpcElement.getTriggerState() ||
|
personElement.getTriggerState() ||
|
leftJudgment.getTriggerState() ||
|
rightJudgment.getTriggerState() ||
|
perimeterElement.getTriggerState() ||
|
crowdElement.getTriggerState() ||
|
perHubElement.getTriggerState() ||
|
perStaticElement.getTriggerState())
|
{
|
try {
|
auto server = rpcClient.getServer();
|
if (!server)
|
{
|
ERR("server is null");
|
return;
|
}
|
INFO("Record Video "<<imgKey);
|
server->recordVideo(imgKey);
|
}
|
catch (std::exception &e)
|
{
|
ERR("Record Video Err: "<<imgKey <<" Message: "<<e.what());
|
return ;
|
}
|
}
|
else {
|
INFO("faceRpcElement: "<< faceRpcElement.getTriggerState() <<" "<<
|
"personElement: "<<personElement.getTriggerState() <<" "<<
|
"leftJudgment: "<<leftJudgment.getTriggerState() <<" "<<
|
"leftJudgment: "<<rightJudgment.getTriggerState() <<" "<<
|
"perimeterElement: "<<perimeterElement.getTriggerState()<<" "<<
|
"crowdElement: "<<crowdElement.getTriggerState()<<" "<<
|
"perHubElement: "<<perHubElement.getTriggerState()<<" "<<
|
"perStaticElement: "<<perStaticElement.getTriggerState());
|
}*/
|
}
|
});
|
|
|
yoloRpcElement.registerConnector([&] {
|
imageDrawElement.setYoloObjects(personElement.getLastScoreRects());
|
if (!personElement.isBusy()) {
|
personElement.setObjsResults(yoloRpcElement.getLastScoreRects());
|
personElement.submit();
|
}
|
//INFO("Record Video By Yolo");
|
//this->RecordVideo();
|
});
|
|
faceRpcElement.registerConnector([&] {
|
imageDrawElement.setFaces(faceRpcElement.getLastScoreRects());
|
//INFO("Record Video By Face");
|
//this->RecordVideo();
|
});
|
|
yoloRpcElement.registerConnector("YoloTrigger", [&] {
|
// auto images = yoloRpcElement.getTriggerMats();
|
//INFO("Record Video By Yolo");
|
//this->RecordVideo();
|
});
|
|
faceRpcElement.registerConnector("FaceTrigger", [&] {
|
// auto images = faceRpcElement.getTriggerMats();
|
faceExtractElement.submitFaceExtract({faceRpcElement.getProperty("uuid"),
|
AppUtil::getTimeString(),
|
faceRpcElement.getImage().clone(),
|
faceRpcElement.getTriggerFaces(),
|
faceRpcElement.getTriggerScoreRects(),
|
faceRpcElement.getTriggerMats()});
|
//INFO("Record Video By Face");
|
//this->RecordVideo();
|
});
|
|
imageDrawElement.registerConnector([&] {
|
if (appPref.getIntData("show.image") == 1) {
|
ImageShowElement::showImage(to_string(this->m_index), *imageDrawElement.getImage());
|
}
|
});
|
|
registerElement(videoCaptureElement);
|
if (m_sdkRuleMap[YoloSdk].nIsRun == 1) {
|
registerElement(personElement);
|
}
|
if (m_sdkRuleMap[FaceSdk].nIsRun == 1) {
|
DBG("FaceSdk=" << m_sdkRuleMap[FaceSdk].nIsRun);
|
registerElement(faceRpcElement);
|
registerElement(faceExtractElement);
|
}
|
if(appPref.getIntData("show.image") == 1)
|
{
|
imageDrawElement.registerConnector([&] {
|
|
ImageShowElement::showImage(to_string(this->m_index), *imageDrawElement.getImage());
|
|
});
|
|
registerElement(imageDrawElement);
|
}
|
|
// registerElement(newRecordVideoElement);
|
//videoCaptureElement.setOutPutInterval(3);
|
faceExtractElement.setProperty("index", to_string(m_index));
|
registerElement(yoloRpcElement);
|
//#todo setProperty
|
// faceExtractElement.setProperty("index", to_string(m_index));
|
// faceExtractElement.setProperty("index", to_string(m_index));
|
}
|
|
std::string AppPipeController::getFullFileName() {
|
string tmppath = appConfig.getStringProperty("cutPath");
|
auto findCutSize = tmppath.begin() + tmppath.find("/cut");
|
if (tmppath.back() != '/') {
|
tmppath.push_back('/');
|
}
|
string t_FilePath = tmppath;
|
// string t_FilePath = tmppath.replace(findCutSize, findCutSize + 4, "/realtime/");
|
|
//# ./camIndex/YYYYMM/DD/camIndex-YYYYMMDDHHMMSS/
|
//# ./camIndex/YYYYMM/DD/
|
string t_strTime = AppUtil::getTimeSecString();
|
// 2018-09-01 11:30:48.mp4
|
t_FilePath.append(
|
m_camId + "/" + t_strTime.substr(0, 4) + t_strTime.substr(5, 2) + "/" +
|
t_strTime.substr(8, 2) + "/");
|
//camIndex-YYYYMMDDHH/
|
string tt = t_strTime;
|
//2018-09-27 14:26:58
|
//#todo 优化
|
tt.erase(16, 1);
|
tt.erase(13, 1);
|
tt.erase(10, 1);
|
tt.erase(7, 1);
|
tt.erase(4, 1);
|
//20180927142658
|
t_FilePath.append(m_camId + "-" + tt.substr(0, 10) + "/");
|
string t_cmd = "mkdir -p '";
|
t_cmd.append(t_FilePath + "'");
|
//#get path mkdir path
|
system(t_cmd.c_str());
|
//#get time and file name
|
t_FilePath.append(t_strTime + ".mp4");
|
return t_FilePath;
|
}
|
|
void AppPipeController::setfdfsClient(FastFdsWithLock *p_fdfsClient) {
|
fdfsClient = p_fdfsClient;
|
faceExtractElement.setFdfs(fdfsClient);
|
personElement.setFdfs(fdfsClient);
|
perHubElement.setFdfs(fdfsClient);
|
perimeterElement.setFdfs(fdfsClient);
|
perStaticElement.setFdfs(fdfsClient);
|
leftJudgment.setFdfs(fdfsClient);
|
rightJudgment.setFdfs(fdfsClient);
|
crowdElement.setFdfs(fdfsClient);
|
|
}
|
|
std::string AppPipeController::getRtmp() {
|
std::string ret = "";// = videoPublishElement.getPath();
|
size_t pos = ret.find(".flv");
|
ret = ret.substr(0, pos);
|
INFO(ret);
|
return ret;
|
}
|
|
void AppPipeController::initPerimeter() {
|
SdkRule rule = m_sdkRuleMap[PerimeterSdk];
|
if (rule.nIsRun != 1) {
|
return;
|
}
|
|
|
yoloRpcElement.registerConnector([&] {
|
if (!perimeterElement.isBusy()) {
|
perimeterElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
perimeterElement.setImage(yoloRpcElement.getImage());
|
|
perimeterElement.submit();
|
}
|
});
|
// perimeterElement.registerConnector([&] {
|
|
// peTriggerElement.setState(perimeterElement.getRealNum() > 0);
|
// peTriggerElement.triggerOnce();
|
// });
|
// peTriggerElement.registerConnector([&] {
|
|
// switch (peTriggerElement.getTriggerType()) {
|
// case UP: DBG("peTriggerElement Up");
|
// // startRecord(SdkType_Perimeter);
|
// break;
|
// case DOWN: DBG("peTriggerElement Down");
|
// // endRecord(SdkType_Perimeter);
|
// default:
|
// break;
|
// }
|
// });
|
registerElement(perimeterElement);
|
// registerElement(peTriggerElement);
|
}
|
|
void AppPipeController::initCrowd() {
|
SdkRule rule = m_sdkRuleMap[CrowdSdk];
|
if (rule.nIsRun != 1) {
|
return;
|
}
|
// std::string area = m_json["crowd.area"].asString();
|
//area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
|
|
crowdElement.setProperty("local_ip", m_localIp);
|
|
yoloRpcElement.registerConnector([&] {
|
if (!crowdElement.isBusy()) {
|
crowdElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
crowdElement.setImage(yoloRpcElement.getImage());
|
crowdElement.submit();
|
}
|
});
|
|
registerElement(crowdElement);
|
// registerElement(crowdTriggerElement);
|
}
|
|
void AppPipeController::initKeepRight() {
|
SdkRule rule = m_sdkRuleMap[KeepRightSdk];
|
if (rule.nIsRun != 1) {
|
return;
|
}
|
leftJudgment.setProperty("local_ip", m_localIp);
|
rightJudgment.setProperty("local_ip", m_localIp);
|
leftJudgment.init(rule.strAreas, rule.strLine);
|
rightJudgment.init(rule.strExAreas, rule.strExLine);
|
yoloRpcElement.registerConnector([&] {
|
if(!leftJudgment.isBusy())
|
{
|
leftJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
leftJudgment.setImage(yoloRpcElement.getImage());
|
leftJudgment.submit();
|
}
|
if(!rightJudgment.isBusy())
|
{
|
rightJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
|
rightJudgment.setImage(yoloRpcElement.getImage());
|
rightJudgment.submit();
|
}
|
|
});
|
registerElement(leftJudgment);
|
registerElement(rightJudgment);
|
|
}
|
|
void AppPipeController::initPerStatic() {
|
SdkRule rule = m_sdkRuleMap[PerStaticSdk];
|
if (rule.nIsRun != 1) {
|
return;
|
}
|
// std::string area = m_json["crowd.area"].asString();
|
//area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
|
|
perStaticElement.setProperty("local_ip", m_localIp);
|
yoloRpcElement.registerConnector([&] {
|
if (!perStaticElement.isBusy()) {
|
perStaticElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
perStaticElement.setImage(yoloRpcElement.getImage());
|
perStaticElement.submit();
|
}
|
});
|
|
registerElement(perStaticElement);
|
}
|
|
void AppPipeController::initPerHub() {
|
SdkRule rule = m_sdkRuleMap[PerHubSdk];
|
if (rule.nIsRun != 1) {
|
return;
|
}
|
// std::string area = m_json["crowd.area"].asString();
|
//area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
|
|
perHubElement.setProperty("local_ip", m_localIp);
|
yoloRpcElement.registerConnector([&] {
|
if (!perHubElement.isBusy()) {
|
perHubElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
|
perHubElement.setImage(yoloRpcElement.getImage());
|
perHubElement.submit();
|
}
|
});
|
|
registerElement(perHubElement);
|
}
|