class GLWidget(QGLWidget): GL_MULTISAMPLE = 0x809D rot = 0.0 lastMousePos = None maskCreated = pyqtSignal(np.ndarray) def __init__(self, parent): # OpenGL Widget setup f = QGLFormat() f.setSampleBuffers(True) f.setVersion(3,3) f.setProfile(QGLFormat.CoreProfile) QGLFormat.setDefaultFormat(f) if not QGLFormat.hasOpenGL(): QMessageBox.information(None, "OpenGL samplebuffers", "This system does not support OpenGL.") sys.exit(0) super(GLWidget, self).__init__(f, parent) self.setFocusPolicy(Qt.StrongFocus) self.list_ = [] self.width = 640.0 self.height = 480.0 self.startTimer(40) self.setWindowTitle("Sample Buffers") self.fov = 60.0 self.deltaTime = 0.0 self.lastFrame = None self.sketching = False self.sketchType = 0 self.sketchPoints = [] def initializeGL(self): GL.glClearColor(0.50, 0.50, 0.50, 1.0) #GL.glEnable(GL.GL_ALPHA_TEST) #GL.glAlphaFunc(GL.GL_NOTEQUAL, 0.0) self.heightMap = HeightMap('textures/atacama_height2.png') self.projection = QMatrix4x4() self.projection.perspective(self.fov, self.width / self.height, 0.01, 10000) self.cameraPos = QVector3D(0.0, 1.0, 1.0) self.terrainPos = QVector3D(0.0, 0.0, 0.0) self.roverPos = QVector3D(0.0, 0.0, 0.0) print(GL.glGetString(GL.GL_VERSION)) self.camera = Camera(self.cameraPos, self.heightMap) self.terrain = Terrain(self.terrainPos, self.heightMap) self.mask = np.zeros([1001,1001]) self.terrain.updateRewards(self.mask) # self.rover = Rover(roverPos) def resizeGL(self, w, h): self.width = float(w) self.height = float(h) GL.glViewport(0, 0, w, h) self.projection = QMatrix4x4() self.projection.perspective(self.fov, (self.width / self.height), 0.01, 10000) def setRoverPosition(self, x, y): self.camera.setPosition(x-500.5,y-500.5) def paintGL(self): currentFrame = QTime.currentTime() if (self.lastFrame): self.deltaTime = self.lastFrame.msecsTo(currentFrame) self.lastFrame = currentFrame else: self.lastFrame = currentFrame GL.glClearColor(0.90, 0.90, 0.90, 1.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) GL.glEnable(GL.GL_DEPTH_TEST) GL.glEnable(GL.GL_BLEND) GL.glEnable(GLWidget.GL_MULTISAMPLE) self.view = self.camera.getViewMatrix(self.roverPos) self.terrain.draw(self.projection, self.view) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) def mousePressEvent(self, event): viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) if(self.sketching): self.sketchPoints.append([event.x(), viewport[3] - event.y()]) else: self.lastMousePos = event.pos() print("clicked") cursorX = event.x() cursorY = event.y() winX = float(cursorX) winY = float(viewport[3] - cursorY) # obtain Z position winZ = GL.glReadPixels(winX, winY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT); winVector = QVector3D(winX, winY, winZ) print(winVector) def mouseMoveEvent(self, event): #print(event.pos()) #print(self.lastMousePos) if(True): print(event.pos()) viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) if(self.sketching): self.sketchPoints.append([event.x(), viewport[3] - event.y()]) #self.painter.drawPoint(event.pos()) print("Testing mouse move") elif(self.lastMousePos is not None): print(event.pos()) dx = event.x() - self.lastMousePos.x() dy = event.y() - self.lastMousePos.y() self.camera.processMouseMovement(dx,dy) self.lastMousePos = event.pos() elif(event.button() == Qt.MiddleButton): # Dont use this : doesnt work well with trackpads print("Middle") elif(event.button() == Qt.RightButton): print("Right") def mouseReleaseEvent(self, event): print("Mouse Released") if(self.sketching): # print(self.sketchPoints) self.createSketchMask() self.sketching = False def createSketchMask(self): # obtain Z position # pass pixels = [] viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) for point in self.sketchPoints: winZ = GL.glReadPixels(point[0], point[1], 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT); winVector = QVector3D(point[0], point[1], winZ) # print(winVector) object_coord = self.terrain.getObjectCoord(winVector, self.projection, self.view, viewport) j = round(1001 - 1001 * ((0.5 * object_coord[2]) + 0.5) ) i = round( 1001 * ((0.5 * object_coord[0]) + 0.5) ) pixels.append([i,j]) pixelsNP = np.array([pixels]) cv.drawContours(self.mask, pixelsNP, 0, [self.sketchType], -1) self.sketchPoints = [] self.terrain.updateRewards(self.mask) self.maskCreated.emit(self.mask) def wheelEvent(self, event): self.camera.scroll((event.angleDelta().y())) def keyPressEvent(self, event): if event.key() == Qt.Key_1: self.camera.setViewType(0) elif event.key() == Qt.Key_2: self.camera.setViewType(1) elif event.key() == Qt.Key_3: self.camera.setViewType(2) elif event.key() == Qt.Key_4: self.sketching = True self.sketchType = -1 elif event.key() == Qt.Key_5: self.sketching = True self.sketchType = 0 elif event.key() == Qt.Key_6: self.sketching = True self.sketchType = 1 elif event.key() == Qt.Key_W: self.camera.processKeyboard('F', self.deltaTime) elif event.key() == Qt.Key_S: self.camera.processKeyboard('B', self.deltaTime) elif event.key() == Qt.Key_A: self.camera.processKeyboard('L', self.deltaTime) elif event.key() == Qt.Key_D: self.camera.processKeyboard('R', self.deltaTime) def timerEvent(self, event): self.update() def setRewards(self, mask): self.learnedRewards = mask self.terrain.updatelearnedRewards(self.learnedRewards) def setPath(self, mask): self.pathMask = mask self.terrain.updatePaths(self.pathMask)
class GLWidget(QGLWidget): GL_MULTISAMPLE = 0x809D rot = 0.0 lastMousePos = None maskCreated = pyqtSignal(np.ndarray) def __init__(self, parent): # OpenGL Widget setup f = QGLFormat() f.setSampleBuffers(True) f.setVersion(3, 3) f.setProfile(QGLFormat.CoreProfile) QGLFormat.setDefaultFormat(f) if not QGLFormat.hasOpenGL(): QMessageBox.information(None, "OpenGL samplebuffers", "This system does not support OpenGL.") sys.exit(0) super(GLWidget, self).__init__(f, parent) self.setFocusPolicy(Qt.StrongFocus) self.list_ = [] self.width = 640.0 self.height = 480.0 self.startTimer(40) self.setWindowTitle("Sample Buffers") self.fov = 60.0 self.deltaTime = 0.0 self.lastFrame = None self.sketching = False self.sketchType = 0 self.sketchPoints = [] # RoverCAM State Variables self.captureMode = False self.captured = False def initializeGL(self): GL.glClearColor(0.50, 0.50, 0.50, 1.0) self.mode = 2 self.xN = 200 self.yN = 200 self.yawN = 0 self.pathX = np.linspace(450, 550, 100) self.pathNode = 0 self.renderMode = 0 self.heightMap = HeightMap('textures/atacama_height2.png') self.projection = QMatrix4x4() self.projection.perspective(self.fov, self.width / self.height, 0.01, 10000) self.cameraPos = QVector3D(0.0, 1.0, 1.0) self.terrainPos = QVector3D(0.0, 0.0, 0.0) self.roverPos = QVector3D(0.0, 0.0, 0.0) print(GL.glGetString(GL.GL_VERSION)) self.camera = Camera(self.cameraPos, self.heightMap) self.camera.setProjection(self.fov, self.width, self.height, 0.01, 1000) self.roverCamera = Camera(self.cameraPos, self.heightMap) self.roverCamera.setProjection(self.fov, self.width, self.height, 0.01, 1000) self.terrain = Terrain(self.terrainPos, self.heightMap) self.mask = np.zeros([1001, 1001]) self.terrain.updateRewards(self.mask) # set up frame buffer self.fbo = GL.glGenFramebuffers(1) GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo) # Attachments for frame buffer : Texture self.Frametexture = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, self.Frametexture) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, 640, 480, 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, None) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, self.Frametexture, 0) self.rbo = GL.glGenRenderbuffers(1) GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.rbo) GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH24_STENCIL8, 640, 480) GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0) GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_STENCIL_ATTACHMENT, GL.GL_RENDERBUFFER, self.rbo) if (GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE): print("Framebuffer not complete") GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0) GL.glBindTexture(GL.GL_TEXTURE_2D, 0) # self.rover = Rover(roverPos) def resizeGL(self, w, h): self.width = float(w) self.height = float(h) GL.glViewport(0, 0, w, h) self.projection = QMatrix4x4() self.projection.perspective(self.fov, (self.width / self.height), 0.01, 10000) self.camera.setProjection(self.fov, self.width, self.height, 0.01, 1000) def paintGL(self): if self.mode == 0: self.simplePaint() elif self.mode == 1: self.saveat() self.mode = 0 elif self.mode == 2: self.createDataset() elif self.mode == 3: self.renderMode = 1 self.createDataset() def simplePaint(self): GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0) currentFrame = QTime.currentTime() if (self.lastFrame): self.deltaTime = self.lastFrame.msecsTo(currentFrame) self.lastFrame = currentFrame else: self.lastFrame = currentFrame GL.glClearColor(0.90, 0.90, 0.90, 1.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) GL.glEnable(GL.GL_DEPTH_TEST) GL.glEnable(GLWidget.GL_MULTISAMPLE) self.terrain.draw(self.camera, self.renderMode) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) def saveat(self): image = self.setCameraPosition(self.pathX[self.pathNode], ((2 * self.pathX[self.pathNode]) - 345), 0, -20) self.pathNode = self.pathNode + 1 if self.pathNode > 99: self.pathNode = 0 def createDataset(self): image = self.setCameraPosition(self.xN, self.yN, self.yawN, -20) imageName = "ima" + str(self.xN) + "_" + str(self.yN) + '_' + str( self.yawN) + ".jpeg" cv.imwrite('dataset/' + imageName, cv.flip(image, 0)) self.yN = self.yN + 1 if self.yN > 400: self.yN = 200 self.xN = self.xN + 1 if self.xN > 400: self.xN = 200 self.mode = 0 self.yawN = self.yawN + 45 def setCameraPosition(self, x, y, yaw, pitch): self.roverCamera.setPosition(x - 500.5, y - 500.5) self.roverCamera.setYaw(yaw) self.roverCamera.setPitch(pitch) GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo) GL.glClearColor(0.52, 0.80, 0.92, 1.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) GL.glEnable(GL.GL_DEPTH_TEST) GL.glEnable(GLWidget.GL_MULTISAMPLE) self.terrain.draw(self.roverCamera, self.renderMode) GL.glBindTexture(GL.GL_TEXTURE_2D, self.Frametexture) abc = GL.glGetTexImage(GL.GL_TEXTURE_2D, 0, GL.GL_BGR, GL.GL_UNSIGNED_BYTE) # self.cde = int.from_bytes(self.abc, byteorder='big') image = np.reshape(np.fromstring(abc, dtype=np.uint8), (480, 640, 3)) # cv.imwrite('framebuffer.jpeg', cv.flip(self.image, 0)) return image def mousePressEvent(self, event): self.mode = 1 viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) # self.createDataset() if (self.sketching): self.sketchPoints.append([event.x(), viewport[3] - event.y()]) else: self.lastMousePos = event.pos() print("clicked") cursorX = event.x() cursorY = event.y() winX = float(cursorX) winY = float(viewport[3] - cursorY) # obtain Z position winZ = GL.glReadPixels(winX, winY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT) winVector = QVector3D(winX, winY, winZ) print(winVector) self.paintGL() def mouseMoveEvent(self, event): # print(event.pos()) if (event.button() == Qt.LeftButton): viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) if (self.sketching): self.sketchPoints.append([event.x(), viewport[3] - event.y()]) # self.painter.drawPoint(event.pos()) elif (self.lastMousePos is not None): dx = event.x() - self.lastMousePos.x() dy = event.y() - self.lastMousePos.y() self.camera.processMouseMovement(dx, dy) self.lastMousePos = event.pos() elif (event.button() == Qt.MiddleButton): # Dont use this : doesnt work well with trackpads print("Middle") elif (event.button() == Qt.RightButton): print("Right") def mouseReleaseEvent(self, event): print("Mouse Released") if (self.sketching): # print(self.sketchPoints) self.createSketchMask() self.sketching = False def createSketchMask(self): # obtain Z position # pass pixels = [] viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT)) for point in self.sketchPoints: winZ = GL.glReadPixels(point[0], point[1], 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT) winVector = QVector3D(point[0], point[1], winZ) # print(winVector) object_coord = self.terrain.getObjectCoord(winVector, self.projection, self.view, viewport) j = round(1001 - 1001 * ((0.5 * object_coord[2]) + 0.5)) i = round(1001 * ((0.5 * object_coord[0]) + 0.5)) pixels.append([i, j]) pixelsNP = np.array([pixels]) cv.drawContours(self.mask, pixelsNP, 0, [self.sketchType], -1) self.sketchPoints = [] self.terrain.updateRewards(self.mask) self.maskCreated.emit(self.mask) def wheelEvent(self, event): self.camera.scroll((event.angleDelta().y())) def keyPressEvent(self, event): if event.key() == Qt.Key_1: self.camera.setViewType(0) elif event.key() == Qt.Key_2: self.camera.setViewType(1) elif event.key() == Qt.Key_3: self.camera.setViewType(2) elif event.key() == Qt.Key_4: self.sketching = True self.sketchType = -1 elif event.key() == Qt.Key_5: self.sketching = True self.sketchType = 0 elif event.key() == Qt.Key_6: self.sketching = True self.sketchType = 1 elif event.key() == Qt.Key_G: self.renderMode = 1 elif event.key() == Qt.Key_H: self.renderMode = 0 elif event.key() == Qt.Key_W: self.camera.processKeyboard('F', self.deltaTime) elif event.key() == Qt.Key_S: self.camera.processKeyboard('B', self.deltaTime) elif event.key() == Qt.Key_A: self.camera.processKeyboard('L', self.deltaTime) elif event.key() == Qt.Key_D: self.camera.processKeyboard('R', self.deltaTime) def timerEvent(self, event): self.update() def setRewards(self, mask): self.learnedRewards = mask self.terrain.updatelearnedRewards(self.learnedRewards) def setPath(self, mask): self.pathMask = mask self.terrain.updatePaths(self.pathMask)