Kaynağa Gözat

图像流和结果流放在线程池刷新

339075217 1 yıl önce
ebeveyn
işleme
66ab9ffbe0
3 değiştirilmiş dosya ile 47 ekleme ve 74 silme
  1. 21 29
      Viewer/CustomFrame.py
  2. 26 23
      Viewer/GrpcClient.py
  3. 0 22
      Viewer/main.py

+ 21 - 29
Viewer/CustomFrame.py

@@ -8,7 +8,9 @@ import def_pb2 as pb
 from concurrent.futures import ThreadPoolExecutor, as_completed, wait
 import GrpcClient as rpc
 import vtk
-from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
+from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
+#from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
+
 import threading
 class ControlFrame(QFrame):
     def __init__(self):
@@ -131,17 +133,12 @@ class ImageViewer(QLabel):
         self.image=None
         self.show = False
         self.setStyleSheet("border-width:1px;border-style:solid;border-color:rgb(150,150,150)")
-        self.timer=QTimer()
-        self.timer.timeout.connect(self.OnTimer)
-    def FlashImg(self,pixmap):
-        self.image=pixmap
-        if self.timer.isActive()==False:
-            self.timer.start(500)
+
     def ShowImg(self,pixmap):
-        self.timer.stop()
         self.show=True
         self.image=pixmap
-        self.repaint()
+        self.update()
+
     def updataData(self):
         self.OnAction(self.dtype,self.id)
         print("%d,%d"%(self.dtype,self.id))
@@ -153,17 +150,12 @@ class ImageViewer(QLabel):
         menu.addAction(updata_act)
         ret=menu.exec_(a0.globalPos())
 
-    def OnTimer(self):
-        self.show=not self.show
-        self.repaint()
-
     def paintEvent(self, a0: QPaintEvent) -> None:
-        if self.show==True:
-            if not self.image == None:
-                w, h = self.size().width(),self.size().height()
-                iw, ih = self.image.width(), self.image.height()
-                painter=QPainter(self)
-                painter.drawPixmap(QRect(0,0,w,h),self.image,QRect(0,0,iw,ih))
+        if not self.image == None:
+            w, h = self.size().width(),self.size().height()
+            iw, ih = self.image.width(), self.image.height()
+            painter=QPainter(self)
+            painter.drawPixmap(QRect(0,0,w,h),self.image,QRect(0,0,iw,ih))
 
 
 class VtkPointCloud:
@@ -246,6 +238,10 @@ class VtkPointCloudCanvas(QWidget):
         self.show()
         self._iren.Initialize()
 
+    def close(self) -> bool:
+
+        print("  tk close")
+        self._point_cloud.clearPoints()
 
     def displayPCL(self,cloud:np.array):
         colors = vtk.vtkUnsignedCharArray()
@@ -255,15 +251,11 @@ class VtkPointCloudCanvas(QWidget):
         self._point_cloud.clearPoints()
         for point in cloud:
             self._point_cloud.addPoint(point)
-            if point[-1]>0.85:
-                colors.InsertNextTypedTuple((0,255,0))
-            else:
-                colors.InsertNextTypedTuple((255,255,255))
+            prob=point[-1]
+            colors.InsertNextTypedTuple((int(255*prob),int(255-prob*255),255-int(prob*255)))
         self._point_cloud.vtkPolyData.GetPointData().SetScalars(colors)
         self._vtk_widget.update()
-        #self._vtk_widget.GetRenderWindow().Render()
     def resetViewer(self):
-
         self.update()
 
 
@@ -284,10 +276,9 @@ class PointCLViwer(QSplitter):
         print(fileName2 ,ok2)
         with open(fileName2,"w+") as f:
             for point in self.pointCloud:
