| | |
| | | PipeElement(true), |
| | | trackingTrigger(nullptr), |
| | | mRealNum(0), |
| | | m_triggerElement(rule.nTriggerDelay*8,0), |
| | | //每秒几张,就乘以几 |
| | | m_triggerElement(rule.nTriggerDelay*3,0), |
| | | pManagerEsDB(nullptr), |
| | | m_bIsMask(true), |
| | | m_bSetWH(false), |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | switch (m_sdkRule.nSdkType) { |
| | | case PerimeterSdk: |
| | | //state = num > 0 ; |
| | | state =( num !=mRealNum); |
| | | // DBG("num="<<num<< "time="<< picDate); |
| | | |
| | | INFO("SDK Type: PerimeterSdk"); |
| | | |
| | | break; |
| | | case CrowdSdk: |
| | | state = num > m_sdkRule.nAlarmNumLowerLimit && num !=mRealNum; |
| | | INFO("SDK Type: CrowdSdk"); |
| | | |
| | | break; |
| | | case PerHubSdk: |
| | | state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num !=mRealNum; |
| | | |
| | | INFO("SDK Type: PerHubSdk"); |
| | | |
| | | // if(m_sdkRule.nAlarmNumLowerLimit>=0) |
| | | // { |
| | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | INFO("State:"<<state<<" Num:"<<num<<" mRealNum:"<<mRealNum<<" LowerLimit :"<<m_sdkRule.nAlarmNumLowerLimit<<" HightLimit: "<<m_sdkRule.nAlarmNumUpperLimit); |
| | | m_triggerElement.setState(state); |
| | | m_triggerElement.triggerOnce(); |
| | | if (m_triggerElement.getTriggerState() ) |
| | |
| | | m_capture = new CvCapture_FFMPEG(m_camId); |
| | | } |
| | | |
| | | //定时执行,将 |
| | | void RtspCaptureElement::timerFunc() |
| | | { |
| | | u_char *data; |
| | | int width = 0, height = 0, step = 0, cn = 0; |
| | | u_char *data = nullptr; |
| | | int width = 0; |
| | | int height = 0; |
| | | int step = 0; |
| | | int cn = 0; |
| | | DBG("GRABFrame "<<m_camId); |
| | | bool ret = m_capture->grabFrame(); |
| | | if (!ret) { |
| | |
| | | m_picCount.store(0); |
| | | } |
| | | |
| | | //每个Cam的队列最多M_CAM_PIC_MAX_COUNT张 |
| | | { |
| | | /*ClockTimer timer("RedisTime "); |
| | | auto imageCount = m_redisTool.getSize(m_camId); |
| | | if (imageCount > M_CAM_PIC_MAX_COUNT) { |
| | | ERR("Too Much Pics In Cam " << m_camId << " QUeue"); |
| | | return; |
| | | }*/ |
| | | ClockTimer timer("FrameToImage"); |
| | | m_capture->retrieveFrame(0, &data, &step, &width, &height, &cn); |
| | | |
| | |
| | | cv::Mat copyMat; |
| | | img.copyTo(copyMat); |
| | | std::string imageName = m_capture->GetImageName(); |
| | | /*ClockTimer SetImageValueTimer("RedisTimeSetKey "); |
| | | m_redisTool.setKeyImage(imageName, copyMat); |
| | | ClockTimer SetImageNameTimer("RedisTimeSetKey "); |
| | | m_redisTool.listLpush(m_camId, imageName);*/ |
| | | } |
| | | fireConnectors(); |
| | | } |
| | |
| | | if(m_gpuIndex>=0){ |
| | | setenv("CUDA_VISIBLE_DEVICES", std::to_string(m_gpuIndex).c_str(),0); |
| | | } |
| | | m_capture->open(m_path.c_str(),m_gpuIndex>=0); |
| | | bool bResult = m_capture->open(m_path.c_str(),m_gpuIndex>=0); |
| | | if(bResult) |
| | | { |
| | | INFO("GPUIndex: "<<m_gpuIndex<<" VideoPath:"<<m_path<<" Succeed"); |
| | | } else{ |
| | | ERR("GPUIndex: "<<m_gpuIndex<<" VideoPath:"<<m_path<<" Failed"); |
| | | } |
| | | } |
| | | |
| | | //线程启动之前调用, |
| | | void RtspCaptureElement::threadInitial() |
| | | { |
| | | openVideo(); |
| | | } |
| | | |
| | | //线程结束的时候调用,关闭ffmpeg流 |
| | | void RtspCaptureElement::threadClosing() |
| | | { |
| | | m_capture->close(); |
| | |
| | | m_capture = nullptr; |
| | | } |
| | | |
| | | //设置保存视频的最小和最大时长 |
| | | void RtspCaptureElement::SetVideoMinMaxSeconds(const int minSeconds, const int maxSeconds) |
| | | { |
| | | INFO("VideoMinSeconds: "<<minSeconds<<" VideoMaxSeconds: "<<maxSeconds); |
| | | m_capture->SetMinMaxVideoSeconds(minSeconds,maxSeconds); |
| | | } |
| | | |
| | |
| | | #cmake_minimum_required(VERSION 2.8) |
| | | |
| | | #project(VideoAnalysFromHC) |
| | | #add_executable(${PROJECT_NAME} "main.cpp") |
| | | cmake_minimum_required(VERSION 3.5) |
| | | project(VideoToImageMulth) |
| | | set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build) |
| | |
| | | add_compile_options(-fPIC) |
| | | add_definitions(-DGLOG) |
| | | add_definitions(-DDEBUG_ERR -DDEBUG_INFO -fpermissive) |
| | | |
| | | add_definitions(-Wall -Wextra) |
| | | SET(LIBS |
| | | glog |
| | | Ice |
| | |
| | | return rtsp_url; |
| | | } |
| | | |
| | | //初始化函数 |
| | | void RtspAnalysManager::init() { |
| | | |
| | | auto lst = m_lDBTool->searchCamDevTableAll(); |
| | |
| | | m_controllers.clear(); |
| | | } |
| | | |
| | | /** |
| | | * 根据摄像机ID和RTSP路径,增加摄像机 |
| | | * 对于每个摄像机有一个 RtspImageRedisElement 对象用于保存图片到Redis |
| | | * 有一个 RtspCaptureElement 用户录取和保存视频 |
| | | * @param index 摄像机id |
| | | * @param rtsp 上面的摄像机对应的视频路径 |
| | | * @return -1 添加失败,0 添加成功 |
| | | */ |
| | | int RtspAnalysManager::addCamera(const std::string &index, const std::string& rtsp) { |
| | | auto lst = m_lDBTool->searchCamDevTableAll(); |
| | | Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo(); |
| | |
| | | |
| | | } else { |
| | | removeCamera(index); |
| | | DBG("removeCamera " << index) |
| | | DBG("removeCamera " << index); |
| | | return addCamera(rtsp, index); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据CamID移除摄像机,同时停止视频的抓取和保存图片到Redis |
| | | * @param index 摄像机ID |
| | | * @return 总是0 |
| | | */ |
| | | int RtspAnalysManager::removeCamera(const std::string &index) { |
| | | if (m_controllers.find(index) == m_controllers.end())return -1; |
| | | auto controller = m_controllers[index]; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | /** |
| | | * 移除所有的摄像机 |
| | | * @return |
| | | */ |
| | | int RtspAnalysManager::removeAll() { |
| | | for (auto controller: m_controllers) { |
| | | controller.second->stop(); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | //获取最大的摄像机数量 |
| | | int RtspAnalysManager::getMaxCamCount() { |
| | | return m_maxCount; |
| | | } |
| | | |
| | | //获取当前的摄像机数量 |
| | | int RtspAnalysManager::getCurrentCamCount() { |
| | | return m_currentCount; |
| | | } |
| | | |
| | | |
| | | //录取视频的RPC的接口函数 |
| | | ::std::string RtspAnalysManager::recordVideo(const ::std::string& name, const ::Ice::Current&) |
| | | { |
| | | INFO("Record Video For: "<<name); |
| | |
| | | return name; |
| | | } |
| | | |
| | | |
| | | //保存视频到RtspImageRedis的队列,由RtspCaptureElement调用 |
| | | bool RtspAnalysManager::SaveImageToRedis(const std::string& camId,const std::string& imageName,const cv::Mat& img) |
| | | { |
| | | auto item = m_imgRedisControllers.find(camId); |
| | |
| | | #include <basic/util/app/AppPreference.hpp> |
| | | #include "RtspAnalysServer.h" |
| | | |
| | | //用来实现recordVideo的RPC的接口类 |
| | | class RtspAnalysManager :public ::RtspAnalys::RtspAnalysServer{ |
| | | |
| | | public: |
| | |
| | | const int m_nPicsPickOne = 8; |
| | | |
| | | //每台摄像机保存到Redis的图片数量的最大值 |
| | | const int M_CAM_PIC_MAX_COUNT = 50; |
| | | //const int M_CAM_PIC_MAX_COUNT = 50; |
| | | |
| | | RtspAnalysManager * m_pManager; |
| | | }; |
| | |
| | | auto imageCount = m_redisTool.getSize(m_camId); |
| | | //保证Redis中的图片不要过多 |
| | | if (imageCount > M_CAM_PIC_MAX_COUNT) { |
| | | ERR("Too Much Pics In Cam " << m_camId << "Redis"); |
| | | ERR("Too Much Pics In Cam " << m_camId << " Redis ImageCount: " << imageCount ); |
| | | return; |
| | | } |
| | | auto item = m_imageQueue.front(); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | //继承自父类,线程初始化的一些工作 |
| | | void RtspImageRedisElement::threadInitial() |
| | | { |
| | | |
| | | } |
| | | |
| | | //继承自父类,线程结束的时候调用 |
| | | void RtspImageRedisElement::threadClosing() |
| | | { |
| | | } |
| | |
| | | appPref.setLongData("gpu.index", 1); |
| | | appPref.setIntData("show.image", 0); |
| | | |
| | | |
| | | |
| | | // LDBTool _dbTool; |
| | | // thread startRtspAnalys(startManager, &_dbTool); |
| | | // startRtspAnalys.detach(); |
| | | appPref.setStringData("user.loop.absolute.path", appConfig.getStringProperty("cutPath")); |
| | | IceRpcServer<RtspAnalysManager> server("RtspAnalysServer", 10009, "tcp"); |
| | | server.setMessageSizeMax(1024 * 1024 * 50); |