fix:修复番茄处理模型bug(返回结果图并未去除绿色叶子部分)

This commit is contained in:
TG 2024-06-26 00:04:17 +08:00
parent 93ae89ece3
commit 1dcd908115
5 changed files with 23 additions and 16 deletions

View File

@ -481,27 +481,30 @@ class Data_processing:
org_defect = tomato.bitwise_and_rgb_with_binary(edge, new_bin_img)
fore = tomato.bitwise_and_rgb_with_binary(img, mask)
fore_g_r_t = tomato.threshold_segmentation(tomato.extract_g_r(fore), threshold=threshold_fore_g_r_t)
res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
nogreen = tomato.bitwise_and_rgb_with_binary(edge, res)
# 统计白色像素点个数
# print(np.sum(fore_g_r_t == 255))
# print(np.sum(mask == 255))
# print(np.sum(fore_g_r_t == 255) / np.sum(mask == 255))
green_percentage = np.sum(fore_g_r_t == 255) / np.sum(mask == 255)
green_percentage = round(green_percentage, 2) * 100
green_percentage = round(green_percentage, 2)
# 获取西红柿的尺寸信息
long_axis, short_axis = self.analyze_ellipse(mask)
# 获取缺陷信息
number_defects, total_pixels = self.analyze_defect(new_bin_img)
# 将处理后的图像转换为 RGB 格式
rp = cv2.cvtColor(org_defect, cv2.COLOR_BGR2RGB)
rp = cv2.cvtColor(nogreen, cv2.COLOR_BGR2RGB)
#直径单位为cm所以需要除以10
diameter = (long_axis + short_axis) /425 * 63 / 2 / 10
# print(f'直径:{diameter}')
# 如果直径小于3判断为空果拖异常图则将所有值重置为0
if diameter < 3:
if diameter < 2.5:
diameter = 0
green_percentage = 0
number_defects = 0
total_pixels = 0
rp = cv2.cvtColor(np.ones((100, 100, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
rp = cv2.cvtColor(np.ones((613, 800, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
return diameter, green_percentage, number_defects, total_pixels, rp
return diameter, green_percentage, number_defects, total_pixels, rp
@ -530,6 +533,7 @@ class Data_processing:
rp = cv2.cvtColor(org_defect, cv2.COLOR_BGR2RGB)
#直径单位为cm所以需要除以10
diameter = (long_axis + short_axis) /425 * 63 / 2 / 10
# print(f'直径:{diameter}')
return diameter, weight, number_defects, total_pixels, rp

View File

@ -42,7 +42,7 @@ def process_data(cmd: str, images: list, spec: any, dp: Data_processing, pipe: P
max_total_defect_area = max(max_total_defect_area, total_pixels)
if i == 1:
rp_result = rp
gp = round(green_percentage)
gp = round(green_percentage, 2)
elif cmd == 'PF':
# 百香果
@ -59,11 +59,13 @@ def process_data(cmd: str, images: list, spec: any, dp: Data_processing, pipe: P
logging.error(f'错误指令,指令为{cmd}')
return False
diameter = round(sum(diameter_axis_list) / 3)
diameter = round(sum(diameter_axis_list) / 3, 2)
if cmd == 'TO':
brix = 0
weight = 0
print(f'预测的brix值为{brix}; 预测的直径为:{diameter}; 预测的重量为:{weight}; 预测的绿色比例为:{gp};'
f' 预测的缺陷数量为:{max_defect_num}; 预测的总缺陷面积为:{max_total_defect_area};')
response = pipe.send_data(cmd=cmd, brix=brix, diameter=diameter, green_percentage=gp, weight=weight,
defect_num=max_defect_num, total_defect_area=max_total_defect_area, rp=rp_result)
return response
@ -72,6 +74,8 @@ def process_data(cmd: str, images: list, spec: any, dp: Data_processing, pipe: P
brix = detector.predict(spec)
if diameter == 0:
brix = 0
# print(f'预测的brix值为{brix}; 预测的直径为:{diameter}; 预测的重量为:{weight}; 预测的绿色比例为:{green_percentage};'
# f' 预测的缺陷数量为:{max_defect_num}; 预测的总缺陷面积为:{max_total_defect_area};')
response = pipe.send_data(cmd=cmd, brix=brix, green_percentage=green_percentage, diameter=diameter, weight=weight,
defect_num=max_defect_num, total_defect_area=max_total_defect_area, rp=rp_result)
return response

View File

@ -74,7 +74,7 @@ class MainWindow(QMainWindow):
spec_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.raw')][:1]
self.send_YR()
for _ in range(20):
for _ in range(5):
for image_path in rgb_files:
img = cv2.imread(image_path, cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
@ -90,7 +90,7 @@ class MainWindow(QMainWindow):
img_data = img.tobytes()
length = (len(img_data) + 6).to_bytes(4, byteorder='big')
# cmd = 'TO'测试番茄数据cmd = 'PF':测试百香果数据
cmd = 'PF'
cmd = 'TO'
data_send = length + cmd.upper().encode('ascii') + height + width + img_data
win32file.WriteFile(self.rgb_send, data_send)
print(f'发送的图像数据长度: {len(data_send)}')
@ -113,7 +113,7 @@ class MainWindow(QMainWindow):
bands = bands.to_bytes(2, byteorder='big')
length = (len(spec_data)+8).to_bytes(4, byteorder='big')
# cmd = 'TO'测试番茄数据cmd = 'PF':测试百香果数据
cmd = 'PF'
cmd = 'TO'
data_send = length + cmd.upper().encode('ascii') + heigth + weight + bands + spec_data
win32file.WriteFile(self.spec_send, data_send)
print(f'发送的光谱数据长度: {len(data_send)}')
@ -151,10 +151,10 @@ class MainWindow(QMainWindow):
cmd_result = data[:2].decode('ascii').strip().upper()
brix = (int.from_bytes(data[2:4], byteorder='big')) / 1000
green_percentage = (int.from_bytes(data[4:5], byteorder='big')) / 100
diameter = int.from_bytes(data[5:7], byteorder='big')
diameter = (int.from_bytes(data[5:7], byteorder='big')) / 100
weight = int.from_bytes(data[7:8], byteorder='big')
defect_num = int.from_bytes(data[8:10], byteorder='big')
total_defect_area = (int.from_bytes(data[10:14], byteorder='big')) / 100
total_defect_area = (int.from_bytes(data[10:14], byteorder='big')) / 1000
heigth = int.from_bytes(data[14:16], byteorder='big')
width = int.from_bytes(data[16:18], byteorder='big')
rp = data[18:]

View File

@ -193,16 +193,15 @@ class Pipe:
height = height.to_bytes(2, byteorder='big')
width = width.to_bytes(2, byteorder='big')
img_bytes = img.tobytes()
diameter = diameter.to_bytes(2, byteorder='big')
diameter = int(diameter * 100).to_bytes(2, byteorder='big')
defect_num = defect_num.to_bytes(2, byteorder='big')
total_defect_area = total_defect_area * 1000
total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
total_defect_area = int(total_defect_area * 1000).to_bytes(4, byteorder='big')
length = len(img_bytes) + 18
length = length.to_bytes(4, byteorder='big')
if cmd == 'TO':
brix = 0
brix = brix.to_bytes(2, byteorder='big')
gp = green_percentage.to_bytes(1, byteorder='big')
gp = int(green_percentage * 100).to_bytes(1, byteorder='big')
weight = 0
weight = weight.to_bytes(1, byteorder='big')
send_message = length + cmd_re + brix + gp + diameter + weight + defect_num + total_defect_area + height + width + img_bytes

View File

@ -211,7 +211,7 @@ def extract_max_connected_area(image_path, lower_hsv, upper_hsv):
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240419RGBtest2\data',
parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\qt_test\TO',
help='the directory path of images')
parser.add_argument('--threshold_s_l', type=int, default=180,
help='the threshold for s_l')