增加註解

This commit is contained in:
JEFF 2025-02-20 21:40:20 +08:00
parent eca964d725
commit 8b97362ac2
2 changed files with 24 additions and 16 deletions

View File

@ -125,6 +125,7 @@ class ScrewDrive(QThread):
# print(f'self.Pre_ROI_Dic = {self.Myini.Pre_ROI_Dic}') # print(f'self.Pre_ROI_Dic = {self.Myini.Pre_ROI_Dic}')
print(f'self.Identity = {self.Identity}') print(f'self.Identity = {self.Identity}')
# print(f'self.ROI_List = {self.Myini.ROI_List}') # 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.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]] 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}') # print(f'self.Result.shape = {self.Result.shape}')
@ -133,6 +134,7 @@ class ScrewDrive(QThread):
starttime = time.time() starttime = time.time()
Images_AI = self.ROI(self.image_AI) Images_AI = self.ROI(self.image_AI)
# 進行推論 YOLO推論的類別 可能不等於真實的類別
class_names_AI, confidences, Index = self.Predict_Images_YOLOv8(Images_AI, 0) class_names_AI, confidences, Index = self.Predict_Images_YOLOv8(Images_AI, 0)
# print(f'class_names_AI = {class_names_AI}') # 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) self.parallel_processing_AllImage(class_names_AI, Index, confidences, 0, self.lock, Images_AI)
except Exception as e: except Exception as e:
self.dev_logger.error(f'parallel_processing_AllImage\n{e}') self.dev_logger.error(f'parallel_processing_AllImage\n{e}')
# 發出狀態信號,表示該過程已經完成
self.status.emit(True) self.status.emit(True)
def split_list(alist, wanted_parts=1): def split_list(alist, wanted_parts=1):
@ -167,6 +169,7 @@ class ScrewDrive(QThread):
while self.AOIimage_ISREADY == False: while self.AOIimage_ISREADY == False:
time.sleep(0.01) time.sleep(0.01)
print('.') 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]] 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) # 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)] # class_name = class_names_AI[Index.index(i)]
print(f'{self.Myini.Class_Name_All[i]} --> {class_name} index = {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]: if class_name == self.Myini.Class_Name_All[i]:
self.report.emit(1, confidences[Index.index(i)], i, diameter, numberofvertices) self.report.emit(1, confidences[Index.index(i)], i, diameter, numberofvertices)
self.DrawResult(i, 0, 255, 0) self.DrawResult(i, 0, 255, 0)
@ -259,7 +262,6 @@ class ScrewDrive(QThread):
cv2.imwrite( cv2.imwrite(
f'./imageprocess/{self.Myini.recipe}/AOI_Origin/{self.Time_for_Record}_{class_name}_{i}_{diameter}_{numberofvertices}.png', f'./imageprocess/{self.Myini.recipe}/AOI_Origin/{self.Time_for_Record}_{class_name}_{i}_{diameter}_{numberofvertices}.png',
img.Image) img.Image)
cv2.imwrite( 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', 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) images_ai[i].Image)
@ -800,7 +802,7 @@ class Measure:
self.Remedy = inputimage self.Remedy = inputimage
self.Histogram = inputimage self.Histogram = inputimage
if classnumber == 'spanner' or classnumber == '03_Spanner': 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 = self.GetMask_for_KleinTool(inputimage, 55, 60)
maskimage_spanner = self.GetMask_for_KleinTool(inputimage, 80, 60) maskimage_spanner = self.GetMask_for_KleinTool(inputimage, 80, 60)
@ -811,7 +813,7 @@ class Measure:
elif classnumber == 'square': elif classnumber == 'square':
ret, Threshold_Image = cv2.threshold(inputimage, 130, 255, cv2.THRESH_BINARY) ret, Threshold_Image = cv2.threshold(inputimage, 130, 255, cv2.THRESH_BINARY)
elif classnumber == 'hextamperproof': elif classnumber == 'hextamperproof':
inputimage = self.Unsharpen(inputimage) inputimage = self.Unsharpen(inputimage) # USM锐化增强方法
self.Remedy = inputimage self.Remedy = inputimage
maskimage = self.GetMask_for_KleinTool(inputimage) maskimage = self.GetMask_for_KleinTool(inputimage)
self.Histogram = maskimage self.Histogram = maskimage
@ -820,7 +822,7 @@ class Measure:
elif classnumber == 'triwing': elif classnumber == 'triwing':
ret, Threshold_Image = cv2.threshold(inputimage, 170, 255, cv2.THRESH_BINARY) # 150 ret, Threshold_Image = cv2.threshold(inputimage, 170, 255, cv2.THRESH_BINARY) # 150
elif classnumber == 'torxtamperproof': elif classnumber == 'torxtamperproof':
inputimage = self.Unsharpen(inputimage) inputimage = self.Unsharpen(inputimage) # USM锐化增强方法
self.Remedy = inputimage self.Remedy = inputimage
maskimage = self.GetMask_for_KleinTool(inputimage, 55) maskimage = self.GetMask_for_KleinTool(inputimage, 55)
self.Histogram = maskimage self.Histogram = maskimage
@ -848,14 +850,18 @@ class Measure:
center = (int(x), int(y)) center = (int(x), int(y))
radius_int = int(radius) radius_int = int(radius)
if classnumber in ['torxtamperproof']: if classnumber in ['torxtamperproof']:
# 建立mask
mask = np.zeros(Threshold_Image.shape, dtype='uint8') mask = np.zeros(Threshold_Image.shape, dtype='uint8')
cv2.circle(mask, center, radius_int, (255, 255, 255), -1) cv2.circle(mask, center, radius_int, (255, 255, 255), -1)
cv2.circle(self.InputImage, center, radius_int, (0, 0, 255), 2) cv2.circle(self.InputImage, center, radius_int, (0, 0, 255), 2)
new_image = cv2.bitwise_and(inputimage, mask) new_image = cv2.bitwise_and(inputimage, mask)
# cv2.imwrite(f'./Measure/new_image.png', new_image) # 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}') # print(f'threshold_value = {threshold_value}')
# 保留遮罩範圍內的影像資訊
self.Histogram = cv2.bitwise_and(new_image, maskimage) 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) # 二值化 ret, Threshold_Image_mean_value = cv2.threshold(cv2.bitwise_and(new_image, maskimage),threshold_value, 255, cv2.THRESH_BINARY) # 二值化
# self.Histogram = new_image # self.Histogram = new_image

View File

@ -238,7 +238,7 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind
self.pushButton_Start.click() self.pushButton_Start.click()
self.real_detect_amount -= 1 self.real_detect_amount -= 1
def Load_recipe(self): def Load_recipe(self): #用barcode讀工單
try: try:
br = abfactory() br = abfactory()
br.process = CINO_S680 br.process = CINO_S680
@ -261,10 +261,11 @@ class Screwdriver_Detection(QtWidgets.QMainWindow, Ui_Screwdriver_Detection_Wind
print(f'barcodereader error --- {e}') print(f'barcodereader error --- {e}')
try: try:
# 用awm_key從資料庫內讀part_no
read_datas = self.dbwindow.get_aoi_op_master_datas(self.dbwindow.awm_key) 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']) 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.recipe_model = self.get_tool_name_from_ini(read_datas_weightname['para1'].split('.')[0])
self.engineer_mode_window.comboBox_recipe.setCurrentText(self.recipe_model) 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) self.show_aoi_op_master_datas_on_UI(read_datas)
# Enable檢測按鈕
self.pushButton_Load_Recipe.setEnabled(False) self.pushButton_Load_Recipe.setEnabled(False)
self.pushButton_Start.setEnabled(True) self.pushButton_Start.setEnabled(True)
self.pushButton_ReDetect.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': # if self.awm_Key_for_Recipe == 'M11-2303001' and self.dbwindow.awm_key == 'M11-2303001':
# print(self.awm_Key_for_Recipe) # print(self.awm_Key_for_Recipe)
if self.recipe_model == 'Milwaukee': if self.recipe_model == 'Milwaukee': #公單為Milwaukee
threading.Thread(target=self.Start_Thread_Milwaukee, args=()).start() threading.Thread(target=self.Start_Thread_Milwaukee, args=()).start() #進入Milwaukee線程
# -------------------學長之前寫的測試工單------------------------- # -------------------學長之前寫的測試工單-------------------------
# if self.awm_Key_for_Recipe == 'M11-2303002': # if self.awm_Key_for_Recipe == 'M11-2303002':
# threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() # threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start()
# -------------------20250117修改------------------------- # -------------------20250117修改-------------------------
if self.recipe_model == 'KleinTool' or self.recipe_model == 'KleinToolblack': if self.recipe_model == 'KleinTool' or self.recipe_model == 'KleinToolblack': #公單為KleinTool或KleinToolblack
threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() threading.Thread(target=self.Start_Thread_KleinTools_Gray, args=()).start() #進入KleinTool線程
self.real_detect_amount += 1 self.real_detect_amount += 1
def Start_Thread_Milwaukee(self): def Start_Thread_Milwaukee(self):
if self.pushButton_Start.text() == 'System Idle': 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: for sd in self.screwdrives:
sd.Result = self.Result sd.Result = self.Result
sd.image_AI = cv2.cvtColor(self.Result, cv2.COLOR_BGR2GRAY) 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.Result = self.Result
# self.screwdrive.image_AI = cv2.cvtColor(self.Result, cv2.COLOR_BGR2GRAY) # self.screwdrive.image_AI = cv2.cvtColor(self.Result, cv2.COLOR_BGR2GRAY)
# self.screwdrive.Main(1, self.dbwindow.aoi_start) # self.screwdrive.Main(1, self.dbwindow.aoi_start)