256 lines
7.7 KiB
Python
256 lines
7.7 KiB
Python
|
|
#import matlab.engine
|
||
|
|
from PyQt5 import QtCore, QtGui, uic, QtWidgets
|
||
|
|
import sys,os
|
||
|
|
import numpy as np
|
||
|
|
import cv2
|
||
|
|
import serial,sys
|
||
|
|
import threading, time, Queue
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
|
||
|
|
name=raw_input("enter patient's name ")
|
||
|
|
#age=raw_input("enter age ")
|
||
|
|
today=datetime.now().date()
|
||
|
|
today1=datetime.now().time()
|
||
|
|
#t = datetime.time(datetime.now())
|
||
|
|
|
||
|
|
path = "./%s-" %name + str(today)
|
||
|
|
try:
|
||
|
|
os.mkdir(path)
|
||
|
|
except OSError:
|
||
|
|
print ("Creation of the directory %s failed" % path)
|
||
|
|
else:
|
||
|
|
print ("Successfully created the directory %s " % path)
|
||
|
|
|
||
|
|
|
||
|
|
running = False
|
||
|
|
capture_thread = None
|
||
|
|
#for i in range(3):
|
||
|
|
form_class = uic.loadUiType("simple.ui")[0]
|
||
|
|
q = Queue.Queue()
|
||
|
|
ser = serial.Serial('COM3',57600)
|
||
|
|
capture = cv2.VideoCapture(0)
|
||
|
|
capture_duration = 60*1
|
||
|
|
q_write = Queue.Queue()
|
||
|
|
|
||
|
|
|
||
|
|
def grab(width, height):
|
||
|
|
global running,q,capture
|
||
|
|
#capture = cv2.VideoCapture(0)
|
||
|
|
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width)
|
||
|
|
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
|
||
|
|
capture.set(cv2.CAP_PROP_EXPOSURE, -13)
|
||
|
|
#print (capture.get(cv2.CAP_PROP_EXPOSURE) )
|
||
|
|
while(running):
|
||
|
|
retval, img = capture.read()
|
||
|
|
if q.qsize() < 7200:
|
||
|
|
q.put(img)
|
||
|
|
|
||
|
|
class OwnImageWidget(QtWidgets.QWidget):
|
||
|
|
def __init__(self, parent=None):
|
||
|
|
super(OwnImageWidget, self).__init__(parent)
|
||
|
|
self.image = None
|
||
|
|
|
||
|
|
def setImage(self, image):
|
||
|
|
self.image = image
|
||
|
|
sz = image.size()
|
||
|
|
self.setMinimumSize(sz)
|
||
|
|
self.update()
|
||
|
|
|
||
|
|
def paintEvent(self, event):
|
||
|
|
qp = QtGui.QPainter()
|
||
|
|
qp.begin(self)
|
||
|
|
if self.image:
|
||
|
|
qp.drawImage(QtCore.QPoint(0, 0), self.image)
|
||
|
|
qp.end()
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class MyWindowClass(QtWidgets.QMainWindow, form_class):
|
||
|
|
location=''
|
||
|
|
def __init__(self, parent=None):
|
||
|
|
QtWidgets.QMainWindow.__init__(self, parent)
|
||
|
|
self.setupUi(self)
|
||
|
|
self.resize(730,730)
|
||
|
|
self.currzpos=0
|
||
|
|
#btn1 = QtWidgets.QPushButton('X+', self)
|
||
|
|
#btn2 = QtWidgets.QPushButton('X-', self)
|
||
|
|
#btn1.move(200, 500)
|
||
|
|
#btn2.move(300, 500)
|
||
|
|
self.startButton.clicked.connect(self.start_clicked)
|
||
|
|
self.startButton4.clicked.connect(self.main)
|
||
|
|
self.window_width = self.ImgWidget.frameSize().width()
|
||
|
|
self.window_height = self.ImgWidget.frameSize().height()
|
||
|
|
self.ImgWidget = OwnImageWidget(self.ImgWidget)
|
||
|
|
self.startButton1.clicked.connect(self.xPos)
|
||
|
|
self.startButton2.clicked.connect(self.xNeg)
|
||
|
|
self.timer = QtCore.QTimer(self)
|
||
|
|
self.timer.timeout.connect(self.update_frame)
|
||
|
|
self.timer.start(.01)
|
||
|
|
self.startButton3.clicked.connect(self.fCapture)
|
||
|
|
self.startButton5.clicked.connect(self.home)
|
||
|
|
self.startButton6.clicked.connect(self.start)
|
||
|
|
self.startButton7.clicked.connect(self.xPoss)
|
||
|
|
self.startButton8.clicked.connect(self.xNegg)
|
||
|
|
|
||
|
|
|
||
|
|
def main(self):
|
||
|
|
|
||
|
|
capture_thread2 = threading.Thread(target=self.autofocus, args = ())
|
||
|
|
capture_thread2.start()
|
||
|
|
#capture_thread2.join()
|
||
|
|
#self.autofocus()
|
||
|
|
|
||
|
|
def home(self):
|
||
|
|
ser.write('Q')
|
||
|
|
self.currzpos=0
|
||
|
|
|
||
|
|
def start(self):
|
||
|
|
self.Zpulserate = 57600
|
||
|
|
#ser.write('S')
|
||
|
|
auto_travel=-650000
|
||
|
|
self.gotoZ(auto_travel)
|
||
|
|
|
||
|
|
def gotoZ(self,zValue):
|
||
|
|
zValue = int(zValue)
|
||
|
|
if self.currzpos != zValue:
|
||
|
|
zValue_str = str("%($)07d" % {"$":zValue})
|
||
|
|
print zValue_str
|
||
|
|
ser.write('M')
|
||
|
|
ser.write(str(zValue_str))
|
||
|
|
time.sleep(abs(self.currzpos-zValue)/self.Zpulserate)
|
||
|
|
self.currzpos = int(zValue)
|
||
|
|
|
||
|
|
def autofocus(self):
|
||
|
|
|
||
|
|
global q
|
||
|
|
Z_travel_for_crude = 16000; crude_step_count = 200;
|
||
|
|
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)/25
|
||
|
|
|
||
|
|
for i in range(int(crude_pulse_count)):
|
||
|
|
img=q.get()
|
||
|
|
crude_curr_var = np.var(cv2.filter2D(img,-1,kernel))
|
||
|
|
#cv2.imwrite("image/image_crude_auto{0}.jpg".format(i),img)
|
||
|
|
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
|
||
|
|
image=img
|
||
|
|
crude_curr_loc = crude_curr_loc + crude_step_count
|
||
|
|
self.gotoZ(crude_curr_loc)
|
||
|
|
time.sleep(.075)
|
||
|
|
#a="image/image_crude%d.jpg"%crude_loc_max_var
|
||
|
|
#cv2.imwrite(a ,image)
|
||
|
|
self.gotoZ(crude_loc_max_var)
|
||
|
|
|
||
|
|
|
||
|
|
def xPos(self):
|
||
|
|
self.currzpos=int(self.currzpos)
|
||
|
|
ser.write('G')
|
||
|
|
self.currzpos = self.currzpos + 1
|
||
|
|
print self.currzpos
|
||
|
|
|
||
|
|
def xNeg(self):
|
||
|
|
self.currzpos=int(self.currzpos)
|
||
|
|
ser.write('T')
|
||
|
|
print self.currzpos
|
||
|
|
|
||
|
|
def xPoss(self):
|
||
|
|
self.currzpos=int(self.currzpos)
|
||
|
|
ser.write('D')
|
||
|
|
self.currzpos = self.currzpos + 1
|
||
|
|
print self.currzpos
|
||
|
|
|
||
|
|
def xNegg(self):
|
||
|
|
self.currzpos=int(self.currzpos)
|
||
|
|
ser.write('A')
|
||
|
|
self.currzpos = self.currzpos - 1
|
||
|
|
print self.currzpos
|
||
|
|
|
||
|
|
def start_clicked(self):
|
||
|
|
global running
|
||
|
|
running = True
|
||
|
|
capture_thread.start()
|
||
|
|
|
||
|
|
|
||
|
|
def update_frame(self):
|
||
|
|
global q
|
||
|
|
if not q.empty():
|
||
|
|
img = q.get()
|
||
|
|
img_height, img_width, img_colors = img.shape
|
||
|
|
scale_w = float(self.window_width) / float(img_width)
|
||
|
|
scale_h = float(self.window_height) / float(img_height)
|
||
|
|
scale = min([scale_w, scale_h])
|
||
|
|
|
||
|
|
if scale == 0:
|
||
|
|
scale = 1
|
||
|
|
|
||
|
|
img = cv2.resize(img, None, fx=scale, fy=scale, interpolation = cv2.INTER_CUBIC)
|
||
|
|
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
||
|
|
height, width, bpc = img.shape
|
||
|
|
bpl = bpc * width
|
||
|
|
image = QtGui.QImage(img.data, width, height, bpl, QtGui.QImage.Format_RGB888)
|
||
|
|
self.ImgWidget.setImage(image)
|
||
|
|
|
||
|
|
|
||
|
|
def fCapture(self):
|
||
|
|
capture_thread3 = threading.Thread(target=self.fCapture_read, args = ())
|
||
|
|
capture_thread3.start()
|
||
|
|
|
||
|
|
def fCapture_read(self):
|
||
|
|
global capture,capture_duration
|
||
|
|
global q_write
|
||
|
|
t_end = time.time() + capture_duration
|
||
|
|
self.counter=0
|
||
|
|
print "frame capture started"
|
||
|
|
while(capture.isOpened()):
|
||
|
|
ret, frame = capture.read()
|
||
|
|
if time.time() < t_end:
|
||
|
|
if (ret==True):
|
||
|
|
self.counter=self.counter+1
|
||
|
|
if q_write.qsize()<120*capture_duration:
|
||
|
|
q_write.put(frame)
|
||
|
|
else:
|
||
|
|
print "frames captured"
|
||
|
|
print self.counter
|
||
|
|
self.fcapture_write()
|
||
|
|
|
||
|
|
#cap.release()
|
||
|
|
|
||
|
|
def fcapture_write(self):
|
||
|
|
global q_write,capture
|
||
|
|
i=0
|
||
|
|
if not q_write.empty():
|
||
|
|
for i in range (self.counter):
|
||
|
|
img=q_write.get()
|
||
|
|
i=i+1
|
||
|
|
cv2.imwrite(str(path)+ "/image%d.bmp" %i,img)
|
||
|
|
|
||
|
|
self.call_matlab()
|
||
|
|
|
||
|
|
def call_matlab(self):
|
||
|
|
print "calling matlab"
|
||
|
|
print path
|
||
|
|
import matlab.engine as m
|
||
|
|
eng = m.start_matlab()
|
||
|
|
eng.new_whole_blood_segment_odroid(path)
|
||
|
|
#print "calling matlab"
|
||
|
|
#mlab.new_whole_blood_segment_odroid(path)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__' :
|
||
|
|
capture_thread = threading.Thread(target=grab, args = (640,480))
|
||
|
|
|
||
|
|
app = QtWidgets.QApplication(sys.argv)
|
||
|
|
w = MyWindowClass()
|
||
|
|
w.setWindowTitle('OFM GUI')
|
||
|
|
w.show()
|
||
|
|
app.exec_()
|
||
|
|
|