-                if point[3]>0.85:
-                    f.write("%f %f %f 0 255 0\n"%(point[0],point[1],point[2]))
-                else:
-                    f.write("%f %f %f 255 255 255\n"%(point[0],point[1],point[2]))
+                prob=point[3]
+                f.write("%f %f %f %d %d %d\n"%(point[0],point[1],point[2],int(255*prob),int(255-prob*255),255-int(prob*255)))
+
         print("Save Cloud to %s"%(fileName2))
 
     def displayCloud(self,points:np.array):
@@ -312,6 +303,7 @@ class PointCLViwer(QSplitter):
         menu.addAction(actSave)
         ret=menu.exec_(a0.globalPos())
 
+
 class ViewerFrame(QFrame):
     def __init__(self,OnAction):
         super(ViewerFrame, self).__init__()

+ 26 - 23
Viewer/GrpcClient.py

@@ -4,6 +4,7 @@ import grpc
 import def_pb2 as pb
 import def_pb2_grpc as mrpc
 import threading
+from concurrent.futures import ThreadPoolExecutor
 def singleton(cls):
     _instance = {}
 
@@ -16,6 +17,7 @@ def singleton(cls):
 class GrpcStream(threading.Thread):
     def __init__(self):
         threading.Thread.__init__(self)
+        self.threadpool=ThreadPoolExecutor(5)
         self.exit_=False
         self.features_=None
         self.measures_=None
@@ -77,34 +79,35 @@ class GrpcStream(threading.Thread):
         stub.CloseImageStream(cmd)
 
     def loopImageStream(self):
-        if self.features_ is not None:
-            try:
-                for feature in self.features_:  #流式返回的结果
-                    if self.imagesCallBack is not None:
-                        self.imagesCallBack(feature)
-                    break
-            except Exception as e:
-                self.features_=None
+        while self.exit_ == False:
+            time.sleep(0.001)
+            if self.features_ is not None:
+                try:
+                    for feature in self.features_:  #流式返回的结果
+                        if self.imagesCallBack is not None:
+                            self.imagesCallBack(feature)
+                except Exception as e:
+                    self.features_=None
     def loopDataStream(self):
-        if self.measures_ is not None:
-            try:
-                for measure in self.measures_:
+        while self.exit_ == False:
+            time.sleep(0.001)
+            if self.measures_ is not None:
+                try:
+                    for measure in self.measures_:
+                        if self.MeasureDataCallBack is not None:
+                            self.MeasureDataCallBack(measure)
+                except Exception as e:
                     if self.MeasureDataCallBack is not None:
-                        self.MeasureDataCallBack(measure)
-                    break
-            except Exception as e:
-                if self.MeasureDataCallBack is not None:
-                    info=pb.MeasureInfo()
-                    info.error=str(e)
-                    self.MeasureDataCallBack(info)
-                self.measures_=None
+                        info=pb.MeasureInfo()
+                        info.error=str(e)
+                        self.MeasureDataCallBack(info)
+                    self.measures_=None
     def run(self):
-        while self.exit_==False:
-            time.sleep(0.001)
-            self.loopImageStream()
-            self.loopDataStream()
+        self.threadpool.submit(self.loopImageStream)
+        self.threadpool.submit(self.loopDataStream)
 
         print(" close ")
     def close(self):
         self.exit_=True
+        self.threadpool.shutdown()
         self.join()

+ 0 - 22
Viewer/main.py

@@ -1,22 +0,0 @@
-
-import sys
-from PyQt5.QtWidgets import QWidget, QApplication,QMainWindow,QLabel
-from PyQt5.QtCore import Qt
-import MainWnd as mw
-import GrpcClient as Stream
-
-ip='192.168.2.45'
-port=9876
-
-if __name__=="__main__":
-
-    app = QApplication(sys.argv)
-    win = mw.MainWindow()
-    win.show()
-
-    stream=Stream.GrpcStream()
-    stream.SetDataCallBack(win.OnImagesHandle,win.OnCloudHandle,win.OnMeasureDataHandle)
-    stream.start()
-    sys.exit(app.exec_())
-
-