diff --git a/ScrewDrive.py b/ScrewDrive.py index 72256bc..28d05e3 100644 --- a/ScrewDrive.py +++ b/ScrewDrive.py @@ -125,6 +125,7 @@ class ScrewDrive(QThread): # print(f'self.Pre_ROI_Dic = {self.Myini.Pre_ROI_Dic}') print(f'self.Identity = {self.Identity}') # print(f'self.ROI_List = {self.Myini.ROI_List}') + # 根據recipe名稱找INI檔內座標的絕對位置切割影像 切第一次圖 self.image_AI = self.image_AI[self.Myini.Pre_ROI_Dic[self.Identity][1]:self.Myini.Pre_ROI_Dic[self.Identity][1] + self.Myini.Pre_ROI_Dic[self.Identity][3], self.Myini.Pre_ROI_Dic[self.Identity][0]:self.Myini.Pre_ROI_Dic[self.Identity][0] + self.Myini.Pre_ROI_Dic[self.Identity][2]] self.Result = self.Result[self.Myini.Pre_ROI_Dic[self.Identity][1]:self.Myini.Pre_ROI_Dic[self.Identity][1] + self.Myini.Pre_ROI_Dic[self.Identity][3], self.Myini.Pre_ROI_Dic[self.Identity][0]:self.Myini.Pre_ROI_Dic[self.Identity][0] + self.Myini.Pre_ROI_Dic[self.Identity][2]] # print(f'self.Result.shape = {self.Result.shape}') @@ -133,6 +134,7 @@ class ScrewDrive(QThread): starttime = time.time() Images_AI = self.ROI(self.image_AI) + # 進行推論 YOLO推論的類別 可能不等於真實的類別 class_names_AI, confidences, Index = self.Predict_Images_YOLOv8(Images_AI, 0) # print(f'class_names_AI = {class_names_AI}') @@ -148,7 +150,7 @@ class ScrewDrive(QThread): self.parallel_processing_AllImage(class_names_AI, Index, confidences, 0, self.lock, Images_AI) except Exception as e: self.dev_logger.error(f'parallel_processing_AllImage\n{e}') - + # 發出狀態信號,表示該過程已經完成 self.status.emit(True) def split_list(alist, wanted_parts=1): @@ -167,6 +169,7 @@ class ScrewDrive(QThread): while self.AOIimage_ISREADY == False: time.sleep(0.01) print('.') + # 根據recipe名稱找INI檔內座標的絕對位置切割影像 切第二次圖 self.image_AOI = self.image_AOI[self.Myini.Pre_ROI_Dic[self.Identity][1]:self.Myini.Pre_ROI_Dic[self.Identity][1] + self.Myini.Pre_ROI_Dic[self.Identity][3], self.Myini.Pre_ROI_Dic[self.Identity][0]:self.Myini.Pre_ROI_Dic[self.Identity][0] + self.Myini.Pre_ROI_Dic[self.Identity][2]] # cv2.imwrite(f'./imageprocess/{self.Identity}.png', self.image_AOI) @@ -192,7 +195,7 @@ class ScrewDrive(QThread): # class_name = class_names_AI[Index.index(i)] print(f'{self.Myini.Class_Name_All[i]} --> {class_name} index = {Index.index(i)}') - self.NG_Image_Information[self.Myini.Class_Name_All[i]] = class_name + self.NG_Image_Information[self.Myini.Class_Name_All[i]] = class_name #沒看懂這啥 by賢恩 if class_name == self.Myini.Class_Name_All[i]: self.report.emit(1, confidences[Index.index(i)], i, diameter, numberofvertices) self.DrawResult(i, 0, 255, 0) @@ -259,7 +262,6 @@ class ScrewDrive(QThread): cv2.imwrite( f'./imageprocess/{self.Myini.recipe}/AOI_Origin/{self.Time_for_Record}_{class_name}_{i}_{diameter}_{numberofvertices}.png', img.Image) - cv2.imwrite( f'./imageprocess/{self.Myini.recipe}/AI/{self.Filenames_for_Record[self.Myini.Class_Name_AI.index(self.Myini.Class_Name_All[i])]}/{self.Time_for_Record}_{class_name}_{i}_{confidences[Index.index(i)]}.png', images_ai[i].Image) @@ -800,7 +802,7 @@ class Measure: self.Remedy = inputimage self.Histogram = inputimage if classnumber == 'spanner' or classnumber == '03_Spanner': - inputimage = self.Unsharpen(inputimage) + inputimage = self.Unsharpen(inputimage) # USM锐化增强方法 maskimage = self.GetMask_for_KleinTool(inputimage, 55, 60) maskimage_spanner = self.GetMask_for_KleinTool(inputimage, 80, 60) @@ -811,7 +813,7 @@ class Measure: elif classnumber == 'square': ret, Threshold_Image = cv2.threshold(inputimage, 130, 255, cv2.THRESH_BINARY) elif classnumber == 'hextamperproof': - inputimage = self.Unsharpen(inputimage) + inputimage = self.Unsharpen(inputimage) # USM锐化增强方法 self.Remedy = inputimage maskimage = self.GetMask_for_KleinTool(inputimage) self.Histogram = maskimage @@ -820,7 +822,7 @@ class Measure: elif classnumber == 'triwing': ret, Threshold_Image = cv2.threshold(inputimage, 170, 255, cv2.THRESH_BINARY) # 150 elif classnumber == 'torxtamperproof': - inputimage = self.Unsharpen(inputimage) + inputimage = self.Unsharpen(inputimage) # USM锐化增强方法 self.Remedy = inputimage maskimage = self.GetMask_for_KleinTool(inputimage, 55) self.Histogram = maskimage @@ -848,14 +850,18 @@ class Measure: center = (int(x), int(y)) radius_int = int(radius) if classnumber in ['torxtamperproof']: + # 建立mask mask = np.zeros(Threshold_Image.shape, dtype='uint8') cv2.circle(mask, center, radius_int, (255, 255, 255), -1) cv2.circle(self.InputImage, center, radius_int, (0, 0, 255), 2) new_image = cv2.bitwise_and(inputimage, mask) # cv2.imwrite(f'./Measure/new_image.png', new_image) - mean_value = cv2.mean(new_image[center[1] - radius_int:center[1] + radius_int,center[0] - radius_int:center[0] + radius_int]) # 計算套頭形狀部分的亮度平均值 - threshold_value = int(mean_value[0] * 1.15) # 計算inputimage的閾值 + # 計算套頭形狀部分的亮度平均值 + mean_value = cv2.mean(new_image[center[1] - radius_int:center[1] + radius_int,center[0] - radius_int:center[0] + radius_int]) + # 計算inputimage的閾值 二值化閾值為平均亮度*1.15 + threshold_value = int(mean_value[0] * 1.15) # print(f'threshold_value = {threshold_value}') + # 保留遮罩範圍內的影像資訊 self.Histogram = cv2.bitwise_and(new_image, maskimage) ret, Threshold_Image_mean_value = cv2.threshold(cv2.bitwise_and(new_image, maskimage),threshold_value, 255, cv2.THRESH_BINARY) # 二值化 # self.Histogram = new_image diff --git a/Screwdriver_Detection.py b/Screwdriver_Detection.py index cdd75b8..ff65fe9 100644 --- a/Screwdriver_Detection.py +++ b/Screwdriver_Detection.py @@ -238,7 +238,7 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind self.pushButton_Start.click() self.real_detect_amount -= 1 - def Load_recipe(self): + def Load_recipe(self): #用barcode讀工單 try: br = abfactory() br.process = CINO_S680 @@ -261,10 +261,11 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind print(f'barcodereader error --- {e}') try: + # 用awm_key從資料庫內讀part_no read_datas = self.dbwindow.get_aoi_op_master_datas(self.dbwindow.awm_key) - + # 用part_no讀到權重名稱 read_datas_weightname = self.dbwindow.get_aoi_recipe_master_datas(read_datas['part_no']) - + # 用讀到的權重名稱找到INI檔中的模型名稱 self.recipe_model = self.get_tool_name_from_ini(read_datas_weightname['para1'].split('.')[0]) self.engineer_mode_window.comboBox_recipe.setCurrentText(self.recipe_model) @@ -272,6 +273,7 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind self.show_aoi_op_master_datas_on_UI(read_datas) + # Enable檢測按鈕 self.pushButton_Load_Recipe.setEnabled(False) self.pushButton_Start.setEnabled(True) self.pushButton_ReDetect.setEnabled(True) @@ -542,14 +544,14 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind # if self.awm_Key_for_Recipe == 'M11-2303001' and self.dbwindow.awm_key == 'M11-2303001': # print(self.awm_Key_for_Recipe) - if self.recipe_model == 'Milwaukee': - threading.Thread(target=self.Start_Thread_Milwaukee, args=()).start() + if self.recipe_model == 'Milwaukee': #公單為Milwaukee + threading.Thread(target=self.Start_Thread_Milwaukee, args=()).start() #進入Milwaukee線程 # -------------------學長之前寫的測試工單------------------------- # if self.awm_Key_for_Recipe == 'M11-2303002': # threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() # -------------------20250117修改------------------------- - if self.recipe_model == 'KleinTool' or self.recipe_model == 'KleinToolblack': - threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() + if self.recipe_model == 'KleinTool' or self.recipe_model == 'KleinToolblack': #公單為KleinTool或KleinToolblack + threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() #進入KleinTool線程 self.real_detect_amount += 1 def Start_Thread_Milwaukee(self): if self.pushButton_Start.text() == 'System Idle': @@ -584,7 +586,7 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind for sd in self.screwdrives: sd.Result = self.Result sd.image_AI = cv2.cvtColor(self.Result, cv2.COLOR_BGR2GRAY) - sd.Main(1, self.dbwindow.aoi_start) + sd.Main(1, self.dbwindow.aoi_start) # 1為modecode 進入run # self.screwdrive.Result = self.Result # self.screwdrive.image_AI = cv2.cvtColor(self.Result, cv2.COLOR_BGR2GRAY) # self.screwdrive.Main(1, self.dbwindow.aoi_start)