mainwindow.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <opencv2/opencv.hpp>
  4. #include <opencv2/core.hpp>
  5. #include <opencv2/imgproc.hpp>
  6. //#include "opencv2/imgcodecs/legacy/constants_c.h"
  7. #include <opencv2/imgproc/types_c.h>
  8. #include "xmlparam.h"
  9. MainWindow * gw;
  10. qint64 xt;
  11. //void Listenpic(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  12. //{
  13. // if(nSize<1000)return;
  14. //// qint64 time;
  15. //// memcpy(&time,strdata,sizeof(qint64));
  16. //// int indexraw;
  17. //// memcpy(&indexraw,strdata+sizeof(qint64),sizeof(int));
  18. // iv::vision::rawpic pic;
  19. // if(false == pic.ParseFromArray(strdata,nSize))
  20. // {
  21. // std::cout<<"picview Listenpic fail."<<std::endl;
  22. // return;
  23. // }
  24. // xt = QDateTime::currentMSecsSinceEpoch();
  25. // qDebug("latence = %ld ",xt-pic.time());
  26. //// pic.set_time(time);
  27. //// pic.set_index(indexraw);
  28. //// qDebug("hear.");
  29. //// pic.set_picdata(strdata+sizeof(qint64)+sizeof(int),nSize-sizeof(qint64)-sizeof(int));
  30. //// qDebug("hear2.");
  31. // gw->UpdatePic(pic);
  32. //// qDebug("hear3.");
  33. //}
  34. void Listenpics0(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  35. {
  36. if(nSize<1000)return;
  37. iv::vision::rawpic pic;
  38. if(false == pic.ParseFromArray(strdata,nSize))
  39. {
  40. std::cout<<"picview Listenpic fail."<<std::endl;
  41. return;
  42. }
  43. xt = QDateTime::currentMSecsSinceEpoch();
  44. qDebug("latence = %ld ",xt-pic.time());
  45. gw->UpdatePic(pic,0);
  46. }
  47. void Listenpics1(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  48. {
  49. if(nSize<1000)return;
  50. iv::vision::rawpic pic;
  51. if(false == pic.ParseFromArray(strdata,nSize))
  52. {
  53. std::cout<<"picview Listenpic fail."<<std::endl;
  54. return;
  55. }
  56. xt = QDateTime::currentMSecsSinceEpoch();
  57. qDebug("latence = %ld ",xt-pic.time());
  58. gw->UpdatePic(pic,1);
  59. }
  60. void Listenpics2(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  61. {
  62. if(nSize<1000)return;
  63. iv::vision::rawpic pic;
  64. if(false == pic.ParseFromArray(strdata,nSize))
  65. {
  66. std::cout<<"picview Listenpic fail."<<std::endl;
  67. return;
  68. }
  69. xt = QDateTime::currentMSecsSinceEpoch();
  70. qDebug("latence = %ld ",xt-pic.time());
  71. gw->UpdatePic(pic,2);
  72. }
  73. void Listenpics3(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  74. {
  75. if(nSize<1000)return;
  76. iv::vision::rawpic pic;
  77. if(false == pic.ParseFromArray(strdata,nSize))
  78. {
  79. std::cout<<"picview Listenpic fail."<<std::endl;
  80. return;
  81. }
  82. xt = QDateTime::currentMSecsSinceEpoch();
  83. qDebug("latence = %ld ",xt-pic.time());
  84. gw->UpdatePic(pic,3);
  85. }
  86. MainWindow::MainWindow(QWidget *parent) :
  87. QMainWindow(parent),
  88. ui(new Ui::MainWindow)
  89. {
  90. ui->setupUi(this);
  91. gw = this;
  92. mTime.start();
  93. mnlidarcount = 0;
  94. mnonepcd = 0;
  95. mbSaveOne = false;
  96. mbSave = false;
  97. mnsave = 0;
  98. mbOpen = false;
  99. mstrSavePath = QCoreApplication::applicationDirPath();
  100. myview = new MyView(this);
  101. myview->setObjectName(QStringLiteral("graphicsView"));
  102. myview->setGeometry(QRect(30, 30, 600, 600));
  103. image = new QImage(2000, 2000, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  104. myview->setCacheMode(myview->CacheBackground);
  105. painter = new QPainter(image);
  106. painter->end();
  107. scene = new QGraphicsScene;
  108. CreateView();
  109. int i;
  110. for(i=0;i<MAX_CAMERA;i++)
  111. {
  112. mpicindex[i] = 0;
  113. mpicviewindex[i] = 0;
  114. }
  115. mCurCameraIndex = 0;
  116. // myview->scale(0.3,0.3);
  117. // myview->show();
  118. QString strpath = QCoreApplication::applicationDirPath();
  119. strpath = strpath + "/picview.xml";
  120. std::cout<<strpath.toStdString()<<std::endl;
  121. iv::xmlparam::Xmlparam xp(strpath.toStdString());
  122. std::string strxmlmsgname0 = xp.GetParam("msgname0","image00");
  123. std::string strxmlmsgname1 = xp.GetParam("msgname1","image01");
  124. std::string strxmlmsgname2 = xp.GetParam("msgname2","image02");
  125. std::string strxmlmsgname3 = xp.GetParam("msgname3","image03");
  126. // mpa = iv::modulecomm::RegisterRecv(xmlmsgname.data(),Listenpic);
  127. void * pa[4];
  128. pa[0] =iv::modulecomm::RegisterRecv(strxmlmsgname0.data(),Listenpics0);
  129. pa[1] =iv::modulecomm::RegisterRecv(strxmlmsgname1.data(),Listenpics1);
  130. pa[2] =iv::modulecomm::RegisterRecv(strxmlmsgname2.data(),Listenpics2);
  131. pa[3] =iv::modulecomm::RegisterRecv(strxmlmsgname3.data(),Listenpics3);
  132. connect(&mTimer,SIGNAL(timeout()),this,SLOT(onTimer()));
  133. connect(this,SIGNAL(updatepic()),this,SLOT(onTimer()));
  134. #ifdef Q_OS_WIN32
  135. mTimer.start(1000);
  136. #else
  137. mTimer.start(300);
  138. #endif
  139. setWindowTitle("picview");
  140. }
  141. MainWindow::~MainWindow()
  142. {
  143. delete ui;
  144. }
  145. void MainWindow::UpdatePic(iv::vision::rawpic pic,int index)
  146. {
  147. mMutex.lock();
  148. mrectime = QDateTime::currentMSecsSinceEpoch();
  149. mrawpics[index].CopyFrom(pic);
  150. // qDebug("timex is %ld ",mrawpic.time());
  151. mpicindex[index]++;
  152. mMutex.unlock();
  153. if((mbSaveOne)&&(index == mCurCameraIndex))
  154. {
  155. QString strpath = mstrSavePath;
  156. strpath = strpath+"/";
  157. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + ".jpg";
  158. // pcl::io::loadPCDFile<pcl::PointXYZRGBA>("table_scene_lms400.pcd", *cloud
  159. SaveOnePic(strpath,index);
  160. mbSaveOne = false;
  161. mnonepcd++;
  162. }
  163. if((mbSave)&&(index == mCurCameraIndex))
  164. {
  165. QString strpath = mstrSavePath;
  166. strpath = strpath+"/";
  167. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + ".jpg";
  168. SaveOnePic(strpath,index);
  169. mnsave++;
  170. }
  171. mnlidarcount++;
  172. emit updatepic();
  173. }
  174. void MainWindow::UpdatePointCloud(pcl::PointCloud<pcl::PointXYZI>::Ptr pc)
  175. {
  176. if(mbSaveOne)
  177. {
  178. QString strpath = mstrSavePath;
  179. strpath = strpath+"/";
  180. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + "-1.pcd";
  181. // pcl::io::loadPCDFile<pcl::PointXYZRGBA>("table_scene_lms400.pcd", *cloud
  182. }
  183. if(mbSave)
  184. {
  185. QString strpath = mstrSavePath;
  186. strpath = strpath+"/";
  187. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + ".pcd";
  188. }
  189. mMutex.lock();
  190. mMutex.unlock();
  191. mnlidarcount++;
  192. mpLE_lidarcount->setText(QString::number(mnlidarcount));
  193. // if(!pc->empty())update();
  194. }
  195. void MainWindow::on_checkBox_clicked()
  196. {
  197. }
  198. void MainWindow::onTimer()
  199. {
  200. update();
  201. }
  202. //刷新
  203. void MainWindow::paintEvent(QPaintEvent *)
  204. {
  205. if(mpicviewindex[mCurCameraIndex] == mpicindex[mCurCameraIndex])return;
  206. mpicviewindex[mCurCameraIndex] = mpicindex[mCurCameraIndex];
  207. mpLE_onepcd->setText(QString::number(mnonepcd));
  208. mpLE_savepcd->setText(QString::number(mnsave));
  209. mpLE_lidarcount->setText(QString::number(mnlidarcount));
  210. // qDebug("hear4.");
  211. iv::vision::rawpic pic;
  212. qint64 rectime;
  213. mMutex.lock();
  214. pic.CopyFrom(mrawpics[mCurCameraIndex]);
  215. rectime = mrectime;
  216. mMutex.unlock();
  217. // qDebug("hear5.");
  218. painter->begin(image);
  219. image->fill(QColor(255, 255, 255));//对画布进行填充
  220. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  221. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  222. painter->translate(1000,1000);
  223. // std::string strpic = pic.picdata();
  224. // int rows,cols,type;
  225. // const char * pstr = strpic.data();
  226. // memcpy(&rows,pstr+2,sizeof(int));
  227. // memcpy(&cols,pstr+6,sizeof(int));
  228. // memcpy(&type,pstr+10,sizeof(int));
  229. cv::Mat mat(pic.height(),pic.width(),pic.mattype());
  230. if(pic.type() == 1)
  231. memcpy(mat.data,pic.picdata().data(),mat.rows*mat.cols*mat.elemSize());
  232. else
  233. {
  234. qDebug("jpg");
  235. std::vector<unsigned char> buff(pic.picdata().data(),pic.picdata().data()+pic.picdata().size());
  236. mat = cv::imdecode(buff,1);
  237. }
  238. // qDebug("pic len is %d ",strpic.length());
  239. cv::cvtColor(mat, mat, CV_BGR2RGB);
  240. QImage image2 = QImage((uchar*)(mat.data), mat.cols, mat.rows, QImage::Format_RGB888);
  241. // QImage image2 = QImage((uchar*)(mat.data), mat.cols, mat.rows, QImage::Format_ARGB32);
  242. // QImage image2 = QImage((uchar*)(mat.data), mat.cols, mat.rows, QImage::Format_RGBA8888);
  243. // QColor x;
  244. // x.setHsl(200,255,120);
  245. // painter->setPen(x);
  246. // painter->drawText(-300,-300,40,40,Qt::AlignHCenter | Qt::AlignTop,"hello");
  247. painter->end();
  248. scene->clear();
  249. scene->addPixmap(QPixmap::fromImage(image2));
  250. myview->setScene(scene);
  251. myview->show();
  252. mpLE_capturetime->setText(QString::number(pic.time()));
  253. // qint64 timediff = rectime - pic.time();
  254. qint64 timediff = xt - pic.time();
  255. mpLE_rectime->setText(QString::number(xt));
  256. mpLE_timediff->setText(QString::number(timediff));
  257. mat.release();
  258. }
  259. void MainWindow::resizeEvent(QResizeEvent *event)
  260. {
  261. qDebug("resize");
  262. QSize sizemain = ui->centralWidget->size();
  263. qDebug("size x = %d y=%d",sizemain.width(),sizemain.height());
  264. AdjustWPos(sizemain);
  265. }
  266. void MainWindow::AdjustWPos(QSize sizemain)
  267. {
  268. myview->setGeometry(20,30,sizemain.width()-400,sizemain.height());
  269. mgplidar->setGeometry(sizemain.width()-350,30,320,400);
  270. }
  271. void MainWindow::CreateStatusView(QGridLayout *gl)
  272. {
  273. gl->setSpacing(10);
  274. int iRow = 0;
  275. QLabel * pl = new QLabel(this);
  276. pl->setText("Count");
  277. pl->setFixedWidth(150);
  278. QLineEdit * ple = new QLineEdit(this);
  279. ple->setFixedWidth(150);
  280. gl->addWidget(pl,iRow,0);
  281. gl->addWidget(ple,iRow,1);
  282. iRow++;
  283. mpLE_lidarcount = ple;
  284. QPushButton * pb2 = new QPushButton(this);
  285. pb2->setText("Save One");
  286. pb2->setFixedWidth(80);
  287. QLineEdit * ple2 = new QLineEdit(this);
  288. ple2->setFixedWidth(150);
  289. gl->addWidget(pb2,iRow,0);
  290. gl->addWidget(ple2,iRow,1);
  291. iRow++;
  292. mpPB_saveonepcd = pb2;
  293. mpLE_onepcd = ple2;
  294. connect(mpPB_saveonepcd,SIGNAL(clicked(bool)),this,SLOT(onSaveOnePCD()));
  295. QPushButton * pb3 = new QPushButton(this);
  296. pb3->setText("Start Save");
  297. pb3->setFixedWidth(80);
  298. QLineEdit * ple3 = new QLineEdit(this);
  299. ple3->setFixedWidth(150);
  300. gl->addWidget(pb3,iRow,0);
  301. gl->addWidget(ple3,iRow,1);
  302. iRow++;
  303. mpPB_savepcd = pb3;
  304. mpLE_savepcd = ple3;
  305. connect(mpPB_savepcd,SIGNAL(clicked(bool)),this,SLOT(onSavePCD()));
  306. QPushButton * pb4 = new QPushButton(this);
  307. pb4->setText("Set Folder");
  308. pb4->setFixedWidth(80);
  309. QLineEdit * ple4 = new QLineEdit(this);
  310. ple4->setFixedWidth(150);
  311. gl->addWidget(pb4,iRow,0);
  312. gl->addWidget(ple4,iRow,1);
  313. iRow++;
  314. mpLE_savefolder = ple4;
  315. connect(pb4,SIGNAL(clicked(bool)),this,SLOT(onSelectFolder()));
  316. QLabel * pl5 = new QLabel(this);
  317. pl5->setText("capture time");
  318. pl5->setFixedWidth(150);
  319. QLineEdit * ple5 = new QLineEdit(this);
  320. ple5->setFixedWidth(150);
  321. gl->addWidget(pl5,iRow,0);
  322. gl->addWidget(ple5,iRow,1);
  323. iRow++;
  324. mpLE_capturetime = ple5;
  325. QLabel * pl6 = new QLabel(this);
  326. pl6->setText("receive time");
  327. pl6->setFixedWidth(150);
  328. QLineEdit * ple6 = new QLineEdit(this);
  329. ple6->setFixedWidth(150);
  330. gl->addWidget(pl6,iRow,0);
  331. gl->addWidget(ple6,iRow,1);
  332. iRow++;
  333. mpLE_rectime = ple6;
  334. QLabel * pl7 = new QLabel(this);
  335. pl7->setText("latence time");
  336. pl7->setFixedWidth(150);
  337. QLineEdit * ple7 = new QLineEdit(this);
  338. ple7->setFixedWidth(150);
  339. gl->addWidget(pl7,iRow,0);
  340. gl->addWidget(ple7,iRow,1);
  341. iRow++;
  342. mpLE_timediff = ple7;
  343. QComboBox * pcb = new QComboBox(this);
  344. pcb->setFixedWidth(150);
  345. gl->addWidget(pcb,iRow,0);
  346. iRow++;
  347. pcb->addItem("camera1");
  348. pcb->addItem("camera2");
  349. pcb->addItem("camera3");
  350. pcb->addItem("camera4");
  351. pcb->setCurrentIndex(0);
  352. connect(pcb,SIGNAL(currentIndexChanged(int)),this,SLOT(onSelectCamera(int)));
  353. QSpacerItem * xpsi2 = new QSpacerItem(400,1000,QSizePolicy::Maximum);
  354. gl->addItem(xpsi2,iRow,0);
  355. }
  356. void MainWindow::CreateView()
  357. {
  358. QGroupBox * gp1 = new QGroupBox(ui->centralWidget);
  359. gp1->setTitle(QStringLiteral("IMAGE Status"));
  360. gp1->setGeometry(QRect(10,100,400,600));
  361. QGridLayout * gll1 = new QGridLayout(ui->centralWidget);
  362. gp1->setLayout(gll1);
  363. CreateStatusView(gll1);
  364. mgplidar = gp1;
  365. }
  366. void MainWindow::onSaveOnePCD()
  367. {
  368. mbSaveOne = true;
  369. }
  370. void MainWindow::onSavePCD()
  371. {
  372. if(mbSave)
  373. {
  374. mbSave = false;
  375. mpPB_savepcd->setText("Start Save");
  376. }
  377. else
  378. {
  379. mbSave = true;
  380. mpPB_savepcd->setText("Stop Save");
  381. }
  382. }
  383. void MainWindow::onSelectFolder()
  384. {
  385. QString str = QFileDialog::getExistingDirectory(this, tr("Set PCD Save Directory"), mstrSavePath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
  386. if(!str.isEmpty())
  387. {
  388. mstrSavePath = str;
  389. mpLE_savefolder->setText(mstrSavePath);
  390. }
  391. else
  392. {
  393. qDebug("not change dir.");
  394. }
  395. }
  396. void MainWindow::SaveOnePic(QString strpath,int index)
  397. {
  398. mMutex.lock();
  399. cv::Mat mat(mrawpics[index].height(),mrawpics[index].width(),mrawpics[index].mattype());
  400. if(mrawpics[index].type() == 1)
  401. memcpy(mat.data,mrawpics[index].picdata().data(),mat.rows*mat.cols*mat.elemSize());
  402. else
  403. {
  404. qDebug("save jpg");
  405. std::vector<unsigned char> buff(mrawpics[index].picdata().data(),mrawpics[index].picdata().data()+mrawpics[index].picdata().size());
  406. mat = cv::imdecode(buff,1);//mat = cv::imdecode(buff,CV_LOAD_IMAGE_COLOR);
  407. }
  408. cv::imwrite(strpath.toStdString(),mat);
  409. mMutex.unlock();
  410. }
  411. void MainWindow::onSelectCamera(int index)
  412. {
  413. mCurCameraIndex = index;
  414. }