camerapar.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #include "camerapar.h"
  2. #include "ui_camerapar.h"
  3. #include"general/xmloperate.h"
  4. #include<QMessageBox>
  5. #include"general/generalfunc.h"
  6. #include <datavar.h>
  7. #include <util.h>
  8. #include <globaldef.h>
  9. #include <log.h>
  10. #include "container/threadsafequeue.h"
  11. #include <autofocus.h>
  12. CameraPar::CameraPar(QWidget *parent) :
  13. QWidget(parent),
  14. ui(new Ui::CameraPar)
  15. {
  16. ui->setupUi(this);
  17. m_timer = new QTimer(this);
  18. connect(m_timer, SIGNAL(timeout()), this, SLOT(realTimeShowImage()));
  19. connect(this, SIGNAL(sig_infoDisplay(QString , int)), this, SLOT(printLog(QString , int)));
  20. ui->BTN_cameraSearch->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS);
  21. ui->BTN_connCamera->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS);
  22. ui->BTN_disconnCamera->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS);
  23. ui->BTN_softTriggerOnce->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS);
  24. ui->BTN_saveConfig->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS);
  25. ui->PGB_imgSharpness->setMinimum(-1);
  26. ui->PGB_imgSharpness->setMaximum(-1);
  27. ui->PGB_imgSharpness->setValue(-1);
  28. ui->PGB_imgSharpness->setStyleSheet(ST_QProgressBar_QSS);
  29. //m_isCamConnected = false;
  30. //ui->WGT_cam->setEnabled(false);
  31. //ui->WGT_camConfig->setEnabled(false);
  32. //ui->WGT_imgSharpProgress->setRange(0, 100);
  33. //ui->WGT_imgSharpProgress->setValue(50);
  34. //
  35. //ui->DSPB_exp->setStyleSheet(ST_DOUBLE_SPIN_BOX_QSS);
  36. //ui->DSPB_gain->setStyleSheet(ST_DOUBLE_SPIN_BOX_QSS);
  37. }
  38. CameraPar::~CameraPar()
  39. {
  40. delete ui;
  41. }
  42. //初始化变量
  43. void CameraPar::initPar(QString pro_path)
  44. {
  45. GeneralFunc::isDirExist(pro_path+"\\camera",true);
  46. cam_config_path=pro_path+"\\camera\\CamConfig.xml";
  47. XmlOperate m_xml;
  48. m_xml.openXml(cam_config_path);
  49. camList=m_xml.getChild(QStringList());
  50. m_xml.closeXml();
  51. initUI();
  52. }
  53. //初始化UI
  54. void CameraPar::initUI()
  55. {
  56. //ui->cbboxCamList->clear();
  57. //ui->cbboxCamList->addItems(camList);
  58. }
  59. //在关闭前发送设置变化的信号
  60. void CameraPar::closeEvent(QCloseEvent *event)
  61. {
  62. event->accept();
  63. }
  64. //界面上打印log
  65. void CameraPar::printLog(QString str, int logType)
  66. {
  67. if (logType <= 1)
  68. {
  69. ui->LABLE_logIcon->setStyleSheet(QString(""));
  70. // border - image: url(: / Assets / View / info.png);
  71. }
  72. else if (logType == 2)
  73. {
  74. ui->LABLE_logIcon->setStyleSheet(QString("border-image: url(:/Assets/View/warn.png);"));
  75. }
  76. else
  77. {
  78. ui->LABLE_logIcon->setStyleSheet(QString("border-image: url(:/Assets/View/error.png);"));
  79. }
  80. ui->LABLE_log->setText(str);
  81. }
  82. //写入相机设置
  83. void CameraPar::on_pbtnWrite_clicked()
  84. {
  85. this->hide();
  86. //XmlOperate m_xml;
  87. //m_xml.openXml(cam_config_path);
  88. //QString text=ui->cbboxCamList->currentText();
  89. //m_xml.addNode(QStringList()<<text<<"CamType",ui->cbboxCamType->currentText());
  90. //m_xml.addNode(QStringList()<<text<<"CameraModelSerial",ui->ledtSerialNum->text());
  91. //m_xml.addNode(QStringList()<<text<<"Resolution",ui->ledtResolution->text());
  92. //m_xml.addNode(QStringList()<<text<<"ExposureTime",ui->ledtExpTime->text());
  93. //m_xml.addNode(QStringList()<<text<<"Gain",ui->ledtGain->text());
  94. //m_xml.addNode(QStringList()<<text<<"GrabDelay",ui->ledtTimeDelay->text());
  95. //m_xml.addNode(QStringList()<<text<<"TriggerMode",ui->cbboxTriggerMode->currentText());
  96. //m_xml.addNode(QStringList()<<text<<"TriggerSource",ui->cbboxTriggerSource->currentText());
  97. //m_xml.addNode(QStringList()<<text<<"CamStepAll",ui->ledtCamStepAll->text());
  98. //m_xml.closeXml();
  99. //emit signal_cam_change(text);
  100. }
  101. //增加一个相机配置
  102. void CameraPar::on_pbtnAddCam_clicked()
  103. {
  104. //QString settext=ui->ledtCamName->text();
  105. //ui->cbboxCamList->addItem(settext);
  106. //camList<<settext;
  107. //ui->cbboxCamList->setCurrentText(settext);
  108. //ui->cbboxCamType->setCurrentIndex(0);
  109. //ui->ledtSerialNum->setText(tr(QString::fromLocal8Bit("型号:序列号").toUtf8()));
  110. //ui->ledtResolution->setText(tr(QString::fromLocal8Bit("width:height").toUtf8()));
  111. //ui->ledtExpTime->setText(QString::fromLocal8Bit("10000"));
  112. //ui->ledtGain->setText("0");
  113. //ui->ledtTimeDelay->setText(QString::fromLocal8Bit("10"));
  114. //ui->cbboxTriggerMode->setCurrentText("0");
  115. //ui->cbboxTriggerSource->setCurrentText("7");
  116. //ui->ledtCamStepAll->setText("step0");
  117. }
  118. //选择相机时更新界面
  119. void CameraPar::on_cbboxCamList_currentTextChanged(const QString &arg1)
  120. {
  121. /* XmlOperate m_xml;
  122. m_xml.openXml(cam_config_path);
  123. ui->cbboxCamType->setCurrentText(m_xml.readNode(QStringList()<<arg1<<"CamType"));
  124. ui->ledtSerialNum->setText(m_xml.readNode(QStringList()<<arg1<<"CameraModelSerial"));
  125. ui->ledtResolution->setText(m_xml.readNode(QStringList()<<arg1<<"Resolution"));
  126. ui->ledtExpTime->setText(m_xml.readNode(QStringList()<<arg1<<"ExposureTime"));
  127. ui->ledtGain->setText(m_xml.readNode(QStringList()<<arg1<<"Gain"));
  128. ui->ledtTimeDelay->setText(m_xml.readNode(QStringList()<<arg1<<"GrabDelay"));
  129. ui->cbboxTriggerMode->setCurrentText(m_xml.readNode(QStringList()<<arg1<<"TriggerMode"));
  130. ui->cbboxTriggerSource->setCurrentText(m_xml.readNode(QStringList()<<arg1<<"TriggerSource"));
  131. ui->ledtCamStepAll->setText(m_xml.readNode(QStringList()<<arg1<<"CamStepAll"));
  132. m_xml.closeXml();*/
  133. }
  134. //删除一个相机配置
  135. void CameraPar::on_pbtnDeleteCam_clicked()
  136. {
  137. QMessageBox::StandardButton btn=QMessageBox::question(this,
  138. QString::fromLocal8Bit("提示"),
  139. QString::fromLocal8Bit("确实要删除当前相机吗?"),
  140. QMessageBox::Yes|QMessageBox::No);
  141. if(btn==QMessageBox::Yes)
  142. {
  143. //XmlOperate m_xml;
  144. //m_xml.openXml(cam_config_path);
  145. //m_xml.removeNode(QStringList()<<ui->cbboxCamList->currentText());
  146. //m_xml.closeXml();
  147. //ui->cbboxCamList->removeItem(ui->cbboxCamList->currentIndex());
  148. }
  149. }
  150. void CameraPar::on_BTN_softTriggerOnce_clicked()
  151. {
  152. if (DataVar::g_camTriggerMode == 1)
  153. {
  154. cv::Mat img;
  155. int ret = DataVar::g_camera->takeSingleImage(img);
  156. if (ret == 0 && !img.empty())
  157. {
  158. updateImageScale(ui->LABEL_showWindow, img);
  159. }
  160. //DataVar::g_camera->softTriggerOnce();
  161. }
  162. if (DataVar::g_camTriggerMode == 5)
  163. {
  164. int ret = DataVar::g_camera->softTriggerOnce();
  165. }
  166. }
  167. void CameraPar::on_DSPB_exp_valueChanged(double v)
  168. {
  169. DataVar::g_camera->setExposureTime(v);
  170. }
  171. void CameraPar::on_DSPB_gain_valueChanged(double v)
  172. {
  173. DataVar::g_camera->setGain(v);
  174. }
  175. void CameraPar::on_SPB_delay_valueChanged(int v)
  176. {
  177. DataVar::g_camera->setTriggerDelay(v);
  178. }
  179. void CameraPar::on_CBBOX_triggerMode_currentIndexChanged(int id)
  180. {
  181. if (id == 0)
  182. {
  183. //if (!m_timer->isActive())
  184. // m_timer->start(50);
  185. DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE(0));
  186. DataVar::g_camTriggerMode = 0;
  187. }
  188. else
  189. {
  190. //if (m_timer->isActive())
  191. // m_timer->stop();
  192. DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE(1));
  193. DataVar::g_camera->setTriggerSource(CvxCamera::E_TRIGGER_SOURCE(id - 1));
  194. DataVar::g_camTriggerMode = id;
  195. }
  196. DataVar::g_imgsQueue.clear();//清空队列
  197. }
  198. /*****************相机搜索*****************/
  199. void CameraPar::on_BTN_cameraSearch_clicked()
  200. {
  201. if (DataVar::g_isCamConnected)
  202. {
  203. QMESSAGEBOX_ERROR(QStringLiteral("请先断开相机!"));
  204. return;
  205. }
  206. ui->CBX_camSn->clear();
  207. std::vector<std::string> vecCamSn;
  208. DataVar::g_camera->enumDevicesSN(vecCamSn);
  209. if (vecCamSn.size() == 0)
  210. {
  211. emit sig_infoDisplay(QStringLiteral("未搜索到相机!"),2);
  212. }
  213. else
  214. {
  215. ui->WGT_cam->setEnabled(true);
  216. }
  217. for (auto i : vecCamSn)
  218. {
  219. ui->CBX_camSn->addItem(QString::fromStdString(i));
  220. }
  221. }
  222. /*****************连接相机*****************/
  223. void CameraPar::on_BTN_connCamera_clicked()
  224. {
  225. if (DataVar::g_isCamConnected)
  226. {
  227. emit sig_infoDisplay(QStringLiteral("相机已经连接!!"), 2);
  228. return;
  229. }
  230. std::string sn = ui->CBX_camSn->currentText().toStdString();
  231. int ret = DataVar::g_camera->openCamera(sn.c_str());
  232. if (ret != 0)
  233. {
  234. emit sig_infoDisplay(QStringLiteral("相机连接失败!!"), 3);
  235. return;
  236. }
  237. DataVar::g_camera->setInitParameters();
  238. LOG_DEBUG("connect camera %s succeed !!", sn.c_str());
  239. ret = DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE::TRIGGER_MODE_OFF);
  240. ret = DataVar::g_camera->setTriggerSource(CvxCamera::E_TRIGGER_SOURCE::TRIGGER_SOURCE_SOFT);
  241. LOG_DEBUG("camera %s set soft trigger succeed!!", sn.c_str());
  242. ret = DataVar::g_camera->setTriggerDelay(0);
  243. ret = DataVar::g_camera->startGrabbing();
  244. LOG_DEBUG("camera %s startGrabbing !!", sn.c_str());
  245. DataVar::g_camTriggerMode = 0;
  246. emit sig_infoDisplay(QStringLiteral("相机连接成功!!"));
  247. DataVar::g_isCamConnected = true;
  248. ui->WGT_camConfig->setEnabled(true);
  249. updataCamInfoToForm();
  250. }
  251. /*****************断开相机连接*****************/
  252. void CameraPar::on_BTN_disconnCamera_clicked()
  253. {
  254. int ret = DataVar::g_camera->closeCamera();
  255. if (ret != 0)
  256. {
  257. emit sig_infoDisplay(QStringLiteral("相机断开失败!!"), 2);
  258. return;
  259. }
  260. emit sig_infoDisplay(QStringLiteral("相机断开连接!!"));
  261. DataVar::g_isCamConnected = false;
  262. ui->WGT_camConfig->setEnabled(false);
  263. }
  264. /*****************更新相机配置信息到UI*****************/
  265. void CameraPar::updataCamInfoToForm()
  266. {
  267. ui->DSPB_exp->setValue(DataVar::g_camera->getExposureTime());
  268. ui->DSPB_gain->setValue(DataVar::g_camera->getGain());
  269. ui->CBBOX_triggerMode->setCurrentIndex(0);
  270. }
  271. void CameraPar::realTimeShowImage()
  272. {
  273. double scaleW; double scaleH; double offsetX; double offsetY;
  274. QRect qroi;
  275. cv::Rect roi;
  276. int x, y, w, h;
  277. //为了保证算法取图引起相片资源竞争,g_imgsQueue里面经常留一张图片
  278. if (DataVar::g_camRealTimeShowMode == 2)
  279. {
  280. cv::Mat src;
  281. if (DataVar::g_imgsQueue.pop(src))
  282. {
  283. if (!src.empty())
  284. {
  285. qroi = ui->LABEL_showWindow->getRect();
  286. updateImageScale(ui->LABEL_showWindow, src, scaleW,scaleH,offsetX,offsetY);
  287. if (!qroi.isNull())
  288. {
  289. x = (qroi.x() + offsetX) / scaleW;
  290. y = (qroi.y() + offsetY) / scaleH;
  291. w = qroi.width() / scaleW;
  292. h = qroi.height() / scaleH;
  293. cv::Rect roi = cv::Rect(x, y, w, h) & cv::Rect(0,0, src.size().width,src.size().height);
  294. float score = AutoFocus::AF_Sobel(src(roi));
  295. int v = roundf(score * 100);
  296. if (v < ui->PGB_imgSharpness->minimum() || ui->PGB_imgSharpness->minimum()<0)
  297. ui->PGB_imgSharpness->setMinimum(v);
  298. else if (v > ui->PGB_imgSharpness->maximum() || ui->PGB_imgSharpness->maximum() < 0)
  299. ui->PGB_imgSharpness->setMaximum(v);
  300. ui->PGB_imgSharpness->setValue(v);
  301. //ui->LABLE_imgSharpness->setText(QString::number(v));
  302. }
  303. }
  304. }
  305. //src = DataVar::g_imgsQueue.dequeue();
  306. }
  307. }
  308. void CameraPar::showEvent(QShowEvent* event)
  309. {
  310. DataVar::g_camRealTimeShowMode = 2; //相机配置窗口显示
  311. if (DataVar::g_camTriggerMode == 0)
  312. m_timer->start(50);
  313. }
  314. void CameraPar::hideEvent(QHideEvent* event)
  315. {
  316. if (DataVar::g_camTriggerMode == 0)
  317. DataVar::g_camRealTimeShowMode = 1; //主界面窗口显示
  318. else
  319. DataVar::g_camRealTimeShowMode = 0; //不实时显示
  320. }