mirror of
https://github.com/NanjingForestryUniversity/supermachine--tomato-passion_fruit.git
synced 2025-11-09 14:54:07 +00:00
feat:增加百香果空果拖判断逻辑(如果直径为0,则糖度值也为0,即返回全0数据);添加尺寸转换,现在所有的返回数据均为显示尺寸单位数值(糖度值*1000,绿色占比*100,缺陷面积*100进行数据传输)
This commit is contained in:
parent
b0cf31fd60
commit
f4ce2fa789
@ -417,6 +417,7 @@ class Data_processing:
|
||||
# 初始化统计数据
|
||||
count_black_areas = 0
|
||||
total_pixels_black_areas = 0
|
||||
s = 0.00021973702422145334
|
||||
|
||||
# 对于每个白色区域,查找内部的黑色小区域
|
||||
for contour in contours_white:
|
||||
@ -436,7 +437,7 @@ class Data_processing:
|
||||
total_pixels_black_areas += cv2.contourArea(c)
|
||||
|
||||
number_defects = count_black_areas
|
||||
total_pixels = total_pixels_black_areas
|
||||
total_pixels = total_pixels_black_areas * s
|
||||
return number_defects, total_pixels
|
||||
|
||||
def weight_estimates(self, long_axis, short_axis):
|
||||
@ -451,11 +452,12 @@ class Data_processing:
|
||||
float: 估算的西红柿体积
|
||||
"""
|
||||
density = 0.652228972
|
||||
a = ((long_axis / 535) * 6.3) / 2
|
||||
b = ((short_axis /535) * 6.3) / 2
|
||||
a = ((long_axis / 425) * 6.3) / 2
|
||||
b = ((short_axis / 425) * 6.3) / 2
|
||||
volume = 4 / 3 * np.pi * a * b * b
|
||||
weigth = round(volume * density)
|
||||
return weigth
|
||||
weight = round(volume * density)
|
||||
#重量单位为g
|
||||
return weight
|
||||
def analyze_tomato(self, img):
|
||||
"""
|
||||
分析给定图像,提取和返回西红柿的长径、短径、缺陷数量和缺陷总面积,并返回处理后的图像。
|
||||
@ -490,8 +492,10 @@ class Data_processing:
|
||||
number_defects, total_pixels = self.analyze_defect(new_bin_img)
|
||||
# 将处理后的图像转换为 RGB 格式
|
||||
rp = cv2.cvtColor(org_defect, cv2.COLOR_BGR2RGB)
|
||||
diameter = (long_axis + short_axis) / 2
|
||||
if diameter < 200:
|
||||
#直径单位为cm,所以需要除以10
|
||||
diameter = (long_axis + short_axis) /425 * 63 / 2 / 10
|
||||
# 如果直径小于3,判断为空果拖异常图,则将所有值重置为0
|
||||
if diameter < 3:
|
||||
diameter = 0
|
||||
green_percentage = 0
|
||||
number_defects = 0
|
||||
@ -515,14 +519,15 @@ class Data_processing:
|
||||
max_mask = pf.find_largest_component(combined_mask)
|
||||
contour_mask = self.contour_process(max_mask)
|
||||
long_axis, short_axis = self.analyze_ellipse(contour_mask)
|
||||
weigth = self.weight_estimates(long_axis, short_axis)
|
||||
weight = self.weight_estimates(long_axis, short_axis)
|
||||
number_defects, total_pixels = self.analyze_defect(max_mask)
|
||||
edge = pf.draw_contours_on_image(img, contour_mask)
|
||||
org_defect = pf.bitwise_and_rgb_with_binary(edge, max_mask)
|
||||
rp = cv2.cvtColor(org_defect, cv2.COLOR_BGR2RGB)
|
||||
diameter = (long_axis + short_axis) / 2
|
||||
#直径单位为cm,所以需要除以10
|
||||
diameter = (long_axis + short_axis) /425 * 63 / 2 / 10
|
||||
|
||||
return diameter, weigth, number_defects, total_pixels, rp
|
||||
return diameter, weight, number_defects, total_pixels, rp
|
||||
|
||||
|
||||
# #下面封装的是ResNet18和ResNet34的网络模型构建
|
||||
|
||||
@ -46,14 +46,14 @@ def process_data(cmd: str, images: list, spec: any, dp: Data_processing, pipe: P
|
||||
|
||||
elif cmd == 'PF':
|
||||
# 百香果
|
||||
diameter, weigth, number_defects, total_pixels, rp = dp.analyze_passion_fruit(img)
|
||||
diameter, weight, number_defects, total_pixels, rp = dp.analyze_passion_fruit(img)
|
||||
if i <= 2:
|
||||
diameter_axis_list.append(diameter)
|
||||
max_defect_num = max(max_defect_num, number_defects)
|
||||
max_total_defect_area = max(max_total_defect_area, total_pixels)
|
||||
if i == 1:
|
||||
rp_result = rp
|
||||
weigth = weigth
|
||||
weight = weight
|
||||
|
||||
else:
|
||||
logging.error(f'错误指令,指令为{cmd}')
|
||||
@ -63,14 +63,16 @@ def process_data(cmd: str, images: list, spec: any, dp: Data_processing, pipe: P
|
||||
|
||||
if cmd == 'TO':
|
||||
brix = 0
|
||||
weigth = 0
|
||||
response = pipe.send_data(cmd=cmd, brix=brix, diameter=diameter, green_percentage=gp, weigth=weigth,
|
||||
weight = 0
|
||||
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
|
||||
elif cmd == 'PF':
|
||||
green_percentage = 0
|
||||
brix = detector.predict(spec)
|
||||
response = pipe.send_data(cmd=cmd, brix=brix, green_percentage=green_percentage, diameter=diameter, weigth=weigth,
|
||||
if diameter == 0:
|
||||
brix = 0
|
||||
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
|
||||
|
||||
|
||||
@ -150,17 +150,17 @@ 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')
|
||||
green_percentage = (int.from_bytes(data[4:5], byteorder='big')) / 100
|
||||
diameter = int.from_bytes(data[5:7], byteorder='big')
|
||||
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')
|
||||
total_defect_area = (int.from_bytes(data[10:14], byteorder='big')) / 100
|
||||
heigth = int.from_bytes(data[14:16], byteorder='big')
|
||||
width = int.from_bytes(data[16:18], byteorder='big')
|
||||
rp = data[18:]
|
||||
img = np.frombuffer(rp, dtype=np.uint8).reshape(heigth, width, -1)
|
||||
print(f"指令:{cmd_result}, 糖度值:{brix}, 绿色占比:{green_percentage}, 直径:{diameter}, "
|
||||
f"预估重量:{weight}, 缺陷个数:{defect_num}, 缺陷面积:{total_defect_area}, 结果图的尺寸:{img.shape}")
|
||||
print(f"指令:{cmd_result}, 糖度值:{brix}, 绿色占比:{green_percentage}, 直径:{diameter}cm, "
|
||||
f"预估重量:{weight}g, 缺陷个数:{defect_num}, 缺陷面积:{total_defect_area}cm^2, 结果图的尺寸:{img.shape}")
|
||||
|
||||
|
||||
# 显示结果图像
|
||||
|
||||
@ -159,13 +159,13 @@ class Pipe:
|
||||
spec = np.frombuffer(spec, dtype=np.uint16).reshape((n_rows, n_bands, -1)).transpose(0, 2, 1)
|
||||
return cmd, spec
|
||||
|
||||
def send_data(self,cmd:str, brix, green_percentage, weigth, diameter, defect_num, total_defect_area, rp):
|
||||
def send_data(self,cmd:str, brix, green_percentage, weight, diameter, defect_num, total_defect_area, rp):
|
||||
'''
|
||||
发送数据
|
||||
:param cmd:
|
||||
:param brix:
|
||||
:param green_percentage:
|
||||
:param weigth:
|
||||
:param weight:
|
||||
:param diameter:
|
||||
:param defect_num:
|
||||
:param total_defect_area:
|
||||
@ -195,6 +195,7 @@ class Pipe:
|
||||
img_bytes = img.tobytes()
|
||||
diameter = diameter.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')
|
||||
length = len(img_bytes) + 18
|
||||
length = length.to_bytes(4, byteorder='big')
|
||||
@ -202,22 +203,22 @@ class Pipe:
|
||||
brix = 0
|
||||
brix = brix.to_bytes(2, byteorder='big')
|
||||
gp = green_percentage.to_bytes(1, byteorder='big')
|
||||
weigth = 0
|
||||
weigth = weigth.to_bytes(1, byteorder='big')
|
||||
send_message = length + cmd_re + brix + gp + diameter + weigth + defect_num + total_defect_area + height + width + img_bytes
|
||||
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
|
||||
elif cmd == 'PF':
|
||||
brix = int(brix * 1000).to_bytes(2, byteorder='big')
|
||||
gp = 0
|
||||
gp = gp.to_bytes(1, byteorder='big')
|
||||
weigth = weigth.to_bytes(1, byteorder='big')
|
||||
send_message = length + cmd_re + brix + gp + diameter + weigth + defect_num + total_defect_area + height + width + img_bytes
|
||||
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
|
||||
elif cmd == 'KO':
|
||||
brix = 0
|
||||
brix = brix.to_bytes(2, byteorder='big')
|
||||
gp = 0
|
||||
gp = gp.to_bytes(1, byteorder='big')
|
||||
weigth = 0
|
||||
weigth = weigth.to_bytes(1, byteorder='big')
|
||||
weight = 0
|
||||
weight = weight.to_bytes(1, byteorder='big')
|
||||
defect_num = 0
|
||||
defect_num = defect_num.to_bytes(2, byteorder='big')
|
||||
total_defect_area = 0
|
||||
@ -228,7 +229,7 @@ class Pipe:
|
||||
width = width.to_bytes(2, byteorder='big')
|
||||
img_bytes = np.zeros((100, 100, 3), dtype=np.uint8).tobytes()
|
||||
length = (18).to_bytes(4, byteorder='big')
|
||||
send_message = length + cmd_re + brix + gp + diameter + weigth + defect_num + total_defect_area + height + width + img_bytes
|
||||
send_message = length + cmd_re + brix + gp + diameter + weight + defect_num + total_defect_area + height + width + img_bytes
|
||||
try:
|
||||
win32file.WriteFile(self.rgb_send, send_message)
|
||||
# time.sleep(0.01)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user