PyQtでグラフを読み取れるアプリを作った。
グラフの画像をCtrl+Vでペーストし、その座標をクリックすると画素値からグラフの値を教えてくれる。
最初に右クリックで左下と右上の座標を教える必要がる。
なんでこんなんがいるかって、世の中紙でデータを保存する人がまだいるということである。
(OpenCVは使っていない)
グラフの画像をCtrl+Vでペーストし、その座標をクリックすると画素値からグラフの値を教えてくれる。
最初に右クリックで左下と右上の座標を教える必要がる。
なんでこんなんがいるかって、世の中紙でデータを保存する人がまだいるということである。
(OpenCVは使っていない)
from PyQt4 import QtGui, QtCore, QtCore import sys import cv2 import numpy as np def convert_array_to_qimg(cv_img): """ this is based on https://stackoverflow.com/questions/18676888/how-to-configure-color-when-convert-numpy-array-to-qimage """ height, width, bytesPerComponent = cv_img.shape bytesPerLine = bytesPerComponent * width; #cv2.cvtColor(cv_img, cv2.CV_BGR2RGB) return QtGui.QImage(cv_img.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888) class GraphCoordinate: def __init__(self): pass def setBottomPixelCoordinate(self, x1, y1): """ x1 and y1 are pixel """ self.x1 = x1 self.y1 = y1 def setBottomGraphCoordinate(self, X1, Y1): self.X1 = X1 self.Y1 = Y1 print "(X1, Y1) = (%.2f, %.2f)" % (self.X1, self.Y1) def setTopPixelCoordinate(self, x2, y2): self.x2 = x2 self.y2 = y2 def setTopGraphCoordinate(self, X2, Y2): self.X2 = X2 self.Y2 = Y2 print "(X2, Y2) = (%.2f, %.2f)" % (self.X2, self.Y2) def getGraphCoordinate(self, x, y): w = x - self.x1 h = self.y1 - y W = self.x2 - self.x1 H = self.y1 - self.y2 X = self.X1 + w * (self.X2 - self.X1) / float(W) Y = self.Y1 + h * (self.Y2 - self.Y1) / float(H) return X, Y class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.image_frame = QtGui.QLabel() fname = r"sample08.png" img = cv2.imread(fname) #img = QtGui.QImage(fname) qimg = convert_array_to_qimg(img) self.image_frame.setPixmap(QtGui.QPixmap.fromImage(qimg)) self.clip = QtGui.QApplication.clipboard() self.setCentralWidget(self.image_frame) self.move(30,30) self.counter = 0 self.coord = GraphCoordinate() def keyPressEvent(self, e): if (e.modifiers() & QtCore.Qt.ControlModifier): #selected = self.table.selectedRanges() if e.key() == QtCore.Qt.Key_V:#past qimg = self.clip.image() self.displayImage(qimg) elif e.key() == QtCore.Qt.Key_C: #copy pass def mousePressEvent(self, e): #print e.x(), e.y() if e.button() == QtCore.Qt.RightButton: if self.counter % 2 == 0: text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter X1, Y1 (comma separated):') X1, Y1 = [float(v) for v in text.split(',')] if ok: self.counter += 1 self.coord.setBottomPixelCoordinate(e.x(), e.y()) self.coord.setBottomGraphCoordinate(X1, Y1) else: text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter X2, Y2 (comma separated):') X2, Y2 = [float(v) for v in text.split(',')] if ok: self.coord.setTopPixelCoordinate(e.x(), e.y()) self.coord.setTopGraphCoordinate(X2, Y2) self.counter = 0 elif e.button() == QtCore.Qt.LeftButton: try: x, y = self.coord.getGraphCoordinate(e.x(), e.y()) print "%.5f %.5f" % (x, y) except AttributeError as e: print "please set the graph coordinate by right clicks." def displayImage(self, qimg): self.image_frame.setPixmap(QtGui.QPixmap.fromImage(qimg)) def main(args): app = QtGui.QApplication(sys.argv) form = MainWindow() form.show() sys.exit(app.exec_()) if __name__ == "__main__": main(sys.argv)