Skip to content

Instantly share code, notes, and snippets.

@pavloshargan
Last active March 9, 2019 20:39
Show Gist options
  • Select an option

  • Save pavloshargan/2ffb84a8bed8536e8f5c29474b75a907 to your computer and use it in GitHub Desktop.

Select an option

Save pavloshargan/2ffb84a8bed8536e8f5c29474b75a907 to your computer and use it in GitHub Desktop.
ImageViewer.py
class Window(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.bg = QFrame(self)
self.bg.setGeometry(10, 10, 800, 600)
self.setGeometry(10, 10, 800, 600)
self.pic = QLabel(self.bg)
self.pic.setBackgroundRole(QPalette.Base)
self.pic.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
self.pic.setScaledContents(True)
self.current_image_path = "/1.bmp"
self.image = QtGui.QImage()
self.cv2Image = cv2.imread(self.current_image_path, 0)
self.image = self.convertCv2ToQimage(self.cv2Image)
self.pic.setPixmap(QtGui.QPixmap.fromImage(self.image))
self.rubberband = QRubberBand(QRubberBand.Rectangle, self.pic)
self.setMouseTracking(True)
# Create new action
openAction = QAction(QIcon('open.png'), '&Open', self)
openAction.setShortcut('Ctrl+O')
openAction.setStatusTip('Open document')
openAction.triggered.connect(self.openCall)
self.scrollArea = QScrollArea()
self.scrollArea.setBackgroundRole(QPalette.Dark)
self.scrollArea.setWidget(self.bg)
self.setCentralWidget(self.scrollArea)
self.scaleFactor = 1.0
self.zoomInAct = QAction("Zoom &In (25%)", self, shortcut="Ctrl++",
enabled=True, triggered=self.zoomIn)
self.zoomOutAct = QAction("Zoom &Out (25%)", self, shortcut="Ctrl+-",
enabled=True, triggered=self.zoomOut)
self.normalSizeAct = QAction("&Normal Size", self, shortcut="Ctrl+S",
enabled=True, triggered=self.normalSize)
# Create menu bar and add action
menuBar = self.menuBar()
MenuItem = menuBar.addMenu('&File')
MenuItem.addAction(openAction)
MenuItem = menuBar.addMenu('&View')
MenuItem.addAction(self.zoomInAct)
MenuItem.addAction(self.zoomOutAct)
MenuItem.addAction(self.normalSizeAct)
def scaleImage(self, factor):
self.scaleFactor *= factor
self.pic.resize(self.scaleFactor * self.pic.pixmap().size())
self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)
self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)
self.zoomInAct.setEnabled(self.scaleFactor < 3.0)
self.zoomOutAct.setEnabled(self.scaleFactor > 0.333)
def adjustScrollBar(self, scrollBar, factor):
scrollBar.setValue(int(factor * scrollBar.value()
+ ((factor - 1) * scrollBar.pageStep()/2)))
def zoomIn(self):
self.scaleImage(1.25)
def zoomOut(self):
self.scaleImage(0.8)
def normalSize(self):
self.pic.adjustSize()
self.scaleFactor = 1.0
def mousePressEvent(self, event):
self.origin = self.pic.mapFromParent(event .pos())
self.rubberband.setGeometry(QtCore.QRect(self.origin, QtCore.QSize()))
self.rubberband.show()
# QtGui.QWidget.mousePressEvent(self, event)
def mouseMoveEvent(self, event):
if self.rubberband.isVisible():
# Control the Rubber within the imageViewer!!!
self.rubberband.setGeometry(QtCore.QRect(self.origin, event .pos()) & self.image.rect())
# QtGui.QWidget.mouseMoveEvent(self, event)
def convertQImageToMat(self, incomingImage):
''' Converts a QImage into an opencv MAT format '''
incomingImage = incomingImage.convertToFormat(4)
width = incomingImage.width()
height = incomingImage.height()
ptr = incomingImage.bits()
ptr.setsize(incomingImage.byteCount())
arr = np.array(ptr).reshape(height, width, 4) # Copies the data
return cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
def convertCv2ToQimage(self, cv2image):
print(cv2image.shape)
height, width = cv2image.shape
return QImage(cv2image.copy().data, width, height, width, QImage.Format_Grayscale8)
def cropImage(self, rect):
croppedImage = self.image.copy(rect)
return self.convertQImageToMat(croppedImage)
def mouseReleaseEvent(self, event):
if self.rubberband.isVisible():
self.rubberband.hide()
rect = self.rubberband.geometry()
if rect.width()>10 and rect.height()>10:
cv2.imshow('Numpy array', self.cropImage(rect))
self.cv2Image = self.cropImage(rect)
self.changeLabelPic(self.cv2Image)
def changeLabelPic(self,cv2Image):
self.image = self.convertCv2ToQimage(cv2Image)
self.pic.setPixmap(QtGui.QPixmap.fromImage(self.image))
def openCall(self):
dlg = QFileDialog()
# dlg.setFileMode(QFileDialog.AnyFile)
if dlg.exec_():
self.current_image_path = dlg.selectedFiles()[0]
self.setWindowTitle(self.current_image_path)
self.cv2Image = cv2.imread(self.current_image_path, 0)
self.changeLabelPic(self.cv2Image)
self.scaleFactor = 1.0
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment