CustomFrame.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. from PyQt5.QtWidgets import QTabWidget,QSplitter, QLineEdit,QCheckBox,QLabel,QFrame,QPushButton,QMenu,QAction
  2. from PyQt5.QtGui import QPixmap,QImage,QPainter,QResizeEvent,QCloseEvent,QPaintEvent,QFont
  3. from PyQt5.QtCore import QSize,QTimer,QRect,Qt
  4. import numpy as np
  5. import def_pb2 as pb
  6. from concurrent.futures import ThreadPoolExecutor, as_completed, wait
  7. import GrpcClient as rpc
  8. from PCViewer import PCLViewer
  9. class ControlFrame(QFrame):
  10. def __init__(self):
  11. QFrame.__init__(self)
  12. self.threadPool_ = ThreadPoolExecutor(5)
  13. self.setGeometry(0, 0, 500, 500)
  14. self.InitUI()
  15. self.setFrameShape(self.StyledPanel)
  16. #self.timer_ = QTimer()
  17. #self.timer_.timeout.connect(self.Update)
  18. #self.timer_.start(100)
  19. def DisplayMeasureInfo(self,info : pb.MeasureInfo):
  20. self.ErrorInfo.setText(info.error)
  21. def OnAction(self,dtype,id):
  22. client=rpc.GrpcStream()
  23. ip=self.IPEdit.text()
  24. port=int(self.PortEdit.text())
  25. if dtype==1:
  26. self.threadPool_.submit(client.GrabImage,ip,port,id)
  27. if dtype==2:
  28. self.threadPool_.submit(client.GrabCloud,ip,port,id)
  29. def InitUI(self):
  30. self.begstatic = QLabel(self)
  31. self.begstatic.setText(" IP:")
  32. self.begstatic.setGeometry(20, 5, 80, 30)
  33. self.IPEdit = QLineEdit(self)
  34. self.IPEdit.setText("192.168.2.45")
  35. self.IPEdit.setGeometry(90, 5, 150, 30)
  36. self.endstatic = QLabel(self)
  37. self.endstatic.setText("Port:")
  38. self.endstatic.setGeometry(20, 50, 80, 30)
  39. self.PortEdit = QLineEdit(self)
  40. self.PortEdit.setText("9876")
  41. self.PortEdit.setGeometry(90, 50, 150, 30)
  42. self.btnGrab = QPushButton(self)
  43. self.btnGrab.setGeometry(20, 140, 100, 40)
  44. self.btnGrab.setText("抓取图像")
  45. self.btnGrab.clicked.connect(self.btnGrabImageClick)
  46. self.btnCancel = QPushButton(self)
  47. self.btnCancel.setGeometry(150, 140, 100, 40)
  48. self.btnCancel.setText("抓取点云")
  49. self.btnCancel.clicked.connect(self.btnGrabCloudClick)
  50. self.btnImageStreamCheck = QCheckBox("实时图像", self)
  51. self.btnImageStreamCheck.setGeometry(20, 90, 120, 40)
  52. self.btnImageStreamCheck.clicked.connect(self.RealTimeImagecb)
  53. self.btnDataStreamCheck = QCheckBox("实时结果打印", self)
  54. self.btnDataStreamCheck.setGeometry(150, 90, 120, 40)
  55. self.btnDataStreamCheck.clicked.connect(self.RealTimeDatacb)
  56. self.ErrorInfo = QLabel(self)
  57. self.ErrorInfo.setGeometry(20, 200, 250, 400)
  58. self.ErrorInfo.setWordWrap(True)
  59. self.ErrorInfo.setAlignment(Qt.AlignTop)
  60. def RealTimeDatacb(self):
  61. if self.btnDataStreamCheck.checkState()==Qt.Checked:
  62. client=rpc.GrpcStream()
  63. ip=self.IPEdit.text()
  64. port=int(self.PortEdit.text())
  65. self.threadPool_.submit(client.OpenDataStream,ip,port)
  66. else:
  67. client=rpc.GrpcStream()
  68. ip=self.IPEdit.text()
  69. port=int(self.PortEdit.text())
  70. self.threadPool_.submit(client.CloseDataStream,ip,port)
  71. def RealTimeImagecb(self):
  72. if self.btnImageStreamCheck.checkState()==Qt.Checked:
  73. self.btnGrab.setEnabled(False)
  74. client=rpc.GrpcStream()
  75. ip=self.IPEdit.text()
  76. port=int(self.PortEdit.text())
  77. self.threadPool_.submit(client.OpenImageStream,ip,port)
  78. else:
  79. self.btnGrab.setEnabled(True)
  80. client=rpc.GrpcStream()
  81. ip=self.IPEdit.text()
  82. port=int(self.PortEdit.text())
  83. self.threadPool_.submit(client.CloseImageStream,ip,port)
  84. def closeEvent(self, a0: QCloseEvent) -> None:
  85. if self.btnImageStreamCheck.checkState()==Qt.Checked:
  86. client=rpc.GrpcStream()
  87. ip=self.IPEdit.text()
  88. port=int(self.PortEdit.text())
  89. self.threadPool_.submit(client.CloseImageStream,ip,port)
  90. if self.btnDataStreamCheck.checkState()==Qt.Checked:
  91. client=rpc.GrpcStream()
  92. ip=self.IPEdit.text()
  93. port=int(self.PortEdit.text())
  94. self.threadPool_.submit(client.CloseDataStream,ip,port)
  95. self.threadPool_.shutdown(wait=False)
  96. rpc.GrpcStream().close()
  97. def btnGrabImageClick(self):
  98. if self.btnImageStreamCheck.checkState()==Qt.Checked:
  99. print(" 先关闭实时显示")
  100. else :
  101. client=rpc.GrpcStream()
  102. ip=self.IPEdit.text()
  103. port=int(self.PortEdit.text())
  104. self.threadPool_.submit(client.GrabImage,ip,port,0)
  105. def btnGrabCloudClick(self):
  106. client=rpc.GrpcStream()
  107. ip=self.IPEdit.text()
  108. port=int(self.PortEdit.text())
  109. for id in range(4):
  110. self.threadPool_.submit(client.GrabCloud,ip,port,id+1)
  111. def btnCancelClick(self):
  112. pass
  113. class ImageViewer(QLabel):
  114. def __init__(self,parent,OnAction,id):
  115. super(ImageViewer,self).__init__(parent=parent)
  116. self.OnAction=OnAction
  117. self.dtype=1
  118. self.id=id
  119. self.image=None
  120. self.show = False
  121. self.setStyleSheet("border-width:1px;border-style:solid;border-color:rgb(150,150,150)")
  122. self.timer=QTimer()
  123. self.timer.timeout.connect(self.OnTimer)
  124. def FlashImg(self,pixmap):
  125. self.image=pixmap
  126. if self.timer.isActive()==False:
  127. self.timer.start(500)
  128. def ShowImg(self,pixmap):
  129. self.timer.stop()
  130. self.show=True
  131. self.image=pixmap
  132. self.repaint()
  133. def updataData(self):
  134. self.OnAction(self.dtype,self.id)
  135. print("%d,%d"%(self.dtype,self.id))
  136. def contextMenuEvent(self, a0):
  137. menu=QMenu(self)
  138. updata_act=QAction("更新")
  139. updata_act.triggered.connect(self.updataData)
  140. menu.addAction(updata_act)
  141. ret=menu.exec_(a0.globalPos())
  142. def OnTimer(self):
  143. self.show=not self.show
  144. self.repaint()
  145. def paintEvent(self, a0: QPaintEvent) -> None:
  146. if self.show==True:
  147. if not self.image == None:
  148. w, h = self.size().width(),self.size().height()
  149. iw, ih = self.image.width(), self.image.height()
  150. painter=QPainter(self)
  151. painter.drawPixmap(QRect(0,0,w,h),self.image,QRect(0,0,iw,ih))
  152. class PointCLViwer(QSplitter):
  153. def __init__(self,OnAction,id):
  154. super(PointCLViwer, self).__init__()
  155. self.OnAction=OnAction
  156. self.dtype=2
  157. self.id=id
  158. self.InitUI()
  159. def InitUI(self):
  160. self.pclViewer=PCLViewer()
  161. self.addWidget(self.pclViewer)
  162. self.setStretchFactor(0,4)
  163. def save(self):
  164. print("save")
  165. def displayCloud(self,points:np.array):
  166. self.pclViewer.displayPCL(points)
  167. def resetViewer(self):
  168. self.pclViewer.resetViewer()
  169. def updataData(self):
  170. self.OnAction(self.dtype,self.id)
  171. def contextMenuEvent(self, a0):
  172. menu=QMenu(self)
  173. updata_act=QAction("更新点云")
  174. updata_act.triggered.connect(self.updataData)
  175. menu.addAction(updata_act)
  176. act=QAction("还原视野")
  177. act.triggered.connect(self.resetViewer)
  178. menu.addAction(act)
  179. actSave=QAction("保存")
  180. actSave.triggered.connect(self.save)
  181. menu.addAction(actSave)
  182. ret=menu.exec_(a0.globalPos())
  183. class ViewerFrame(QFrame):
  184. def __init__(self,OnAction):
  185. super(ViewerFrame, self).__init__()
  186. self.OnAction=OnAction
  187. self.InitUI()
  188. def InitUI(self):
  189. self.table1=QTabWidget(self)
  190. self.table2=QTabWidget(self)
  191. self.table3=QTabWidget(self)
  192. self.table4=QTabWidget(self)
  193. self.table1.setTabPosition(QTabWidget.TabPosition.North)
  194. self.table2.setTabPosition(QTabWidget.TabPosition.North)
  195. self.table3.setTabPosition(QTabWidget.TabPosition.North)
  196. self.table4.setTabPosition(QTabWidget.TabPosition.North)
  197. self.panel1=ImageViewer(self,self.OnAction,1)
  198. self.panel2=ImageViewer(self,self.OnAction,2)
  199. self.panel3=ImageViewer(self,self.OnAction,3)
  200. self.panel4=ImageViewer(self,self.OnAction,4)
  201. self.pcViewer1=PointCLViwer(self.OnAction,1)
  202. self.pcViewer2=PointCLViwer(self.OnAction,2)
  203. self.pcViewer3=PointCLViwer(self.OnAction,3)
  204. self.pcViewer4=PointCLViwer(self.OnAction,4)
  205. self.table1.addTab(self.panel1,"图像")
  206. self.table1.addTab(self.pcViewer1,"点云")
  207. self.table2.addTab(self.panel2,"图像")
  208. self.table2.addTab(self.pcViewer2,"点云")
  209. self.table3.addTab(self.panel3,"图像")
  210. self.table3.addTab(self.pcViewer3,"点云")
  211. self.table4.addTab(self.panel4,"图像")
  212. self.table4.addTab(self.pcViewer4,"点云")
  213. def closeEvent(self, a0: QCloseEvent) -> None:
  214. pass
  215. def resizeEvent(self, a0: QResizeEvent) -> None:
  216. w, h = self.size().width(), self.size().height()
  217. w=w-15
  218. h=h-15
  219. self.table1.setGeometry(5, 5, w/2, h/2)
  220. self.table2.setGeometry(10+w/2, 5, w/2, h/2)
  221. self.table3.setGeometry(5, 10+h/2, w/2, h/2)
  222. self.table4.setGeometry(10+w/2, 10+h/2, w/2, h/2)
  223. def PbImg2QPix(self,image:pb.Image):
  224. img1=image
  225. w=img1.width
  226. h=img1.height
  227. c=img1.channel
  228. btarry=bytearray(img1.data)
  229. npdata = np.frombuffer(btarry, dtype=np.uint8)
  230. if c==3:
  231. npdata = npdata.reshape([h,w,c])
  232. qimg=QImage(npdata.data,w,h,QImage.Format_RGB888)
  233. if c==1:
  234. npdata = npdata.reshape([h,w])
  235. qimg=QImage(npdata.data,w,h,QImage.Format_Grayscale8)
  236. pix=QPixmap(qimg)
  237. return pix
  238. def PbCloud2Pts(self,cloud:pb.PointCloud):
  239. size=cloud.size
  240. btarry=bytearray(cloud.data)
  241. npdata = np.frombuffer(btarry, dtype=np.short)
  242. points= npdata.reshape([size,4])/32750.0 *5.0
  243. return points
  244. def DisplayFrame(self,frame : pb.ResFrame):
  245. if frame.HasField("images"):
  246. self.DisplayImage(frame.images)
  247. if frame.HasField("clouds"):
  248. self.DisplayCloud(frame.clouds)
  249. def DisplayImage(self,images:pb.ResImage):
  250. if images.HasField("img1"):
  251. self.panel1.ShowImg(self.PbImg2QPix(images.img1))
  252. if images.HasField("img2"):
  253. self.panel2.ShowImg(self.PbImg2QPix(images.img2))
  254. if images.HasField("img3"):
  255. self.panel3.ShowImg(self.PbImg2QPix(images.img3))
  256. if images.HasField("img4"):
  257. self.panel4.ShowImg(self.PbImg2QPix(images.img4))
  258. def DisplayCloud(self,clouds:pb.ResCloud):
  259. if clouds.HasField("cloud1"):
  260. self.pcViewer1.displayCloud(self.PbCloud2Pts(clouds.cloud1))
  261. if clouds.HasField("cloud2"):
  262. self.pcViewer2.displayCloud(self.PbCloud2Pts(clouds.cloud2))
  263. if clouds.HasField("cloud3"):
  264. self.pcViewer3.displayCloud(self.PbCloud2Pts(clouds.cloud3))
  265. if clouds.HasField("cloud4"):
  266. self.pcViewer4.displayCloud(self.PbCloud2Pts(clouds.cloud4))