diff --git a/src/python/0.jpg b/src/python/0.jpg new file mode 100644 index 0000000..d1de1d8 Binary files /dev/null and b/src/python/0.jpg differ diff --git a/src/python/pyuic5.bat b/src/python/pyuic5.bat new file mode 100644 index 0000000..4606b87 --- /dev/null +++ b/src/python/pyuic5.bat @@ -0,0 +1 @@ +@"C:\Users\jeevan\AppData\Local\Programs\Python\Python35-32\python" -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/src/python/slide_scanner_gui.py b/src/python/slide_scanner_gui.py new file mode 100644 index 0000000..a45dee3 --- /dev/null +++ b/src/python/slide_scanner_gui.py @@ -0,0 +1,399 @@ +from PyQt5 import QtCore,QtGui,QtWidgets +import sys +import slide_scanner_test +import numpy as np +import cv2 +import threading, time +from ximea import xiapi +import toQImage, PIL.Image +import serial + + +class gui(QtWidgets.QMainWindow,slide_scanner_test.Ui_MainWindow): + def __init__(self,parent=None): + super(gui,self).__init__(parent) + self.setupUi(self) + self.connectActions() + def main(self): + self.logoView.setPixmap(QtGui.QPixmap("0.jpg").scaled(50,50)) + self.cam = xiapi.Camera() + self.cam.open_device() + self.cam.set_exposure(2000) + self.cam.set_imgdataformat('XI_RGB24') + self.img = xiapi.Image() + self.cam.start_acquisition() + self.livePreview = threading.Thread(name='cam_initialization',target=self.openCam,args=()) + self.livePreview.start() + self.connect2arduino = threading.Thread(name='connect_arduino',target=self.connectArduino,args=()) + self.connect2arduino.start() + self.currxpos = 0; self.currypos = 0; self.currzpos = 0 + self.xFov = 1255; self.yFov = 1004; self.ymiddle = 40000;#round((12.5*self.yFov)/0.1596); + self.x0 = 0; self.x1 = 210000;#round((45*self.xFov)/0.1995); + self.y0 = 0; self.y1 = 80000;#round((12*self.yFov)/0.1596); + self.Zpulserate = 38400;self.Xpulserate = 38400;self.Ypulserate = 38400 + self._translate = QtCore.QCoreApplication.translate + self.show() + + def connectActions(self): + self.pushButton.clicked.connect(self.snapshot) + self.pushButton_2.clicked.connect(self.autoFocus) + self.pushButton_3.clicked.connect(self.xPlus) + self.pushButton_4.clicked.connect(self.yMinus) + self.pushButton_5.clicked.connect(self.yPlus) + self.pushButton_6.clicked.connect(self.xMinus) + self.pushButton_7.clicked.connect(self.zUp) + self.pushButton_8.clicked.connect(self.zDown) + self.pushButton_9.clicked.connect(lambda: self.gotoX(self.lineEdit.text())) + self.pushButton_10.clicked.connect(lambda: self.gotoY(self.lineEdit_3.text())) + self.pushButton_11.clicked.connect(lambda: self.gotoZ(self.lineEdit_2.text())) + self.pushButton_12.clicked.connect(lambda: self.setExposure(self.lineEdit_4.text())) + self.pushButton_13.clicked.connect(self.test) + self.pushButton_17.clicked.connect(self.bloodsmear) + self.pushButton_18.clicked.connect(self.resetOrigin) + + def openCam(self): + while True: + self.cam.get_image(self.img) + self.data = self.img.get_image_data_numpy(invert_rgb_order=True) + self.pixmap = QtGui.QPixmap.fromImage(toQImage.toQImage(self.data)) + self.slideImageView.setPixmap(self.pixmap.scaled(680,520)) + + def connectArduino(self): + self.ser = serial.Serial('COM3',57600) + #self.ser.open() + + def setExposure(self, value): + self.cam.set_exposure(int(value)) + + def resetOrigin(self): + self.currxpos = 0 + self.currypos = 0 + self.currzpos = 0 + self.ser.write(b'X') + self.label_13.setText(self._translate("MainWindow", str(self.currxpos))) + self.label_14.setText(self._translate("MainWindow", str(self.currypos))) + self.label_15.setText(self._translate("MainWindow", str(self.currzpos))) + def snapshot(self): + snapshot = PIL.Image.fromarray(self.data,'RGB') + snapshot.save('snap.jpg') + + def autoFocus(self): + ts_start = time.time() + # Crude Auto-Focus + Z_travel_for_crude = 16000; crude_step_count = 500; + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_max_var=0; crude_loc_max_var=0; + crude_start_loc = self.currzpos -(Z_travel_for_crude/2); + self.gotoZ(crude_start_loc); + crude_curr_loc = crude_start_loc; + kernel = np.ones((5,5),np.float32)/9 + for i in range(int(crude_pulse_count)): + snapshot = self.data + crude_curr_var = np.var(cv2.filter2D(snapshot,-1,kernel)) + print(crude_curr_var,'||',self.currzpos) + if crude_curr_var > crude_max_var: + crude_max_var = crude_curr_var + crude_loc_max_var = crude_curr_loc + crude_curr_loc = crude_curr_loc + crude_step_count + self.gotoZ(crude_curr_loc) + time.sleep(0.175) + self.gotoZ(crude_loc_max_var) + # Fine-crude AF + Z_travel_for_crude = 1000; crude_step_count = 50; + crude_loc_max_var = 0; crude_max_var = 0 + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_start_loc = self.currzpos - (Z_travel_for_crude/2); + self.gotoZ(crude_start_loc); + crude_curr_loc = crude_start_loc; + for i in range(int(crude_pulse_count)): + snapshot = self.data + crude_curr_var = np.var(cv2.filter2D(snapshot,-1,kernel)) + print(crude_curr_var,'||',self.currzpos) + if crude_curr_var > crude_max_var: + crude_max_var = crude_curr_var + crude_loc_max_var = crude_curr_loc + crude_curr_loc = crude_curr_loc + crude_step_count + self.gotoZ(crude_curr_loc) + time.sleep(0.075) + self.gotoZ(crude_loc_max_var) + # Fine AF + Z_travel_for_crude = 120; crude_step_count = 5; + crude_loc_max_var = 0;crude_max_var = 0 + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_start_loc = self.currzpos - (Z_travel_for_crude/2); + self.gotoZ(crude_start_loc); + crude_curr_loc = crude_start_loc; + for i in range(int(crude_pulse_count)): + snapshot = self.data + crude_curr_var = np.var(snapshot) + print(crude_curr_var,'||',self.currzpos) + if crude_curr_var > crude_max_var: + crude_max_var = crude_curr_var + crude_loc_max_var = crude_curr_loc + crude_curr_loc = crude_curr_loc + crude_step_count + self.gotoZ(crude_curr_loc) + time.sleep(0.025) + self.gotoZ(crude_loc_max_var) + ts_stop = time.time() + print('time taken for autofocusing:'+str(ts_stop-ts_start)+' secs') + + def parameter(self): + image = self.data + img = cv2.medianBlur(image,5) + cimg = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + circles = cv2.HoughCircles(cimg,cv2.HOUGH_GRADIENT,1,35,param1=50,param2=30,minRadius=10,maxRadius=45) + area = 0 + try: + circles = np.uint16(np.around(circles));#print('No.of Circles:',len(circles[0,:])) + for i in circles[0,:]: + # Total area + area = area + (3.1415 * i[2] * i[2]) + except: + print("No circles detected") + ret,im_th = cv2.threshold(cimg,np.average(cimg),255,cv2.THRESH_BINARY_INV) + foreground_area = np.count_nonzero(im_th) + param = area/foreground_area + if(param == 0): + return (foreground_area/(1280*1024)) + return param + + def focus(self,travel,step_count): + ts_start = time.time() + # FineCrude + Z_travel_for_crude = travel; crude_step_count = step_count; + crude_loc_max_var = 0; crude_max_var = 0 + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_start_loc = self.currzpos - (Z_travel_for_crude/2); + self.gotoZ(crude_start_loc); + crude_curr_loc = crude_start_loc; + kernel = np.ones((5,5),np.float32)/9 + for i in range(int(crude_pulse_count)): + snapshot = self.data + crude_curr_var = np.var(cv2.filter2D(snapshot,-1,kernel)) + #print(crude_curr_var,'||',self.currzpos) + if crude_curr_var > crude_max_var: + crude_max_var = crude_curr_var + crude_loc_max_var = crude_curr_loc + crude_curr_loc = crude_curr_loc + crude_step_count + self.gotoZ(crude_curr_loc) + time.sleep(0.075) + self.gotoZ(crude_loc_max_var) + # Fine AF + Z_travel_for_crude = step_count*2; crude_step_count = 3; + crude_loc_max_var = 0;crude_max_var = 0 + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_start_loc = self.currzpos - (Z_travel_for_crude/2); + self.gotoZ(crude_start_loc); + crude_curr_loc = crude_start_loc; + for i in range(int(crude_pulse_count)): + snapshot = self.data + crude_curr_var = np.var(snapshot) + #print(crude_curr_var,'||',self.currzpos) + if crude_curr_var > crude_max_var: + crude_max_var = crude_curr_var + crude_loc_max_var = crude_curr_loc + crude_curr_loc = crude_curr_loc + crude_step_count + self.gotoZ(crude_curr_loc) + time.sleep(0.025) + self.gotoZ(crude_loc_max_var) + ts_stop = time.time() + print('time taken for autofocusing:'+str(ts_stop-ts_start)+' secs') + + #def focalstack(self,travel): + + + + def xMinus(self): + self.ser.write(b'D') + self.currxpos = self.currxpos - self.xFov + self.label_13.setText(self._translate("MainWindow", str(self.currxpos))) + def xPlus(self): + self.ser.write(b'A') + self.currxpos = self.currxpos + self.xFov + self.label_13.setText(self._translate("MainWindow", str(self.currxpos))) + def yMinus(self): + self.ser.write(b'S') + self.currypos = self.currypos - self.yFov + self.label_14.setText(self._translate("MainWindow", str(self.currypos))) + def yPlus(self): + self.ser.write(b'W') + self.currypos = self.currypos + self.yFov + self.label_14.setText(self._translate("MainWindow", str(self.currypos))) + def zDown(self): + self.ser.write(b'G') + self.currzpos = self.currzpos - 1 + self.label_15.setText(self._translate("MainWindow", str(self.currzpos))) + def zUp(self): + self.ser.write(b'T') + self.currzpos = self.currzpos + 1 + self.label_15.setText(self._translate("MainWindow", str(self.currzpos))) + def gotoX(self, xValue): + xValue = int(xValue) + if self.currxpos != xValue: + xValue_str = '#' + str("%($)07d" % {"$":xValue}) + self.ser.write(b'B') + self.ser.write(xValue_str.encode()) + time.sleep(abs(self.currxpos-xValue)/self.Xpulserate) + self.currxpos = int(xValue) + self.label_13.setText(self._translate("MainWindow", str(self.currxpos))) + def gotoY(self, yValue): + yValue = int(yValue) + if self.currypos != yValue: + yValue_str = '#' + str("%($)07d" % {"$":yValue}) + self.ser.write(b'N') + self.ser.write(yValue_str.encode()) + time.sleep(abs(self.currypos-yValue)/self.Ypulserate) + self.currypos = int(yValue) + self.label_14.setText(self._translate("MainWindow", str(self.currypos))) + def gotoZ(self, zValue): + zValue = int(zValue) + if self.currzpos != zValue: + zValue_str = '#' + str("%($)07d" % {"$":zValue}) + self.ser.write(b'M') + self.ser.write(zValue_str.encode()) + time.sleep(abs(self.currzpos-zValue)/self.Zpulserate) + self.currzpos = int(zValue) + self.label_15.setText(self._translate("MainWindow", str(self.currzpos))) + + def bloodsmear(self): + self.gotoX('0') + self.gotoY('0') + self.gotoZ('0') + self.gotoY(self.ymiddle);time.sleep(2); + self.autoFocus() + Zval = []; param_y0 = []; Xpos = []; + xstep = round((self.x1-self.x0)/11); + for xpos in range(self.x0,self.x1,xstep): + self.gotoX(xpos) + self.focus(2000,50) + Zval.append(self.currzpos) + Xpos.append(self.currxpos) + snap = self.data + snapshot = PIL.Image.fromarray(snap,'RGB') + snapshot.save('snap@'+str(xpos)+'.jpg') + param_y0.append(self.parameter()) + print(np.asarray(param_y0)) + index = np.argmax((param_y0)) + xbest = Xpos[index] + self.gotoX(Xpos[index]) + self.gotoZ(Zval[index]);time.sleep(2); + param_y1 = [];Xpos = []; Zval = []; + if(xbest<=xstep): + for xpos in range(xbest,xbest+xstep*2,12581): + self.gotoX(xpos) + self.focus(500,50) + Zval.append(self.currzpos) + Xpos.append(self.currxpos) + snap = self.data + snapshot = PIL.Image.fromarray(snap,'RGB') + snapshot.save('snap@'+str(xpos)+'.jpg') + param_y1.append(self.parameter()) + elif(xbest>self.x1): + for xpos in range(xbest-xstep*2,xbest,12581): + self.gotoX(xpos) + self.focus(500,50) + Zval.append(self.currzpos) + Xpos.append(self.currxpos) + snap = self.data + snapshot = PIL.Image.fromarray(snap,'RGB') + snapshot.save('snap@'+str(xpos)+'.jpg') + param_y1.append(self.parameter()) + else: + for xpos in range(xbest-xstep,xbest+xstep,12581): + self.gotoX(xpos) + self.focus(500,50) + Zval.append(self.currzpos) + Xpos.append(self.currxpos) + snap = self.data + snapshot = PIL.Image.fromarray(snap,'RGB') + snapshot.save('snap@'+str(xpos)+'.jpg') + param_y1.append(self.parameter()) + index = np.argmax(np.asarray(param_y1)) + param = np.where(np.asarray(param_y1),1,0) + self.gotoY(0) + if(np.sum(param[1:4]) == 3): + x1 = Xpos[1]; + x2 = Xpos[3]; + self.gotoX(x1);self.focus(500,50);self.ser.write(b'R') + self.gotoX(x2);self.focus(500,50);self.ser.write(b'E') + self.gotoY(self.y1);self.focus(500,50);self.ser.write(b'Y') + xA = x1; xB = x2; + yC = self.y1; yB = 0; + numofX = round((xB-xA)/self.xFov); + numofY = round((yC-yB)/self.yFov); + self.ser.write(b'Z') + while(self.ser.read() != 'S'): + print('.') + + rowcount = 0; + filecount = 0; + print('Starting Image Capture...') + while(rowcount <= numofY): + while(filecount <= numofX): + snap = PIL.Image.fromarray(self.data,'RGB') + snapshot.save('Image_'+str(rowcount)+'_'+str(filecount)+'.jpg') + filecount = filecount + 1 + filecount = 0 + rowcount = rowcount + 1 + elif(np.sum(param[0:3] > np.sum(param[2:5]))): + x1 = Xpos[0]; + x2 = Xpos[2]; + self.gotoX(x1);self.focus(500,50);self.ser.write(b'R') + self.gotoX(x2);self.focus(500,50);self.ser.write(b'E') + self.gotoY(self.y1);self.focus(500,50);self.ser.write(b'Y') + xA = x1; xB = x2; + yC = self.y1; yB = 0; + numofX = round((xB-xA)/self.xFov); + numofY = round((yC-yB)/self.yFov); + self.ser.write(b'Z') + while(self.ser.read() != 'S'): + print('.') + rowcount = 0; + filecount = 0; + print('Starting Image Capture...') + while(rowcount <= numofY): + while(filecount <= numofX): + snap = PIL.Image.fromarray(self.data,'RGB') + snapshot.save('Image_'+str(rowcount)+'_'+str(filecount)+'.jpg') + filecount = filecount + 1 + filecount = 0 + rowcount = rowcount + 1 + elif(np.sum(param[0:3] < np.sum(param[2:5]))): + x1 = Xpos[2]; + x2 = Xpos[4]; + self.gotoX(x1);self.focus(500,50);self.ser.write(b'R') + self.gotoX(x2);self.focus(500,50);self.ser.write(b'E') + self.gotoY(self.y1);self.focus(500,50);self.ser.write(b'Y') + xA = x1; xB = x2; + yC = self.y1; yB = 0; + numofX = round((xB-xA)/self.xFov); + numofY = round((yC-yB)/self.yFov); + self.ser.write(b'Z') + while(self.ser.read() != 'S'): + print('.') + + rowcount = 0; + filecount = 0; + print('Starting Image Capture...') + while(rowcount <= numofY): + while(filecount <= numofX): + snap = PIL.Image.fromarray(self.data,'RGB') + snapshot.save('Image_'+str(rowcount)+'_'+str(filecount)+'.jpg') + filecount = filecount + 1 + filecount = 0 + rowcount = rowcount + 1 + else: + print('No Best region detected!') + self.resetOrigin() + + def test(self): + #var = round(np.var(self.data)) + #self.label_8.setText(self._translate("MainWindow", str(var))) + self.focus(500,50) + + +if __name__ == '__main__' : + app = QtWidgets.QApplication(sys.argv) + x = gui() + x.main() + sys.exit(app.exec_()) diff --git a/src/python/slide_scanner_test.py b/src/python/slide_scanner_test.py new file mode 100644 index 0000000..d7d4f29 --- /dev/null +++ b/src/python/slide_scanner_test.py @@ -0,0 +1,419 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'slide_scanner_test.ui' +# +# Created by: PyQt5 UI code generator 5.6 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.setWindowModality(QtCore.Qt.WindowModal) + MainWindow.resize(1024, 768) + font = QtGui.QFont() + font.setPointSize(8) + MainWindow.setFont(font) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("F:/IITT_Logo/0.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + MainWindow.setWindowIcon(icon) + MainWindow.setAutoFillBackground(False) + MainWindow.setStyleSheet("background-color: rgb(90, 90, 90);") + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.logoView = QtWidgets.QLabel(self.centralwidget) + self.logoView.setGeometry(QtCore.QRect(20, 20, 50, 50)) + self.logoView.setObjectName("logoView") + self.label = QtWidgets.QLabel(self.centralwidget) + self.label.setGeometry(QtCore.QRect(80, 20, 461, 51)) + font = QtGui.QFont() + font.setPointSize(24) + self.label.setFont(font) + self.label.setStyleSheet("color: rgb(255, 255, 255);") + self.label.setObjectName("label") + self.slideImageView = QtWidgets.QLabel(self.centralwidget) + self.slideImageView.setGeometry(QtCore.QRect(20, 180, 640, 512)) + self.slideImageView.setBaseSize(QtCore.QSize(640, 512)) + self.slideImageView.setStyleSheet("background-color: rgb(85, 255, 127);") + self.slideImageView.setObjectName("slideImageView") + self.label_2 = QtWidgets.QLabel(self.centralwidget) + self.label_2.setGeometry(QtCore.QRect(220, 150, 221, 31)) + font = QtGui.QFont() + font.setPointSize(18) + self.label_2.setFont(font) + self.label_2.setStyleSheet("color: rgb(255, 255, 255);") + self.label_2.setObjectName("label_2") + self.pushButton = QtWidgets.QPushButton(self.centralwidget) + self.pushButton.setEnabled(True) + self.pushButton.setGeometry(QtCore.QRect(680, 520, 141, 27)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) + self.pushButton.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton.setFont(font) + self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;\n" +"") + self.pushButton.setCheckable(False) + self.pushButton.setAutoDefault(False) + self.pushButton.setObjectName("pushButton") + self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_2.setGeometry(QtCore.QRect(870, 520, 141, 27)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth()) + self.pushButton_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_2.setFont(font) + self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_2.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_2.setObjectName("pushButton_2") + self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_3.setGeometry(QtCore.QRect(734, 300, 51, 23)) + self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_3.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_3.setObjectName("pushButton_3") + self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_4.setGeometry(QtCore.QRect(680, 330, 51, 23)) + self.pushButton_4.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_4.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_4.setCheckable(False) + self.pushButton_4.setAutoDefault(True) + self.pushButton_4.setObjectName("pushButton_4") + self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_5.setGeometry(QtCore.QRect(790, 330, 51, 23)) + self.pushButton_5.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_5.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_5.setObjectName("pushButton_5") + self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_6.setGeometry(QtCore.QRect(734, 360, 51, 23)) + self.pushButton_6.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_6.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_6.setObjectName("pushButton_6") + self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_7.setGeometry(QtCore.QRect(880, 300, 75, 23)) + self.pushButton_7.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_7.setAutoFillBackground(False) + self.pushButton_7.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_7.setObjectName("pushButton_7") + self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_8.setGeometry(QtCore.QRect(880, 360, 75, 23)) + self.pushButton_8.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_8.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_8.setObjectName("pushButton_8") + self.label_3 = QtWidgets.QLabel(self.centralwidget) + self.label_3.setGeometry(QtCore.QRect(680, 260, 181, 21)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth()) + self.label_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + self.label_3.setFont(font) + self.label_3.setStyleSheet("color: rgb(255, 255, 255);") + self.label_3.setObjectName("label_3") + self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit.setGeometry(QtCore.QRect(770, 420, 113, 20)) + self.lineEdit.setObjectName("lineEdit") + self.label_4 = QtWidgets.QLabel(self.centralwidget) + self.label_4.setGeometry(QtCore.QRect(690, 420, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_4.setFont(font) + self.label_4.setStyleSheet("color: rgb(255, 255, 255);") + self.label_4.setObjectName("label_4") + self.label_5 = QtWidgets.QLabel(self.centralwidget) + self.label_5.setGeometry(QtCore.QRect(690, 480, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_5.setFont(font) + self.label_5.setStyleSheet("color: rgb(255, 255, 255);") + self.label_5.setObjectName("label_5") + self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit_2.setGeometry(QtCore.QRect(770, 480, 113, 20)) + self.lineEdit_2.setObjectName("lineEdit_2") + self.label_6 = QtWidgets.QLabel(self.centralwidget) + self.label_6.setGeometry(QtCore.QRect(690, 450, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_6.setFont(font) + self.label_6.setStyleSheet("color: rgb(255, 255, 255);") + self.label_6.setObjectName("label_6") + self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit_3.setGeometry(QtCore.QRect(770, 450, 113, 20)) + self.lineEdit_3.setObjectName("lineEdit_3") + self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_9.setGeometry(QtCore.QRect(890, 420, 75, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_9.setFont(font) + self.pushButton_9.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_9.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_9.setObjectName("pushButton_9") + self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_10.setGeometry(QtCore.QRect(890, 450, 75, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_10.setFont(font) + self.pushButton_10.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_10.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_10.setObjectName("pushButton_10") + self.pushButton_11 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_11.setGeometry(QtCore.QRect(890, 480, 75, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_11.setFont(font) + self.pushButton_11.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_11.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_11.setObjectName("pushButton_11") + self.pushButton_12 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_12.setGeometry(QtCore.QRect(940, 220, 75, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_12.setFont(font) + self.pushButton_12.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_12.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_12.setObjectName("pushButton_12") + self.label_7 = QtWidgets.QLabel(self.centralwidget) + self.label_7.setGeometry(QtCore.QRect(680, 220, 131, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_7.setFont(font) + self.label_7.setStyleSheet("color: rgb(255, 255, 255);") + self.label_7.setAlignment(QtCore.Qt.AlignCenter) + self.label_7.setObjectName("label_7") + self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit_4.setGeometry(QtCore.QRect(820, 220, 113, 20)) + self.lineEdit_4.setObjectName("lineEdit_4") + self.pushButton_13 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_13.setEnabled(True) + self.pushButton_13.setGeometry(QtCore.QRect(680, 560, 141, 27)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_13.sizePolicy().hasHeightForWidth()) + self.pushButton_13.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_13.setFont(font) + self.pushButton_13.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_13.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;\n" +"") + self.pushButton_13.setCheckable(False) + self.pushButton_13.setAutoDefault(False) + self.pushButton_13.setObjectName("pushButton_13") + self.label_8 = QtWidgets.QLabel(self.centralwidget) + self.label_8.setGeometry(QtCore.QRect(680, 180, 131, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_8.setFont(font) + self.label_8.setStyleSheet("color: rgb(255, 255, 255);") + self.label_8.setAlignment(QtCore.Qt.AlignCenter) + self.label_8.setObjectName("label_8") + self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit_5.setGeometry(QtCore.QRect(820, 180, 113, 20)) + self.lineEdit_5.setObjectName("lineEdit_5") + self.pushButton_14 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_14.setGeometry(QtCore.QRect(940, 180, 75, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_14.setFont(font) + self.pushButton_14.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_14.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_14.setObjectName("pushButton_14") + self.label_9 = QtWidgets.QLabel(self.centralwidget) + self.label_9.setGeometry(QtCore.QRect(840, 0, 131, 16)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_9.setFont(font) + self.label_9.setStyleSheet("color: rgb(255, 255, 255);") + self.label_9.setObjectName("label_9") + self.label_10 = QtWidgets.QLabel(self.centralwidget) + self.label_10.setGeometry(QtCore.QRect(840, 30, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_10.setFont(font) + self.label_10.setStyleSheet("color: rgb(255, 255, 255);") + self.label_10.setObjectName("label_10") + self.label_11 = QtWidgets.QLabel(self.centralwidget) + self.label_11.setGeometry(QtCore.QRect(840, 60, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_11.setFont(font) + self.label_11.setStyleSheet("color: rgb(255, 255, 255);") + self.label_11.setObjectName("label_11") + self.label_12 = QtWidgets.QLabel(self.centralwidget) + self.label_12.setGeometry(QtCore.QRect(840, 90, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_12.setFont(font) + self.label_12.setStyleSheet("color: rgb(255, 255, 255);") + self.label_12.setObjectName("label_12") + self.label_13 = QtWidgets.QLabel(self.centralwidget) + self.label_13.setGeometry(QtCore.QRect(930, 30, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_13.setFont(font) + self.label_13.setStyleSheet("color: rgb(255, 255, 255);") + self.label_13.setObjectName("label_13") + self.label_14 = QtWidgets.QLabel(self.centralwidget) + self.label_14.setGeometry(QtCore.QRect(930, 60, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_14.setFont(font) + self.label_14.setStyleSheet("color: rgb(255, 255, 255);") + self.label_14.setObjectName("label_14") + self.label_15 = QtWidgets.QLabel(self.centralwidget) + self.label_15.setGeometry(QtCore.QRect(930, 90, 81, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_15.setFont(font) + self.label_15.setStyleSheet("color: rgb(255, 255, 255);") + self.label_15.setObjectName("label_15") + self.pushButton_15 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_15.setGeometry(QtCore.QRect(630, 30, 51, 23)) + self.pushButton_15.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_15.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_15.setObjectName("pushButton_15") + self.pushButton_16 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_16.setGeometry(QtCore.QRect(700, 30, 51, 23)) + self.pushButton_16.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_16.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_16.setObjectName("pushButton_16") + self.label_16 = QtWidgets.QLabel(self.centralwidget) + self.label_16.setGeometry(QtCore.QRect(630, 0, 131, 21)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_16.setFont(font) + self.label_16.setStyleSheet("color: rgb(255, 255, 255);") + self.label_16.setAlignment(QtCore.Qt.AlignCenter) + self.label_16.setObjectName("label_16") + self.pushButton_17 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_17.setEnabled(True) + self.pushButton_17.setGeometry(QtCore.QRect(870, 560, 141, 27)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_17.sizePolicy().hasHeightForWidth()) + self.pushButton_17.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(10) + self.pushButton_17.setFont(font) + self.pushButton_17.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_17.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;\n" +"") + self.pushButton_17.setCheckable(False) + self.pushButton_17.setAutoDefault(False) + self.pushButton_17.setObjectName("pushButton_17") + self.pushButton_18 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_18.setGeometry(QtCore.QRect(830, 120, 191, 23)) + font = QtGui.QFont() + font.setPointSize(12) + self.pushButton_18.setFont(font) + self.pushButton_18.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.pushButton_18.setStyleSheet("color: rgb(255, 255, 255);\n" +"background-color: rgb(0, 0, 0);\n" +"border-radius:10px;") + self.pushButton_18.setObjectName("pushButton_18") + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1024, 21)) + self.menubar.setObjectName("menubar") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Slide Scanner - ShanMukha Innovations Pvt Ltd")) + self.label.setText(_translate("MainWindow", "ShanMukha Innovations Pvt Ltd")) + self.label_2.setText(_translate("MainWindow", "Live Preview of Silde")) + self.pushButton.setText(_translate("MainWindow", "Take a Snapshot")) + self.pushButton_2.setText(_translate("MainWindow", "Auto-Focus")) + self.pushButton_3.setText(_translate("MainWindow", "X+")) + self.pushButton_4.setText(_translate("MainWindow", "Y-")) + self.pushButton_5.setText(_translate("MainWindow", "Y+")) + self.pushButton_6.setText(_translate("MainWindow", "X-")) + self.pushButton_7.setText(_translate("MainWindow", "Z - UP")) + self.pushButton_8.setText(_translate("MainWindow", "Z - DOWN")) + self.label_3.setText(_translate("MainWindow", "Slide Movement Controls")) + self.label_4.setText(_translate("MainWindow", "X position")) + self.label_5.setText(_translate("MainWindow", "Z position")) + self.label_6.setText(_translate("MainWindow", "Y position")) + self.pushButton_9.setText(_translate("MainWindow", "Go to X")) + self.pushButton_10.setText(_translate("MainWindow", "Go to Y")) + self.pushButton_11.setText(_translate("MainWindow", "Go to Z")) + self.pushButton_12.setText(_translate("MainWindow", "Set")) + self.label_7.setText(_translate("MainWindow", "Exposure (in ms)")) + self.pushButton_13.setText(_translate("MainWindow", "WSI Scan")) + self.label_8.setText(_translate("MainWindow", "Slide Name")) + self.pushButton_14.setText(_translate("MainWindow", "Set")) + self.label_9.setText(_translate("MainWindow", "Current Positions")) + self.label_10.setText(_translate("MainWindow", "X position")) + self.label_11.setText(_translate("MainWindow", "Y position")) + self.label_12.setText(_translate("MainWindow", "Z position")) + self.label_13.setText(_translate("MainWindow", "0")) + self.label_14.setText(_translate("MainWindow", "0")) + self.label_15.setText(_translate("MainWindow", "0")) + self.pushButton_15.setText(_translate("MainWindow", "40X")) + self.pushButton_16.setText(_translate("MainWindow", "20X")) + self.label_16.setText(_translate("MainWindow", "Magnification")) + self.pushButton_17.setText(_translate("MainWindow", "Best Region Scanning")) + self.pushButton_18.setText(_translate("MainWindow", "Set as Origin")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/src/python/slide_scanner_test.qml b/src/python/slide_scanner_test.qml new file mode 100644 index 0000000..fa9d594 --- /dev/null +++ b/src/python/slide_scanner_test.qml @@ -0,0 +1,111 @@ +import QtQuick 2.2 +import QtQuick.Window 2.2 +import QtGraphicalEffects 1.0 + +Window { + id: main + visible: true + width: 1280 + height: 720 + color: "#000000" + title: qsTr("Main") + + Image { + id: image + x: 30 + anchors.right: parent.right + anchors.rightMargin: 558 + anchors.left: parent.left + anchors.leftMargin: 30 + anchors.bottom: parent.bottom + anchors.bottomMargin: 30 + anchors.top: parent.top + anchors.topMargin: 170 + clip: false + source: "qrc:/qtquickplugin/images/template_image.png" + } + + Image { + id: image1 + x: 30 + y: 30 + width: 50 + height: 50 + fillMode: Image.Stretch + source: "0.jpg" + } + + Text { + id: text1 + x: 86 + y: 30 + width: 442 + height: 50 + color: "#ffffff" + text: qsTr("ShanMukha Innovations Pvt Ltd") + verticalAlignment: Text.AlignVCenter + lineHeight: 5 + fontSizeMode: Text.Fit + horizontalAlignment: Text.AlignHCenter + font.pixelSize: 31 + } + + Text { + id: text2 + x: 260 + y: 135 + color: "#ffffff" + text: qsTr("Live View of the Slide") + styleColor: "#d20909" + fontSizeMode: Text.Fit + font.pixelSize: 24 + } + + Row { + id: row + x: 758 + y: 170 + width: 512 + height: 256 + spacing: 2 + anchors.right: parent.right + anchors.rightMargin: 30 + + Rectangle { + id: rectangle + width: 240 + height: 64 + color: "#ffffff" + radius: 30 + border.color: "#040404" + + Text { + id: text3 + text: qsTr("Take a Snapshot") + anchors.fill: parent + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + font.pixelSize: 24 + } + } + + Rectangle { + id: rectangle1 + width: 240 + height: 64 + color: "#ffffff" + radius: 30 + anchors.right: parent.right + anchors.rightMargin: 0 + + Text { + id: text4 + text: qsTr("Auto Focus") + anchors.fill: parent + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + font.pixelSize: 24 + } + } + } +} diff --git a/src/python/slide_scanner_test.qmlproject b/src/python/slide_scanner_test.qmlproject new file mode 100644 index 0000000..363f86e --- /dev/null +++ b/src/python/slide_scanner_test.qmlproject @@ -0,0 +1,20 @@ +/* File generated by Qt Creator */ + +import QmlProject 1.1 + +Project { + mainFile: "slide_scanner_test.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "." + } + JavaScriptFiles { + directory: "." + } + ImageFiles { + directory: "." + } + /* List of plugin directories passed to QML runtime */ + // importPaths: [ "../exampleplugin" ] +} diff --git a/src/python/slide_scanner_test.ui b/src/python/slide_scanner_test.ui new file mode 100644 index 0000000..532b3eb --- /dev/null +++ b/src/python/slide_scanner_test.ui @@ -0,0 +1,986 @@ + + + MainWindow + + + Qt::WindowModal + + + + 0 + 0 + 1024 + 768 + + + + + 8 + + + + Slide Scanner - ShanMukha Innovations Pvt Ltd + + + + F:/IITT_Logo/0.jpgF:/IITT_Logo/0.jpg + + + false + + + background-color: rgb(90, 90, 90); + + + + + + 20 + 20 + 50 + 50 + + + + false + + + + + 0 + 0 + 0 + + + + + QGraphicsView::SmartViewportUpdate + + + + + + 80 + 20 + 461 + 51 + + + + + 24 + + + + color: rgb(255, 255, 255); + + + ShanMukha Innovations Pvt Ltd + + + + + + 20 + 180 + 640 + 512 + + + + + 640 + 512 + + + + background-color: rgb(85, 255, 127); + + + + + + 220 + 150 + 221 + 31 + + + + + 18 + + + + color: rgb(255, 255, 255); + + + Live Preview of Silde + + + + + true + + + + 680 + 520 + 141 + 27 + + + + + 0 + 0 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + + Take a Snapshot + + + false + + + false + + + + + + 870 + 520 + 141 + 27 + + + + + 0 + 0 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Auto-Focus + + + + + + 734 + 300 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + X+ + + + + + + 680 + 330 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Y- + + + false + + + true + + + + + + 790 + 330 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Y+ + + + + + + 734 + 360 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + X- + + + + + + 880 + 300 + 75 + 23 + + + + PointingHandCursor + + + false + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Z - UP + + + + + + 880 + 360 + 75 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Z - DOWN + + + + + + 680 + 260 + 181 + 21 + + + + + 0 + 0 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Slide Movement Controls + + + + + + 770 + 420 + 113 + 20 + + + + + + + 690 + 420 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + X position + + + + + + 690 + 480 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Z position + + + + + + 770 + 480 + 113 + 20 + + + + + + + 690 + 450 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Y position + + + + + + 770 + 450 + 113 + 20 + + + + + + + 890 + 420 + 75 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Go to X + + + + + + 890 + 450 + 75 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Go to Y + + + + + + 890 + 480 + 75 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Go to Z + + + + + + 940 + 220 + 75 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Set + + + + + + 680 + 220 + 131 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Exposure (in ms) + + + Qt::AlignCenter + + + + + + 820 + 220 + 113 + 20 + + + + + + true + + + + 680 + 560 + 141 + 27 + + + + + 0 + 0 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + + WSI Scan + + + false + + + false + + + + + + 680 + 180 + 131 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Slide Name + + + Qt::AlignCenter + + + + + + 820 + 180 + 113 + 20 + + + + + + + 940 + 180 + 75 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Set + + + + + + 840 + 0 + 131 + 16 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Current Positions + + + + + + 840 + 30 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + X position + + + + + + 840 + 60 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Y position + + + + + + 840 + 90 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Z position + + + + + + 930 + 30 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + 0 + + + + + + 930 + 60 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + 0 + + + + + + 930 + 90 + 81 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + 0 + + + + + + 630 + 30 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + 40X + + + + + + 700 + 30 + 51 + 23 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + 20X + + + + + + 630 + 0 + 131 + 21 + + + + + 12 + + + + color: rgb(255, 255, 255); + + + Magnification + + + Qt::AlignCenter + + + + + true + + + + 870 + 560 + 141 + 27 + + + + + 0 + 0 + + + + + 10 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + + Best Region Scanning + + + false + + + false + + + + + + 830 + 120 + 191 + 23 + + + + + 12 + + + + PointingHandCursor + + + color: rgb(255, 255, 255); +background-color: rgb(0, 0, 0); +border-radius:10px; + + + Set as Origin + + + + + + + 0 + 0 + 1024 + 21 + + + + + + + + diff --git a/src/python/toQImage.py b/src/python/toQImage.py new file mode 100644 index 0000000..e0243d1 --- /dev/null +++ b/src/python/toQImage.py @@ -0,0 +1,27 @@ +from PyQt5.QtGui import QImage, qRgb +import numpy as np + +class NotImplementedException: + pass + +gray_color_table = [qRgb(i, i, i) for i in range(256)] + +def toQImage(im, copy=False): + if im is None: + return QImage() + + if im.dtype == np.uint8: + if len(im.shape) == 2: + qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_Indexed8) + qim.setColorTable(gray_color_table) + return qim.copy() if copy else qim + + elif len(im.shape) == 3: + if im.shape[2] == 3: + qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_RGB888); + return qim.copy() if copy else qim + elif im.shape[2] == 4: + qim = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_ARGB32); + return qim.copy() if copy else qim + +#raise NotImplementedException \ No newline at end of file