Advertisement
Guest User

ganvoizjopi

a guest
Dec 11th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 31.75 KB | None | 0 0
  1. import os
  2. import sqlite3
  3. import sys
  4.  
  5. import PIL.Image as Img
  6. import PIL.ImageEnhance as Enhance
  7. import PyQt5.QtCore as core
  8. import PyQt5.QtGui as gui
  9. import PyQt5.QtWidgets as wdgts
  10. import cv2
  11. import numpy as np
  12.  
  13.  
  14. class ProcessingThread(core.QThread):
  15.     current_signal = core.pyqtSignal(np.ndarray)
  16.     cap = None
  17.     pause = True
  18.  
  19.     def run(self):
  20.         while True:
  21.             if not self.pause:
  22.                 if self.cap and self.cap.isOpened():
  23.                     ret, frame = self.cap.read()
  24.  
  25.                     if frame is None:
  26.                         self.pause = True
  27.                         continue
  28.  
  29.                     frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  30.  
  31.                     current = gui.QImage(frame.data, frame.shape[1], frame.shape[0], gui.QImage.Format_RGB888)
  32.                     self.current_signal.emit(frame)
  33.  
  34.                 else:
  35.                     print('VideoCapture is None')
  36.  
  37.  
  38. class Ui_Dialog(wdgts.QMainWindow):
  39.  
  40.     def closeEvent(self, a0: gui.QCloseEvent):
  41.         try:
  42.             self.parent.load_materials()
  43.             self.parent.combo_box_materials.clear()
  44.             self.parent.combo_box_materials.addItems([mtrl[1] for mtrl in self.materials])
  45.             self.parent.material_selected(0,False)
  46.             self.close()
  47.         except Exception as e:
  48.             print(e)
  49.  
  50.     def push_button_delete_click(self):
  51.         index = self.text_edit_material_id.toPlainText()
  52.         try:
  53.             index = int(index) - 1
  54.             if 0 <= index <= len(self.materials) -1:
  55.                 connect = sqlite3.connect(self.db_name)
  56.                 crsr = connect.cursor()
  57.                 row = self.materials.pop(index)
  58.                 id = row[0]
  59.                 crsr.execute('DELETE FROM Materials WHERE ID=?', (id,))
  60.                 connect.commit()
  61.                 connect.close()
  62.                 self.load_materials()
  63.                 self.fill_table()
  64.         except Exception as e:
  65.             print(e)
  66.  
  67.         self.text_edit_material_id.setPlainText('')
  68.         self.text_edit_material_id.clear()
  69.  
  70.     def push_button_add_click(self):
  71.         material_name = self.text_edit_material_id.toPlainText()
  72.         material_area = self.text_edit_material_area.toPlainText()
  73.         material_area_std = self.text_edit_material_area_std.toPlainText()
  74.         material_porous = self.text_edit_material_porous.toPlainText()
  75.         material_porous_std = self.text_edit_materials_porous_std.toPlainText()
  76.  
  77.         data = [material_name, material_area, material_area_std, material_porous, material_porous_std]
  78.  
  79.         flag = [True if (m is not None and m != '') else False for m in data]
  80.  
  81.         if flag:
  82.             try:
  83.                 material_area = float(material_area)
  84.                 material_area_std = float(material_area_std)
  85.                 material_porous = float (material_porous)
  86.                 material_porous_std = float (material_porous_std)
  87.                 connect = sqlite3.connect(self.db_name)
  88.                 crsr = connect.cursor()
  89.                 crsr.execute("""INSERT INTO Materials(NAME, PORE_AREA_MEAN, PORE_AREA_STD, POROUS_MEAN, POROUS_STD
  90.                VALUES (?, ?, ?, ?, ?)""", (material_name, material_area, material_area_std,
  91.                                             material_porous, material_porous_std))
  92.                 connect.commit()
  93.                 connect.close()
  94.                 self.load_materials()
  95.                 self.fi11_table()
  96.  
  97.             except Exception as e:
  98.                 print(e)
  99.  
  100.     def button_ok_click(self):
  101.  
  102.             self.parent.load_materials()
  103.             self.parent.combo_box_materials.clear()
  104.             self.parent.combo_box_materials.addItems([mtrl[1] for mtrl in self.materials])
  105.             self.parent.material_selected(0, False)
  106.  
  107.             self.close()
  108.  
  109.     def load_materials(self):
  110.         conn = sqlite3.connect(self.db_name)
  111.         cur = conn.cursor()
  112.         self.materials = cur.execute('SELECT * FROM Materials').fetchall()
  113.         conn.close()
  114.  
  115.     def f111_table(self): #функция заполнения таблицы
  116.         while self.tableWidget.rowCount() > 0:
  117.             self.tableWidget.renoveRow(0)
  118.  
  119.         self.tableWidget.setColumnCount(6)
  120.         self.tableWidget.setRowCount(len(self.materials))
  121.  
  122.         self.tableWidget.setHorizontalHeaderLabels(['ID', 'Наименование', 'Площадь поры', 'Откл. от площади',
  123.                                                     'Пористость', 'Откл. от пористости'])
  124.  
  125.         self.tableWidget.horizontalHeaderItem(0).setToolTip("ID записи в базе данных")
  126.         self.tableWidget.horizontalHeaderItem(1).setToolTip("Наименование материала")
  127.         self.tableWidget.horizontalHeaderItem(2).setToolTip("Нормальная площадь поры")
  128.         self.tableWidget.horizontalHeaderItem(3).setToolTip("Отклонение от нормы площади поры")
  129.         self.tableWidget.horizontalHeaderItem(4).setToolTip("Нормальная пористость")
  130.         self.tableWidget.horizontalHeaderItem(5).setToolTip("OTicnoHeHne от нормы пористости")
  131.  
  132.         for i, row in enumerate(self.materials):
  133.  
  134.             self.tableWidget.setItem(i, 0, wdgts.QTableWidgetItem(str(row[0])))
  135.             self.tableWidget.setItem(i, 1, wdgts.QTableWidgetItem(str(row[1])))
  136.             self.tableWidget.setItem(i, 2, wdgts.QTableWidgetItem(str(row[2])))
  137.             self.tableWidget.setItem(i, 3, wdgts.QTableWidgetItem(str(row[3])))
  138.             self.tableWidget.setItem(i, 4, wdgts.QTableWidgetItem(str(row[4])))
  139.             self.tableWidget.setItem(i, 5, wdgts.QTableWidgetItem(str(row[5])))
  140.  
  141.         # делаем ресайз колонок no содержимому
  142.         self.tableWidget.resizeColumnsToContents()
  143.  
  144.     def retranslateUi(self):
  145.         _translate = core.QCoreApplication.translate
  146.         self.setWindowTitle(_translate("Dialog", "Dialog"))
  147.         self.group_box_add_row.setTitle(_translate("Dialog", "Добавить запись"))
  148.         self.push_button_add_row.setText(_translate("Dialog", "Добавить"))
  149.         self.text_edit_material_name.setPlaceholderText(_translate("Dialog", "название материала"))
  150.         self.text_edit_material_area.setPlaceholderText(_translate("Dialog", "площадь поры"))
  151.         self.text_edit_material_area_std.setPlaceholderText(_translate("Dialog", "откл.от площ."))
  152.         self.text_edit_material_porous_std.setPlaceholderText(_translate("Dialog", "откл. от порист."))
  153.         self.text_edit_material_porous.setPlaceholderText(_translate("Dialog", "пористость"))
  154.         self.group_box_delete_row.setTitle(_translate("Dialog", "Удалить запись"))
  155.         self.push_button_delete_row.setText(_translate("Dialog", "Удалить"))
  156.         self.text_edit_material_id.setPlaceholderText(_translate("Dialog", "номер записи"))
  157.  
  158.     def __init__(self, parent = None, db_name = 'porousquality.db'):
  159.         super(Ui_Dialog, self).__init__(parent)
  160.         self.db_name = db_name
  161.         self.parent = parent
  162.  
  163.         self.setObjectName("Dialog")
  164.         self.resize(760, 410)
  165.         self.buttonBox = wdgts.QDialogButtonBox(self)
  166.         self.buttonBox.setGeometry(core.QRect(390, 370, 350, 30))
  167.         self.buttonBox.setOrientation(core.Qt.Horizontal)
  168.         self.buttonBox.setStandardButtons(wdgts.QDialogButtonBox.Ok)
  169.         self.buttonBox.setObjectName("button8ox")
  170.  
  171.         self.tableWidget = wdgts.QTableWidget(self)
  172.         self.tableWidget.setGeometry(core.QRect(10, 10, 740, 250))
  173.         self.tableWidget.setObjectName("tableWidget")
  174.  
  175.         self.group_box_add_row = wdgts.QGroupBox(self)
  176.         self.group_box_add_row.setGeometry(core.QRect(10, 260, 740, 50))
  177.         self.group_box_add_row.setObjectName("group_box_add_row")
  178.         self.push_button_add_row = wdgts.QPushButton(self.group_box_add_row)
  179.         self.push_button_add_row.setGeometry(core.QRect(630, 20, 100, 25))
  180.         self.push_button_add_row.setObjectName("push_button_add_row")
  181.         self.text_edit_material_name = wdgts.QTextEdit(self.group_box_add_row)
  182.         self.text_edit_material_name.setGeometry(core.QRect(10, 20, 135, 25))
  183.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  184.         sizePolicy.setHorizontalStretch(0)
  185.         sizePolicy.setVerticalStretch(0)
  186.         sizePolicy.setHeightForWidth(self.text_edit_material_name.sizePolicy().hasHeightForWidth())
  187.         self.text_edit_material_name.setSizePolicy(sizePolicy)
  188.         self.text_edit_material_name.setInputMethodHints(core.Qt.ImhNone)
  189.         self.text_edit_material_name.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  190.         self.text_edit_material_name.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  191.         self.text_edit_material_name.setObjectName("text_edit_material_name")
  192.         self.text_edit_material_area = wdgts.QTextEdit(self.group_box_add_row)
  193.         self.text_edit_material_area.setGeometry(core.QRect(150, 20, 110, 25))
  194.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  195.         sizePolicy.setHorizontalStretch(0)
  196.         sizePolicy.setVerticalStretch(0)
  197.         sizePolicy.setHeightForWidth(self.text_edit_material_area.sizePolicy().hasHeightForWidth())
  198.         self.text_edit_material_area.setSizePolicy(sizePolicy)
  199.         self.text_edit_material_area.setInputMethodHints(core.Qt.ImhNone)
  200.         self.text_edit_material_area.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  201.         self.text_edit_material_area.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  202.         self.text_edit_material_area.setObjectName("text_edit_material_area")
  203.         self.text_edit_material_area_std = wdgts.QTextEdit(self.group_box_add_row)
  204.         self.text_edit_material_area_std.setGeometry(core.QRect(265, 20, 110, 25))
  205.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  206.         sizePolicy.setHorizontalStretch(0)
  207.         sizePolicy.setVerticalStretch(0)
  208.         sizePolicy.setHeightForWidth(self.text_edit_material_area_std.sizePolicy().hasHeightForWidth())
  209.         self.text_edit_material_area_std.setSizePolicy(sizePolicy)
  210.         self.text_edit_material_area_std.setInputMethodHints(core.Qt.ImhNone)
  211.         self.text_edit_material_area_std.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  212.         self.text_edit_material_area_std.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  213.         self.text_edit_material_area_std.setObjectName("text_edit_material_area_std")
  214.         self.text_edit_material_porous_std = wdgts.QTextEdit(self.group_box_add_row)
  215.         self.text_edit_material_porous_std.setGeometry(core.QRect(495, 20, 110, 25))
  216.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  217.         sizePolicy.setHorizontalStretch(0)
  218.         sizePolicy.setVerticalStretch(0)
  219.         sizePolicy.setHeightForWidth(self.text_edit_material_porous_std.sizePolicy().hasHeightForWidth())
  220.         self.text_edit_material_porous_std.setSizePolicy(sizePolicy)
  221.         self.text_edit_material_porous_std.setInputMethodHints(core.Qt.ImhNone)
  222.         self.text_edit_material_porous_std.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  223.         self.text_edit_material_porous_std.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  224.         self.text_edit_material_porous_std.setObjectName("text_edit_material_porous_std")
  225.         self.text_edit_material_porous = wdgts.QTextEdit(self.group_box_add_row)
  226.         self.text_edit_material_porous.setGeometry(core.QRect(380, 20, 110, 25))
  227.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  228.         sizePolicy.setHorizontalStretch(0)
  229.         sizePolicy.setVerticalStretch(0)
  230.         sizePolicy.setHeightForWidth(self.text_edit_material_porous.sizePolicy().hasHeightForWidth())
  231.         self.text_edit_material_porous.setSizePolicy(sizePolicy)
  232.         self.text_edit_material_porous.setInputMethodHints(core.Qt.ImhNone)
  233.         self.text_edit_material_porous.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  234.         self.text_edit_material_porous.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  235.         self.text_edit_material_porous.setObjectName("text_edit_material_porous")
  236.  
  237.         self.group_box_delete_row = wdgts.QGroupBox(self)
  238.         self.group_box_delete_row.setGeometry(core.QRect(10, 310, 740, 50))
  239.         self.group_box_delete_row.setObjectName("group_box_delete_row")
  240.         self.push_button_delete_row = wdgts.QPushButton(self.group_box_delete_row)
  241.         self.push_button_delete_row.setGeometry(core.QRect(630, 20, 100, 25))
  242.         self.push_button_delete_row.setObjectName("push_button_delete_row")
  243.         self.text_edit_material_id = wdgts.QTextEdit(self.group_box_delete_row)
  244.         self.text_edit_material_id.setGeometry(core.QRect(10, 20, 115, 25))
  245.         sizePolicy = wdgts.QSizePolicy(wdgts.QSizePolicy.Fixed, wdgts.QSizePolicy.Fixed)
  246.         sizePolicy.setHorizontalStretch(0)
  247.         sizePolicy.setVerticalStretch(0)
  248.         sizePolicy.setHeightForWidth(self.text_edit_material_id.sizePolicy().hasHeightForWidth())
  249.         self.text_edit_material_id.setSizePolicy(sizePolicy)
  250.         self.text_edit_material_id.setInputMethodHints(core.Qt.ImhDigitsOnly)
  251.         self.text_edit_material_id.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  252.         self.text_edit_material_id.setHorizontalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
  253.         self.text_edit_material_id.setObjectName("text_edit_n»aterial_id")
  254.  
  255.         self.load_materials()
  256.         self.f111_table()
  257.  
  258.         self.buttonBox.raise_()
  259.         self.tableWidget.raise_()
  260.         self.group_box_delete_row.raise_()
  261.         self.group_box_add_row.raise_()
  262.  
  263.         self.retranslateUi()
  264.         self.buttonBox.accepted.connect(self.button_ok_click)
  265.         #self.buttonBox.rejected.connect(self.button_canceL_click)
  266.         self.push_button_add_row.clicked.connect(self.push_button_add_click)
  267.         self.push_button_delete_row.clicked.connect(self.push_button_delete_click)
  268.  
  269.         core.QMetaObject.connectSlotsByName(self)
  270.  
  271.  
  272. class MainWindow(wdgts.QMainWindow): #класс главное окно
  273.     def explore(self, image):
  274.         """
  275.        Входной аргумент:
  276.        image - исследуемое изображение
  277.        Выход:
  278.        image - изображение с контурами пор
  279.        агеа_с - отношение площади всех пор ко всей площади изображения (пористость)
  280.        Len(bad_conrours) - количество 'плохих' пор
  281.        """
  282.         image = np.copy(image)
  283.         # дополнительная обработка шумов
  284.         blured = cv2.GaussianBlur(image, (5, 5), 0)
  285.         # конвертация BGR формата в формат HSV
  286.         hsv = cv2.cvtColor(blured, cv2.COLOR_BGR2HSV)
  287.  
  288.         lower_black = np.array([0, 0, 0])
  289.         upper_black = np.array([120, 120, 120])
  290.         # определяем маску для обнаружения контуров пор.
  291.         # будут выделены поры в заданном диапозоне
  292.         mask = cv2.inRange(hsv, lower_black, upper_black)
  293.         # получаем массив конутров
  294.         contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  295.  
  296.  
  297.         good_contours = []
  298.         bad_contours = []
  299.         area_c = 0
  300.         # находим 'хорошие' и 'плохие' поры
  301.         for contour in contours:
  302.             #также подсчитываем общую площадь пор
  303.             area_c += cv2.contourArea(contour)
  304.             if self.mat_area - self.mat_area_std <= cv2.contourArea(contour) <= self.mat_area + self.mat_area_std:
  305.                 good_contours.append(contour)
  306.             else:
  307.                 bad_contours.append(contour)
  308.         area_c = area_c / (image.shape[0] * image.shape[1])
  309.         # выделяем'хорошие' поры зеленым цветом
  310.         cv2.drawContours(image, good_contours, -1, (0, 255, 0), 3)
  311.         #выделяем 'плохие' поры красным цветом
  312.         cv2.drawContours(image, bad_contours, -1, (255, 0, 0), 3)
  313.         return image, area_c, len(bad_contours)
  314.  
  315.     @core.pyqtSlot(np.ndarray)
  316.     def set_current_frame(self, image):
  317.         '''Converts a Qlmage into an opency f-IAT format '''
  318.         self.set_original_frame(image)
  319.  
  320.     def set_original_frame(self, image):
  321.         self.origin_img = cv2.resize(image, dsize=(300, 300))
  322.         image = gui.QImage(self.origin_img.data, self.origin_img.shape[1], self.origin_img.shape[0],
  323.                        gui.QImage.Format_RGB888)
  324.         self.original_frame.setPixmap(gui.QPixmap.fromImage(image))
  325.  
  326.     def set_transformed_frame(self, image):
  327.         image = Img.fromarray(image)
  328.  
  329.         image = Enhance.Contrast(image).enhance(self.contrast_slider.value() / 10)
  330.         image = Enhance.Brightness(image).enhance(self.brightness_slider.value() / 10)
  331.         image = Enhance.Sharpness(image).enhance(self.sharpness_slider.value() / 10)
  332.         image = np.array(image)
  333.         self.transform_img = image
  334.         image = gui.QImage(image.data, image.shape[1], image.shape[0], gui.QImage.Format_RGB888)
  335.         self.transformed_frame.setPixmap(gui.QPixmap.fromImage(image))
  336.  
  337.     def set_result_frame(self, image):
  338.         self.result_img = image
  339.         image, pore, bad_pores = self.explore(image)
  340.         image = gui.QImage(image.data, image.shape[1], image.shape[1], gui.QImage.Format_RGB888)
  341.         if self.mat_porous - self.mat_porous_std <= pore <= self.mat_porous + self.mat_porous_std:
  342.             pore_rep = 'общая пористость в норме'
  343.         else:
  344.             pore_rep =" общая пористость не в норме"
  345.         self.report_area.setText('Зеленым контуром отмечены поры, \n не привышающие норму по площади\n'
  346.                                  'Красным контуром отмечены поры,\nпревышающие норму по площади\n\n'
  347.                                  'Отчет: \nпористость - {}\n{}'.format(pore, pore_rep))
  348.         self.report_text.setText('количество пор, площадь\n которых превышает норму: {} '.format(bad_pores))
  349.         self.result_frame.setPixmap(gui.QPixmap.fromImage(image))
  350.  
  351.  
  352.     def contrast_changed(self):
  353.         self.set_transformed_frame(self.origin_img)
  354.         self.set_result_frame(self.transform_img)
  355.  
  356.     def brightness_changed(self):
  357.         self.set_transformed_frame(self.origin_img)
  358.         self.set_result_frame(self.transform_img)
  359.  
  360.     def sharpness_changed(self):
  361.         self.set_transformed_frame(self.origin_img)
  362.         self.set_result_frame(self.transform_img)
  363.  
  364.     def material_selected(self, index, set_res_fr = True) :
  365.         self.update_data(index)
  366.         self.material_area.setText('Площадь поры:{}'.format(str(self.mat_area)))
  367.         self.material_std_area.setText('Отк. от площади:{}'.format(str(self.mat_area)))
  368.         self.material_porous.setText('Пористость:{}'.format(str(self.mat_porous)))
  369.         self.material_std_porous.setText("Откл. от порист.: {}".format(str(self.mat_porous_std)))
  370.         if set_res_fr:
  371.             self.set_result_frame(self.transform_img)
  372.  
  373.     def open_file(self):
  374.         if self.thread:
  375.             self.shoot_button.setEnabled(False)
  376.             self.thread.pause = True
  377.             if self.thread.cap is not None:
  378.                 self.thread.cap.release()
  379.                 self.thread.cap = None
  380.         filename, __ = wdgts.QFileDialog.getOpenFileName(self, "Open file", core.QDir.homePath())
  381.         if filename != '':
  382.             try:
  383.                 origin_img = Img.open(filename)
  384.                 origin_img = np.array(origin_img)
  385.                 self.set_original_frame(origin_img)
  386.                 self.set_transformed_frame(self.origin_img)
  387.                 self.set_result_frame((self.origin_img))
  388.             except Exception as ex:
  389.                 print(ex)
  390.  
  391.     def set_via_webcam(self):
  392.         if self.thread is None:
  393.             self.thread = ProcessingThread(self)
  394.             self.thread.current_signal.connect(self.set_current_frame)
  395.             self.thread.start()
  396.         if self.thread.cap is None:
  397.             self.thread.cap = cv2.VideoCapture(0)
  398.         if self.thread.pause is True:
  399.             self.shoot_button.setEnabled(True)
  400.             self.thread.pause = False
  401.  
  402.     def closeEvent(self, a0: gui.QCloseEvent):
  403.         if self.thread is not None:
  404.             self.thread.pause = True
  405.         if self.thread.cap is not None:
  406.             self.thread.cap.release()
  407.         self.thread.exit(0)
  408.  
  409.  
  410.     def shoot_button_click(self):
  411.         if self.thread.pause:
  412.             self.thread.pause = False
  413.         else:
  414.             self.thread.pause = True
  415.             self.set_transformed_frame(self.origin_img)
  416.             self.set_result_frame(self.origin_img)
  417.  
  418.  
  419.     def load_materials(self):
  420.         conn = sqlite3.connect(self.db_name)
  421.         cur = conn.cursor()
  422.         self.materials = cur.execute('SELECT * FROM Materials').fetchall()
  423.         conn.close()
  424.  
  425.     def update_data(self, id: int):
  426.         if len(self.materials) != 0:
  427.             row = self.materials[np.min([np.max([0, id]), len(self.materials) - 1])]
  428.             self.mat_mame = row[1]
  429.             self.mat_area = row[2]
  430.             self.mat_area_std = row[3]
  431.             self.mat_porous = row[4]
  432.             self.mat_porous_std = row[5]
  433.         else:
  434.             self.mat_name = 'Не задано'
  435.             self.mat_area = 0
  436.             self.mat_area_std = 0
  437.             self.mat_propus = 0
  438.             self.mat_porous_std = 0
  439.  
  440.  
  441.     def dialog_show(self):
  442.         dialog = Ui_Dialog(self, self.db_name)
  443.         dialog.show()
  444.  
  445.     def __init__ (self, parent = None):
  446.         super(MainWindow, self).__init__(parent)
  447.         self.db_name = 'porousqality.db'
  448.         if not os.path.isfile(self.db_name):
  449.             rows = [(0, 'Материал2', 12.0, 5.0, 0.1, 0.01),
  450.                 (1, 'Материал3', 9.00, 8.0, 0.15, 0.01),
  451.                 (2, 'Материал4', 15.0, 8.0, 0.2, 0.5),
  452.                 (3, 'Материал5', 14.0, 7.0, 0.3, 0.7)]
  453.             conn = sqlite3.connect(self.db_name)
  454.             cur = conn.cursor()
  455.             cur.execute("""CREATE TABLE Materials
  456.                (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  457.                NAME TEXT,
  458.                PORE_ARE_mEAN REAL NOT NULL,
  459.                PORE_AREA_STD REAL NOT NULL,
  460.                PROROUS_MEAN REAL NOT NULL,
  461.                PROROUS_STD REAL NOT NULL)""")
  462.             cur.executemany("""INSERT INTO Materials values (?,?,?,?,?,?)""", rows)
  463.             conn.commit()
  464.             conn.close()
  465.  
  466.         self.load_materials()
  467.         font = gui.QFont()
  468.         font.setPointSize(8)
  469.  
  470.         self.setObjectName('Window')
  471.         self.resize(1000, 670)
  472.         self.setMinimumSize(core.QSize(1000, 670))
  473.         self.setMaximumSize(core.QSize(1000, 670))
  474.  
  475.         open_action = wdgts.QAction('&open', self)
  476.         open_action.setStatusTip('Open file')
  477.         open_action.triggered.connect(self.open_file)
  478.         webcam_action = wdgts.QAction('&Webcam',self)
  479.         webcam_action.setStatusTip('Set webcam')
  480.         webcam_action.triggered.connect(self.set_via_webcam)
  481.  
  482.         menuBar = self.menuBar()
  483.         fileMenu = menuBar.addMenu("&File")
  484.         fileMenu.addAction(open_action)
  485.         fileMenu.addAction(webcam_action)
  486.  
  487.         self.gridFrame = wdgts.QFrame(self)
  488.         self.gridFrame.setGeometry(core.QRect(0, 20, 1000, 650))
  489.         self.gridFrame.setMinimumSize(core.QSize(1000, 650))
  490.         self.gridFrame.setMaximumSize(core.QSize(1000, 650))
  491.         self.gridFrame.setObjectName('gridFrame')
  492.  
  493.         self.gridLayout = wdgts.QGridLayout(self.gridFrame)
  494.         self.gridLayout.setContentsMargins(0, 0, 0, 0)
  495.         self.gridLayout.setSpacing(0)
  496.         self.gridLayout.setObjectName('gridLayout')
  497.  
  498.         self.original_frame = wdgts.QLabel(self.gridFrame)
  499.         self.original_frame.setMinimumSize(core.QSize(300, 300))
  500.         self.original_frame.setMaximumSize(core.QSize(300, 300))
  501.         self.original_frame.setObjectName('original_frame')
  502.  
  503.         self.gridLayout.addWidget(self.original_frame, 0, 0, 1, 1)
  504.  
  505.         self.transformed_frame = wdgts.QLabel(self.gridFrame)
  506.         self.transformed_frame.setMinimumSize(core.QSize(300, 300))
  507.         self.transformed_frame.setMaximumSize(core.QSize(300, 300))
  508.         self.transformed_frame.setObjectName('transformed_frame')
  509.  
  510.         self.gridLayout.addWidget(self.transformed_frame, 0, 1, 1, 1)
  511.  
  512.         self.result_frame = wdgts.QLabel(self.gridFrame)
  513.         self.result_frame.setMinimumSize(core.QSize(300, 300))
  514.         self.result_frame.setMaximumSize(core.QSize(300, 300))
  515.         self.result_frame.setObjectName('result_frame')
  516.  
  517.         self.gridLayout.addWidget(self.result_frame, 1, 0, 1, 1)
  518.  
  519.         self.report_frame = wdgts.QFrame(self.gridFrame)
  520.         self.report_frame.setMinimumSize(core.QSize(300, 300))
  521.         self.report_frame.setMaximumSize(core.QSize(300, 300))
  522.         self.report_frame.setObjectName('report_frame')
  523.  
  524.         self.report_layout = wdgts.QVBoxLayout(self.report_frame)
  525.         self.report_layout.setObjectName('report_layout')
  526.         self.gridLayout.addWidget(self.report_frame, 1, 1, 1, 1)
  527.  
  528.         self.report_area = wdgts.QLabel(self.report_frame)
  529.         self.report_area.setGeometry(core.QRect(0, 0, 300, 130))
  530.         self.report_area.setAlignment(core.Qt.AlignCenter)
  531.         self.report_area.setFont(font)
  532.         self.report_area.setObjectName('report_area')
  533.  
  534.         self.report_text = wdgts.QLabel(self.report_frame)
  535.         self.report_text.setGeometry(core.QRect(0, 130, 300, 60))
  536.         self.report_text.setAlignment((core.Qt.AlignCenter))
  537.         self.report_text.setFont(font)
  538.         self.report_text.setObjectName('report_text')
  539.  
  540.  
  541.         self.tools_frame = wdgts.QFrame(self.gridFrame)
  542.         self.tools_frame.setMinimumSize(core.QSize(300 ,300))
  543.         self.tools_frame.setMaximumSize(core.QSize(300, 300))
  544.         self.tools_frame.setObjectName('tools_frame')
  545.  
  546.         self.tools_layout = wdgts.QVBoxLayout(self.tools_frame)
  547.         self.tools_layout.setObjectName('tools_layout')
  548.  
  549.         self.gridLayout.addWidget(self.tools_frame, 0, 2, 1, 1)
  550.  
  551.         self.options_frame = wdgts.QFrame(self.gridFrame)
  552.         self.options_frame.setMaximumSize(core.QSize(300, 300))
  553.         self.options_frame.setMinimumSize(core.QSize(300, 300))
  554.         self.options_frame.setObjectName('options_frame')
  555.  
  556.         self.option_layout = wdgts.QVBoxLayout(self.options_frame)
  557.         self.option_layout.setObjectName('option_layout')
  558.  
  559.         self.gridLayout.addWidget(self.options_frame, 1, 2, 1, 1)
  560.  
  561.         self.shoot_button = wdgts.QPushButton(parent=self.options_frame, text='Снимок')
  562.         self.shoot_button.setGeometry(core.QRect(0, 250, 150, 50))
  563.         self.shoot_button.clicked.connect(self.shoot_button_click)
  564.         self.shoot_button.setEnabled(False)
  565.  
  566.         self.combo_box_materials = wdgts.QComboBox(self.options_frame)
  567.         self.combo_box_materials.setGeometry(core.QRect(0, 0, 150, 40))
  568.         self.combo_box_materials.addItems([mtrl[1] for mtrl in self.materials])
  569.         self.combo_box_materials.activated.connect(self.material_selected)
  570.  
  571.         self.dialog_button = wdgts.QPushButton(parent=self.options_frame, text='изменить')
  572.         self.dialog_button.setGeometry(core.QRect(0, 50, 150, 40))
  573.         self.dialog_button.clicked.connect(self.dialog_show)
  574.  
  575.         self.material_area = wdgts.QLabel(self.options_frame)
  576.         self.material_area.setGeometry(core.QRect(150, 0, 150, 40))
  577.         self.material_area.setAlignment(core.Qt.AlignCenter)
  578.         self.material_area.setFont(font)
  579.         self.material_area.setObjectName('material_area')
  580.  
  581.         self.material_std_area = wdgts.QLabel(self.options_frame)
  582.         self.material_std_area.setGeometry(core.QRect(150, 40, 150, 40))
  583.         self.material_std_area.setAlignment(core.Qt.AlignCenter)
  584.         self.material_std_area.setFont(font)
  585.         self.material_std_area.setObjectName('material_std_area')
  586.  
  587.         self.material_porous = wdgts.QLabel(self.options_frame)
  588.         self.material_porous.setGeometry(core.QRect(150, 80, 150, 40))
  589.         self.material_porous.setAlignment(core.Qt.AlignCenter)
  590.         self.material_porous.setFont(font)
  591.         self.material_porous.setObjectName('material_prorous')
  592.  
  593.         self.material_std_porous = wdgts.QLabel(self.options_frame)
  594.         self.material_std_porous.setGeometry(core.QRect(150, 120, 150, 40))
  595.         self.material_std_porous.setAlignment(core.Qt.AlignCenter)
  596.         self.material_std_porous.setFont(font)
  597.         self.material_std_porous.setObjectName("material_porous")
  598.  
  599.         self.contrast_label = wdgts.QLabel(self.tools_frame)
  600.         self.contrast_label.setFont(font)
  601.         self.contrast_label.setAlignment(core.Qt.AlignCenter)
  602.         self.contrast_label.setObjectName("contrast_label")
  603.         self.contrast_label.setText('контрастность')
  604.  
  605.         self.contrast_slider = wdgts.QSlider(core.Qt.Horizontal)
  606.         self.contrast_slider.setRange(-200, 200)
  607.         self.contrast_slider.setTickPosition(wdgts.QSlider.TicksBothSides)
  608.         self.contrast_slider.setValue(10)
  609.  
  610.         self.brightness_label = wdgts.QLabel(self.tools_frame)
  611.         self.brightness_label.setFont(font)
  612.         self.brightness_label.setAlignment(core.Qt.AlignCenter)
  613.         self.brightness_label.setObjectName("brightness_label")
  614.         self.brightness_label.setText('яркость ')
  615.  
  616.         self.brightness_slider = wdgts.QSlider(core.Qt.Horizontal)
  617.         self.brightness_slider.setRange(-50, 250)
  618.         self.brightness_slider.setTickPosition(wdgts.QSlider.TicksBothSides)
  619.         self.brightness_slider.setValue(10)
  620.  
  621.         self.sharpness_label = wdgts.QLabel(self.tools_frame)
  622.         self.sharpness_label.setFont(font)
  623.         self.sharpness_label.setAlignment(core.Qt.AlignCenter)
  624.         self.sharpness_label.setObjectName("sharpness_label")
  625.         self.sharpness_label.setText('резкость')
  626.  
  627.         self.sharpness_slider = wdgts.QSlider(core.Qt.Horizontal)
  628.         self.sharpness_slider.setRange(-200, 200)
  629.         self.sharpness_slider.setTickPosition(wdgts.QSlider.TicksBothSides)
  630.         self.sharpness_slider.setValue(10)
  631.  
  632.         self.tools_layout.addWidget(self.contrast_label)
  633.         self.tools_layout.addWidget(self.contrast_slider)
  634.  
  635.         self.tools_layout.addWidget(self.brightness_label)
  636.         self.tools_layout.addWidget(self.brightness_slider)
  637.  
  638.         self.tools_layout.addWidget(self.sharpness_label)
  639.         self.tools_layout.addWidget(self.sharpness_slider)
  640.  
  641.         self.contrast_slider.valueChanged.connect(self.contrast_changed)
  642.         self.brightness_slider.valueChanged.connect(self.brightness_changed)
  643.         self.sharpness_slider.valueChanged.connect(self.sharpness_changed)
  644.  
  645.         self.material_selected(0, False)
  646.  
  647.         self.setWindowTitle("Quality porous material")
  648.         self.thread = None
  649.  
  650.         blank_img = 255 * np.ones(shape=(300, 300, 3), dtype=np.uint8)
  651.         self.set_original_frame(blank_img)
  652.         self.set_transformed_frame(self.origin_img)
  653.         self.set_result_frame(self.transform_img)
  654.  
  655.  
  656.  
  657. class App(wdgts.QApplication):
  658.     def __init__(self, *args):
  659.         super(App, self).__init__(*args)
  660.         self.main = MainWindow()
  661.         self.main.show()
  662.  
  663. app = App(sys.argv)
  664. sys.exit(app.exec())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement