EntityCamera.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. #include "EntityCamera.h"
  2. /// 初始化相机环境
  3. bool ICamera::initEnv()
  4. {
  5. return true;
  6. }
  7. /// 关闭相机环境
  8. bool ICamera::closeEnv()
  9. {
  10. return true;
  11. }
  12. /// 获取所有相机序列号
  13. QVector<QString> ICamera::cameraSerial()
  14. {
  15. QVector<QString> Seriallist;
  16. Seriallist.clear();
  17. Infra::TVector<GenICam::ICameraPtr> vecCameras;
  18. GenICam::CSystem::getInstance().discovery(vecCameras);
  19. for (size_t i = 0; i < vecCameras.size(); i++)
  20. {
  21. GenICam::ICameraPtr m_pCamera;
  22. m_pCamera = vecCameras[i];
  23. QString strSerialNumber = QString(QLatin1String((char*)m_pCamera->getSerialNumber()));
  24. QString strUserName = QString(QLatin1String((char*)m_pCamera->getName()));
  25. QString str = strSerialNumber;
  26. if (!strUserName.isEmpty())
  27. {
  28. str = "(" + strUserName + ")" + strSerialNumber;
  29. }
  30. Seriallist.push_back(str);
  31. }
  32. return Seriallist;
  33. }
  34. EntityCamera::EntityCamera() :
  35. m_pCamParamConfig(nullptr),
  36. m_pDialogCamPasram(nullptr)
  37. {
  38. m_nImageChannels = 1;
  39. //////////////////////////////////////////////////////////////////////////
  40. }
  41. EntityCamera::~EntityCamera(void)
  42. {
  43. this->stopWork();
  44. bool bcloseCamera = this->closeCamera();
  45. if (nullptr != m_pDialogCamPasram)
  46. {
  47. delete m_pDialogCamPasram;
  48. m_pDialogCamPasram = NULL;
  49. }
  50. if (nullptr != m_pCamParamConfig)
  51. {
  52. delete m_pCamParamConfig;
  53. m_pCamParamConfig = nullptr;
  54. }
  55. }
  56. /// 创建ENTITY相机
  57. EntityCamera* EntityCamera::createCamera(QString serial)
  58. {
  59. EntityCamera* camera = nullptr;
  60. try
  61. {
  62. camera = new EntityCamera();
  63. if (camera)
  64. {
  65. /// 打开相机
  66. if (true == camera->openCamera(serial))
  67. {
  68. if (false == camera->initialize())
  69. {
  70. delete camera;
  71. camera = NULL;
  72. }
  73. }
  74. else
  75. {
  76. delete camera;
  77. camera = NULL;
  78. }
  79. }
  80. }
  81. catch (...)
  82. {
  83. delete camera;
  84. camera = NULL;
  85. }
  86. return camera;
  87. }
  88. /// 打开相机
  89. bool EntityCamera::openCamera(QString serial)
  90. {
  91. bool bret = true;
  92. m_strSerial = serial;
  93. Dahua::Infra::TVector<GenICam::ICameraPtr> vecCameras;
  94. GenICam::CSystem::getInstance().discovery(vecCameras);
  95. size_t i = 0;
  96. for (; i < vecCameras.size(); i++)
  97. {
  98. m_pCamera = vecCameras[i];
  99. QString strSerialNumber = QString(QLatin1String((char*)m_pCamera->getSerialNumber()));
  100. QString strUserName = QString(QLatin1String((char*)m_pCamera->getName()));
  101. QString str = strSerialNumber;
  102. if (!strUserName.isEmpty())
  103. {
  104. str = "(" + strUserName + ")" + strSerialNumber;
  105. }
  106. if (serial.indexOf(str) != -1)
  107. {
  108. break;
  109. }
  110. }
  111. if (NULL == m_pCamera)
  112. {
  113. return false;
  114. }
  115. //连接设备
  116. if (!m_pCamera->connect())
  117. {
  118. return false;
  119. }
  120. //创建AcquisitionControl对象
  121. sptrAcquisitionControl = Dahua::GenICam::CSystem::getInstance().createAcquisitionControl(m_pCamera);
  122. if (NULL == sptrAcquisitionControl)
  123. {
  124. return false;
  125. }
  126. //创建流对象
  127. streamPtr = GenICam::CSystem::getInstance().createStreamSource(m_pCamera);
  128. if (NULL == streamPtr)
  129. {
  130. // Error
  131. return false;
  132. }
  133. //注册回调函数
  134. bool bRet = streamPtr->attachGrabbingEx(onGetFrame, this);
  135. if (!bRet)
  136. {
  137. // Error
  138. return false;
  139. }
  140. imageHeight();
  141. imageWidth();
  142. imageChannels();
  143. return bret;
  144. }
  145. /// 关闭相机
  146. bool EntityCamera::closeCamera()
  147. {
  148. bool bret = true;
  149. if (NULL != streamPtr)
  150. {
  151. //断开设备
  152. if (!m_pCamera->disConnect())
  153. {
  154. printf("disConnect camera fail.\n");
  155. return false;
  156. }
  157. }
  158. return bret;
  159. }
  160. /// 初始化
  161. bool EntityCamera::initialize()
  162. {
  163. if (NULL == m_pDialogCamPasram)
  164. {
  165. m_pDialogCamPasram = new DialogCamPasram(this);
  166. }
  167. return true;
  168. }
  169. /// 加载参数
  170. void EntityCamera::loadCamParam()
  171. {
  172. }
  173. /// 保存参数
  174. void EntityCamera::saveCamParam()
  175. {
  176. }
  177. /// 设置相机工作模式
  178. bool EntityCamera::setWorkMode(IBaseCamCommon::CamWorkMode mode, bool Running )
  179. {
  180. bool bret = true;
  181. this->stopWork();
  182. switch (mode)
  183. {
  184. case IBaseCamCommon::eContinu:
  185. //连续采集模式 相机一直工作采图
  186. this->setToFreeRunMode();
  187. break;
  188. case IBaseCamCommon::eHardware:
  189. //中断采集模式 相机接收到硬件中断中断命令采集图像
  190. this->setToHardwareTrigerMode();
  191. break;
  192. case IBaseCamCommon::eSoftware:
  193. //中断采集模式 相机接收到软件中断命令采集图像
  194. bret = this->setToSoftwareTrigerMode();
  195. break;
  196. case IBaseCamCommon::eSuspendCou:
  197. break;
  198. default:
  199. break;
  200. }
  201. mWorkMode = mode; //工作模式
  202. return bret;
  203. }
  204. /// 相机工作模式
  205. IBaseCamCommon::CamWorkMode EntityCamera::workMode()
  206. {
  207. return mWorkMode;
  208. }
  209. /// 相机开始工作
  210. bool EntityCamera::startWork()
  211. {
  212. bool bret = true;
  213. if (streamPtr->isGrabbing())
  214. {
  215. return true;
  216. }
  217. if (NULL != streamPtr)
  218. {
  219. //开始抓流
  220. bool isStartGrabbingSuccess = streamPtr->startGrabbing();
  221. if (!isStartGrabbingSuccess)
  222. {
  223. return false;
  224. }
  225. }
  226. return bret;
  227. }
  228. /// 相机停止工作
  229. bool EntityCamera::stopWork()
  230. {
  231. bool bret = true;
  232. bool bRet = false;
  233. if (streamPtr && !streamPtr->isGrabbing())
  234. {
  235. return true;
  236. }
  237. if (NULL != streamPtr)
  238. {
  239. //停止相机拉流
  240. bRet = streamPtr->stopGrabbing();
  241. if (!bRet)
  242. {
  243. printf("stopGrabbing fail.\n");
  244. }
  245. }
  246. return bret;
  247. }
  248. /// 相机序列号
  249. QString EntityCamera::serial()
  250. {
  251. return m_strSerial;
  252. }
  253. /// 重启相机
  254. bool EntityCamera::restartCamera()
  255. {
  256. return true;
  257. }
  258. /// 获取一桢图像
  259. bool EntityCamera::captureImage(void** buf, int size)
  260. {
  261. return true;
  262. }
  263. /// 获取图像宽
  264. int EntityCamera::imageWidth(void)
  265. {
  266. return 0;
  267. }
  268. /// 获取图像高
  269. int EntityCamera::imageHeight(void)
  270. {
  271. return 0;
  272. }
  273. /// 获取图像通道数
  274. int EntityCamera::imageChannels(void)
  275. {
  276. return m_nImageChannels;
  277. }
  278. /// 获取配置参数类
  279. IBaseCamParamConfig* EntityCamera::camParamConfig()
  280. {
  281. CamParamConfig* paramConfig = nullptr; //配置参数类
  282. if (nullptr == m_pCamParamConfig)
  283. {
  284. m_pCamParamConfig = new CamParamConfig(this);
  285. }
  286. paramConfig = m_pCamParamConfig;
  287. return paramConfig;
  288. }
  289. /// 显示设置参数窗口页面
  290. void EntityCamera::showParamConfigWindow(int mode )
  291. {
  292. if (m_pDialogCamPasram)
  293. {
  294. m_pDialogCamPasram->setModal(true);
  295. m_pDialogCamPasram->show();
  296. }
  297. }
  298. /// 获取相机最大分辨率
  299. bool EntityCamera::getMaxSize(int& w, int& h)
  300. {
  301. return true;
  302. }
  303. /// 设置相机分辨率
  304. bool EntityCamera::setResolution(int w, int h)
  305. {
  306. return true;
  307. }
  308. /// 获取已注册图像回调的数量
  309. int EntityCamera::getReceCallBackSIze()
  310. {
  311. return m_pImgCallBack.size();
  312. }
  313. ///设置接收图像数据回调函数
  314. void EntityCamera::setReceCallBack(IBaseCamCommon::receImgCallBack callBack, long long userParam, QString userID)
  315. {
  316. //this->m_pReceImgFunction = callBack;
  317. //this->mUserParam = userParam;
  318. IBaseCamCommon::ImgCallBack* pImgCallBack = new IBaseCamCommon::ImgCallBack;
  319. pImgCallBack->pReceFunction = callBack;
  320. pImgCallBack->pUserParam = userParam;
  321. pImgCallBack->strUserID = userID;
  322. m_pImgCallBack.push_back(pImgCallBack);
  323. }
  324. ///设置接收Log数据回调函数
  325. void EntityCamera::setReceLogCallBack(IBaseCamCommon::receLogCallBack callBack, long long userParam)
  326. {
  327. this->m_pReceLogFunction = callBack;
  328. this->mLogUserParam = userParam;
  329. }
  330. /// 执行回调函数
  331. void EntityCamera::execCallFunction(IBaseCamCommon::CamImgData* img, int frameCount)
  332. {
  333. for (int i = 0; i < m_pImgCallBack.size(); i++)
  334. {
  335. if (m_pImgCallBack[i]->pReceFunction != nullptr)
  336. {
  337. if (m_pImgCallBack[i]->bActivation || (m_pImgCallBack[i]->strUserID == "main"))
  338. {
  339. m_pImgCallBack[i]->pReceFunction(img, frameCount, m_strSerial, m_pImgCallBack[i]->pUserParam);
  340. //qDebug() << "execCallFunction " << m_pImgCallBack[i]->strUserID;
  341. }
  342. }
  343. }
  344. }
  345. /// 执行Log回调函数
  346. void EntityCamera::execLogCallFunction(QString serial, QString Massage, long long userParam)
  347. {
  348. // printf( "执行回调函数\n" );
  349. if (this->m_pReceLogFunction != NULL)
  350. {
  351. this->m_pReceLogFunction(serial, Massage, userParam);
  352. }
  353. }
  354. /// 软件触发采图
  355. void EntityCamera::softTriggerCap(QString userID)
  356. {
  357. if (NULL != m_pCamera)
  358. {
  359. Dahua::GenICam::CCmdNode nodeTriggerSoftware(m_pCamera, "TriggerSoftware");
  360. if (false != nodeTriggerSoftware.isValid())
  361. {
  362. if (false == nodeTriggerSoftware.execute())
  363. {
  364. }
  365. }
  366. }
  367. for (int i = 0; i < m_pImgCallBack.size(); i++)
  368. {
  369. if (m_pImgCallBack[i]->strUserID == userID)
  370. {
  371. m_pImgCallBack[i]->bActivation = true;
  372. }
  373. else
  374. {
  375. m_pImgCallBack[i]->bActivation = false;
  376. }
  377. }
  378. }
  379. //////////////////////////////////////////////////////////////////////////
  380. void EntityCamera::onGetFrame(const Dahua::GenICam::CFrame& pFrame, const void* pUser)
  381. {
  382. // 标准输出换行
  383. EntityCamera* pDlg = (EntityCamera*)pUser;
  384. int nWidth = pFrame.getImageWidth();
  385. int nHeight = pFrame.getImageHeight();
  386. //判断帧的有效性
  387. bool isValid = pFrame.valid();
  388. if (!isValid)
  389. {
  390. printf("frame is invalid!\n");
  391. return;
  392. }
  393. if (pDlg->m_nImageChannels == 1)
  394. {
  395. pDlg->mImgCapBuffer.count = 1;
  396. pDlg->mImgCapBuffer.height = nHeight;
  397. pDlg->mImgCapBuffer.width = nWidth;
  398. pDlg->mImgCapBuffer.channels = pDlg->m_nImageChannels;
  399. pDlg->mImgCapBuffer.imgData = (void*) pFrame.getImage();
  400. }
  401. else
  402. {
  403. // // 转码
  404. // FrameBufferSPtr sptrConvertFrameBuffer;
  405. // //if (ConvertToBGR24(pFrame, sptrConvertFrameBuffer))
  406. // {
  407. // //addConvertedImage(sptrConvertFrameBuffer);
  408. // }
  409. // pDlg->mImgCapBuffer.count = 1;
  410. // pDlg->mImgCapBuffer.height = nHeight;
  411. // pDlg->mImgCapBuffer.width = nWidth;
  412. // pDlg->mImgCapBuffer.channels = pDlg->mImageChannels;
  413. // pDlg->mImgCapBuffer.imgData= sptrConvertFrameBuffer->bufPtr();
  414. }
  415. pDlg->mImgCapBuffer.nTriggerIndex = 0;
  416. pDlg->mImgCapBuffer.nFrameNum = pFrame.getBlockId();
  417. pDlg->mImgCapBuffer.nLostPacket = 0;
  418. pDlg->execCallFunction(&pDlg->mImgCapBuffer, pDlg->mImgCapBuffer.count);
  419. return;
  420. }
  421. /// 设置连续采集模式
  422. bool EntityCamera::setToFreeRunMode()
  423. {
  424. // 获取TriggerMode节点对象
  425. // Dahua::GenICam::CEnumNode sptrTriggerMode = sptrAcquisitionControl->triggerMode();
  426. // if (!sptrTriggerMode.isValid())
  427. // {
  428. // return false;
  429. // }
  430. //
  431. // // 获取TriggerSelector节点对象
  432. // Dahua::GenICam::CEnumNode sptrTriggerSelector = sptrAcquisitionControl->triggerSelector();
  433. // if (!sptrTriggerSelector.isValid())
  434. // {
  435. // return false;
  436. // }
  437. //
  438. //
  439. // // 设置AcquisitionStart TriggerMode值
  440. // bool bRet = sptrTriggerSelector.setValueBySymbol("AcquisitionStart");
  441. // if (!bRet)
  442. // {
  443. // return false;
  444. // }
  445. //
  446. // bRet = sptrTriggerMode.setValueBySymbol("Off");
  447. // if (!bRet)
  448. // {
  449. // return false;
  450. // }
  451. //
  452. // // 设置FrameStart TriggerMode值
  453. // bRet = sptrTriggerSelector.setValueBySymbol("FrameStart");
  454. // if (!bRet)
  455. // {
  456. // return false;
  457. // }
  458. //
  459. // bRet = sptrTriggerMode.setValueBySymbol("Off");
  460. // if (!bRet)
  461. // {
  462. // return false;
  463. // }
  464. // 设置触发模式
  465. // set trigger mode
  466. Dahua::GenICam::CEnumNode nodeTriggerMode(m_pCamera, "TriggerMode");
  467. if ( nodeTriggerMode.isValid())
  468. {
  469. if (false == nodeTriggerMode.setValueBySymbol("Off"))
  470. {
  471. return false;
  472. }
  473. }
  474. return true;
  475. }
  476. /// 设置软件触发模式
  477. bool EntityCamera::setToSoftwareTrigerMode()
  478. {
  479. // 获取TriggerMode节点对象
  480. // Dahua::GenICam::CEnumNode sptrTriggerMode = sptrAcquisitionControl->triggerMode();
  481. // if (!sptrTriggerMode.isValid())
  482. // {
  483. // return false;
  484. // }
  485. //
  486. // // 获取TriggerSelector节点对象
  487. // Dahua::GenICam::CEnumNode sptrTriggerSelector = sptrAcquisitionControl->triggerSelector();
  488. // if (!sptrTriggerSelector.isValid())
  489. // {
  490. // return false;
  491. // }
  492. //
  493. // // TriggerSource
  494. // Dahua::GenICam::CEnumNode sptrTriggerSource = sptrAcquisitionControl->triggerSource();
  495. // if (!sptrTriggerSource.isValid())
  496. // {
  497. // return false;
  498. // }
  499. //
  500. // bool bRet = false;
  501. // // 设置AcquisitionStart TriggerMode值
  502. // bRet = sptrTriggerSelector.setValueBySymbol("AcquisitionStart");
  503. // if (!bRet)
  504. // {
  505. // return false;
  506. // }
  507. //
  508. // bRet = sptrTriggerMode.setValueBySymbol("On");
  509. // if (!bRet)
  510. // {
  511. // return false;
  512. // }
  513. //
  514. // bRet = sptrTriggerSource.setValueBySymbol("Software");
  515. // if (!bRet)
  516. // {
  517. // return false;
  518. // }
  519. //
  520. // // 设置FrameStart TriggerMode值
  521. // bRet = sptrTriggerSelector.setValueBySymbol("FrameStart");
  522. // if (!bRet)
  523. // {
  524. // return false;
  525. // }
  526. //
  527. // bRet = sptrTriggerMode.setValueBySymbol("On");
  528. // if (!bRet)
  529. // {
  530. // return false;
  531. // }
  532. //
  533. // bRet = sptrTriggerSource.setValueBySymbol("Software");
  534. // if (!bRet)
  535. // {
  536. // return false;
  537. // }
  538. // 设置触发器
  539. // set trigger
  540. Dahua::GenICam::CEnumNode nodeTriggerSelector(m_pCamera, "TriggerSelector");
  541. if (nodeTriggerSelector.isValid())
  542. {
  543. if (false == nodeTriggerSelector.setValueBySymbol("FrameStart"))
  544. {
  545. printf("set TriggerSelector value = FrameStart fail.\n");
  546. return false;
  547. }
  548. }
  549. // 设置触发模式
  550. // set trigger mode
  551. Dahua::GenICam::CEnumNode nodeTriggerMode(m_pCamera, "TriggerMode");
  552. if (nodeTriggerMode.isValid())
  553. {
  554. if (false == nodeTriggerMode.setValueBySymbol("On"))
  555. {
  556. printf("set TriggerMode value = On fail.\n");
  557. return false;
  558. }
  559. }
  560. // 设置触发源为软触发
  561. // set triggerSource as software trigger
  562. Dahua::GenICam::CEnumNode nodeTriggerSource(m_pCamera, "TriggerSource");
  563. if (nodeTriggerSource.isValid())
  564. {
  565. if (false == nodeTriggerSource.setValueBySymbol("Software"))
  566. {
  567. printf("set TriggerSource value = Software fail.\n");
  568. return false;
  569. }
  570. }
  571. return true;
  572. }
  573. /// 设置硬件触发模式
  574. bool EntityCamera::setToHardwareTrigerMode()
  575. {
  576. // 获取TriggerMode节点对象
  577. // Dahua::GenICam::CEnumNode sptrTriggerMode = sptrAcquisitionControl->triggerMode();
  578. // if (!sptrTriggerMode.isValid()) {
  579. // return false;
  580. // }
  581. //
  582. // // 获取TriggerSelector节点对象
  583. // Dahua::GenICam::CEnumNode sptrTriggerSelector = sptrAcquisitionControl->triggerSelector();
  584. // if (!sptrTriggerSelector.isValid()) {
  585. // return false;
  586. // }
  587. //
  588. // // TriggerSource
  589. // Dahua::GenICam::CEnumNode sptrTriggerSource = sptrAcquisitionControl->triggerSource();
  590. // if (!sptrTriggerSource.isValid()) {
  591. // return false;
  592. // }
  593. //
  594. // bool bRet = false;
  595. // // 设置AcquisitionStart TriggerMode值
  596. // bRet = sptrTriggerSelector.setValueBySymbol("AcquisitionStart");
  597. // if (!bRet) {
  598. // return false;
  599. // }
  600. //
  601. // bRet = sptrTriggerMode.setValueBySymbol("On");
  602. // if (!bRet)
  603. // {
  604. // return false;
  605. // }
  606. //
  607. // bRet = sptrTriggerSource.setValueBySymbol("Line1");
  608. // if (!bRet) {
  609. // return false;
  610. // }
  611. //
  612. // // 设置FrameStart TriggerMode值
  613. // bRet = sptrTriggerSelector.setValueBySymbol("FrameStart");
  614. // if (!bRet) {
  615. // return false;
  616. // }
  617. //
  618. // bRet = sptrTriggerMode.setValueBySymbol("On");
  619. // if (!bRet) {
  620. // return false;
  621. // }
  622. //
  623. // bRet = sptrTriggerSource.setValueBySymbol("Line1");
  624. // if (!bRet) {
  625. // return false;
  626. // }
  627. // 设置触发器
  628. // set trigger
  629. Dahua::GenICam::CEnumNode nodeTriggerSelector(m_pCamera, "TriggerSelector");
  630. if (nodeTriggerSelector.isValid())
  631. {
  632. if (false == nodeTriggerSelector.setValueBySymbol("FrameStart"))
  633. {
  634. printf("set TriggerSelector value = FrameStart fail.\n");
  635. return false;
  636. }
  637. }
  638. // 设置触发模式
  639. // set trigger mode
  640. Dahua::GenICam::CEnumNode nodeTriggerMode(m_pCamera, "TriggerMode");
  641. if (nodeTriggerMode.isValid())
  642. {
  643. if (false == nodeTriggerMode.setValueBySymbol("On"))
  644. {
  645. printf("set TriggerMode value = On fail.\n");
  646. return false;
  647. }
  648. }
  649. // 设置触发源为Line1触发
  650. // set trigggerSource as Line1 trigger
  651. Dahua::GenICam::CEnumNode nodeTriggerSource(m_pCamera, "TriggerSource");
  652. if (nodeTriggerSource.isValid())
  653. {
  654. if (false == nodeTriggerSource.setValueBySymbol("Line1"))
  655. {
  656. printf("set TriggerSource value = Line1 fail.\n");
  657. return false;
  658. }
  659. }
  660. return true;
  661. }