mirror of
https://github.com/NanjingForestryUniversity/supermachine--tomato-passion_fruit.git
synced 2025-11-09 14:54:07 +00:00
feat:新增管道预热;修改通信协议,添加预热数据格式。
This commit is contained in:
parent
a4c305e3ea
commit
28d403fba7
12
20240529RGBtest3/config.py
Normal file
12
20240529RGBtest3/config.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Time : 2024/6/17 下午3:36
|
||||||
|
# @Author : TG
|
||||||
|
# @File : config.py
|
||||||
|
# @Software: PyCharm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
#文件相关参数
|
||||||
|
#预热参数
|
||||||
|
n_rows, n_cols, n_channels = 256, 256, 3
|
||||||
@ -89,50 +89,56 @@ def main(is_debug=False):
|
|||||||
_ = detector.predict(np.ones((30, 30, 224), dtype=np.uint16))
|
_ = detector.predict(np.ones((30, 30, 224), dtype=np.uint16))
|
||||||
_, _, _, _, _ =dp.analyze_tomato(cv2.imread(r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\tomato_img\bad\71.bmp'))
|
_, _, _, _, _ =dp.analyze_tomato(cv2.imread(r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\tomato_img\bad\71.bmp'))
|
||||||
_, _, _, _, _ = dp.analyze_passion_fruit(cv2.imread(r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\passion_fruit_img\38.bmp'))
|
_, _, _, _, _ = dp.analyze_passion_fruit(cv2.imread(r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\passion_fruit_img\38.bmp'))
|
||||||
print('初始化完成')
|
# print('初始化完成')
|
||||||
|
|
||||||
rgb_receive_name = r'\\.\pipe\rgb_receive'
|
rgb_receive_name = r'\\.\pipe\rgb_receive'
|
||||||
rgb_send_name = r'\\.\pipe\rgb_send'
|
rgb_send_name = r'\\.\pipe\rgb_send'
|
||||||
spec_receive_name = r'\\.\pipe\spec_receive'
|
spec_receive_name = r'\\.\pipe\spec_receive'
|
||||||
pipe = Pipe(rgb_receive_name, rgb_send_name, spec_receive_name)
|
pipe = Pipe(rgb_receive_name, rgb_send_name, spec_receive_name)
|
||||||
rgb_receive, rgb_send, spec_receive = pipe.create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name)
|
rgb_receive, rgb_send, spec_receive = pipe.create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name)
|
||||||
|
# 预热循环,只处理cmd为'YR'的数据
|
||||||
|
while True:
|
||||||
|
data = pipe.receive_rgb_data(rgb_receive)
|
||||||
|
cmd, _ = pipe.parse_img(data)
|
||||||
|
if cmd != 'YR':
|
||||||
|
break # 当接收到的不是预热命令时,结束预热循环
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
images = []
|
images = []
|
||||||
cmd = None
|
cmd = None
|
||||||
for _ in range(5):
|
for _ in range(5):
|
||||||
start_time1 = time.time()
|
# start_time1 = time.time()
|
||||||
data = pipe.receive_rgb_data(rgb_receive)
|
data = pipe.receive_rgb_data(rgb_receive)
|
||||||
end_time10 = time.time()
|
# end_time10 = time.time()
|
||||||
print(f'接收一份数据时间:{end_time10 - start_time1}秒')
|
# print(f'接收一份数据时间:{end_time10 - start_time1}秒')
|
||||||
start_time11 = time.time()
|
# start_time11 = time.time()
|
||||||
cmd, img = pipe.parse_img(data)
|
cmd, img = pipe.parse_img(data)
|
||||||
end_time1 = time.time()
|
# end_time1 = time.time()
|
||||||
print(f'处理一份数据时间:{end_time1 - start_time11}秒')
|
# print(f'处理一份数据时间:{end_time1 - start_time11}秒')
|
||||||
print(f'接收1张图时间:{end_time1 - start_time1}秒')
|
# print(f'接收1张图时间:{end_time1 - start_time1}秒')
|
||||||
# print(cmd, img.shape)
|
# print(cmd, img.shape)
|
||||||
# #打印img的数据类型
|
# #打印img的数据类型
|
||||||
# print(img.dtype)
|
# print(img.dtype)
|
||||||
images.append(img)
|
images.append(img)
|
||||||
# print(len(images))
|
# print(len(images))
|
||||||
if cmd not in ['TO', 'PF']:
|
if cmd not in ['TO', 'PF', 'YR']:
|
||||||
logging.error(f'错误指令,指令为{cmd}')
|
logging.error(f'错误指令,指令为{cmd}')
|
||||||
continue
|
continue
|
||||||
spec = None
|
spec = None
|
||||||
if cmd == 'PF':
|
if cmd == 'PF':
|
||||||
start_time2 = time.time()
|
# start_time2 = time.time()
|
||||||
spec_data = pipe.receive_spec_data(spec_receive)
|
spec_data = pipe.receive_spec_data(spec_receive)
|
||||||
_, spec = pipe.parse_spec(spec_data)
|
_, spec = pipe.parse_spec(spec_data)
|
||||||
end_time2 = time.time()
|
# end_time2 = time.time()
|
||||||
print(f'接收光谱数据时间:{end_time2 - start_time2}秒')
|
# print(f'接收光谱数据时间:{end_time2 - start_time2}秒')
|
||||||
# print(spec.shape)
|
# print(spec.shape)
|
||||||
start_time3 = time.time()
|
# start_time3 = time.time()
|
||||||
response = process_data(cmd, images, spec, dp, pipe, detector)
|
response = process_data(cmd, images, spec, dp, pipe, detector)
|
||||||
end_time3 = time.time()
|
# end_time3 = time.time()
|
||||||
print(f'处理时间:{end_time3 - start_time3}秒')
|
# print(f'处理时间:{end_time3 - start_time3}秒')
|
||||||
end_time = time.time()
|
end_time = time.time()
|
||||||
print(f'全流程时间:{end_time - start_time}秒')
|
# print(f'全流程时间:{end_time - start_time}秒')
|
||||||
if response:
|
if response:
|
||||||
logging.info(f'处理成功,响应为: {response}')
|
logging.info(f'处理成功,响应为: {response}')
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -109,13 +109,15 @@ class Pipe:
|
|||||||
:return: 指令类型和内容
|
:return: 指令类型和内容
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
assert len(data) > 2
|
assert len(data) > 1
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
logging.error('指令转换失败,长度不足3')
|
logging.error('指令转换失败,长度不足2')
|
||||||
return '', None
|
return '', None
|
||||||
cmd, data = data[:2], data[2:]
|
cmd, data = data[:2], data[2:]
|
||||||
cmd = cmd.decode('ascii').strip().upper()
|
cmd = cmd.decode('ascii').strip().upper()
|
||||||
|
# 如果收到的是预热指令'YR',直接返回命令和None,不处理图像数据
|
||||||
|
if cmd == 'YR':
|
||||||
|
return cmd, None
|
||||||
n_rows, n_cols, img = data[:2], data[2:4], data[4:]
|
n_rows, n_cols, img = data[:2], data[2:4], data[4:]
|
||||||
try:
|
try:
|
||||||
n_rows, n_cols = [int.from_bytes(x, byteorder='big') for x in [n_rows, n_cols]]
|
n_rows, n_cols = [int.from_bytes(x, byteorder='big') for x in [n_rows, n_cols]]
|
||||||
@ -126,7 +128,7 @@ class Pipe:
|
|||||||
assert n_rows * n_cols * 3 == len(img)
|
assert n_rows * n_cols * 3 == len(img)
|
||||||
# 因为是float32类型 所以长度要乘12 ,如果是uint8则乘3
|
# 因为是float32类型 所以长度要乘12 ,如果是uint8则乘3
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
logging.error('图像指令IM转换失败,数据长度错误')
|
logging.error('图像指令转换失败,数据长度错误')
|
||||||
return '', None
|
return '', None
|
||||||
img = np.frombuffer(img, dtype=np.uint8).reshape(n_rows, n_cols, -1)
|
img = np.frombuffer(img, dtype=np.uint8).reshape(n_rows, n_cols, -1)
|
||||||
return cmd, img
|
return cmd, img
|
||||||
|
|||||||
@ -211,7 +211,7 @@ def extract_max_connected_area(image_path, lower_hsv, upper_hsv):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='Process some integers.')
|
parser = argparse.ArgumentParser(description='Process some integers.')
|
||||||
parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\broken',
|
parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240419RGBtest2\data',
|
||||||
help='the directory path of images')
|
help='the directory path of images')
|
||||||
parser.add_argument('--threshold_s_l', type=int, default=180,
|
parser.add_argument('--threshold_s_l', type=int, default=180,
|
||||||
help='the threshold for s_l')
|
help='the threshold for s_l')
|
||||||
@ -227,8 +227,9 @@ def main():
|
|||||||
otsu_thresholded = otsu_threshold(s_l)
|
otsu_thresholded = otsu_threshold(s_l)
|
||||||
img_fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), otsu_thresholded)
|
img_fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), otsu_thresholded)
|
||||||
img_fore_defect = extract_g_r(img_fore)
|
img_fore_defect = extract_g_r(img_fore)
|
||||||
|
cv2.imshow('img_fore_defect1', img_fore_defect)
|
||||||
img_fore_defect = threshold_segmentation(img_fore_defect, args.threshold_r_b)
|
img_fore_defect = threshold_segmentation(img_fore_defect, args.threshold_r_b)
|
||||||
# cv2.imshow('img_fore_defect', img_fore_defect)
|
cv2.imshow('img_fore_defect2', img_fore_defect)
|
||||||
thresholded_s_l = threshold_segmentation(s_l, args.threshold_s_l)
|
thresholded_s_l = threshold_segmentation(s_l, args.threshold_s_l)
|
||||||
new_bin_img = largest_connected_component(thresholded_s_l)
|
new_bin_img = largest_connected_component(thresholded_s_l)
|
||||||
# zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
|
# zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
|
||||||
@ -239,11 +240,23 @@ def main():
|
|||||||
cv2.imshow('defect', defect)
|
cv2.imshow('defect', defect)
|
||||||
edge, mask = draw_tomato_edge(cv2.imread(img_path), new_bin_img)
|
edge, mask = draw_tomato_edge(cv2.imread(img_path), new_bin_img)
|
||||||
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
|
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
|
||||||
|
|
||||||
|
|
||||||
fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), mask)
|
fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), mask)
|
||||||
|
|
||||||
|
|
||||||
fore_g_r_t = threshold_segmentation(extract_g_r(fore), 20)
|
fore_g_r_t = threshold_segmentation(extract_g_r(fore), 20)
|
||||||
|
#统计白色像素点个数
|
||||||
|
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))
|
||||||
|
|
||||||
fore_g_r_t_ture = bitwise_and_rgb_with_binary(cv2.imread(img_path), fore_g_r_t)
|
fore_g_r_t_ture = bitwise_and_rgb_with_binary(cv2.imread(img_path), fore_g_r_t)
|
||||||
cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
|
# cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
|
||||||
|
org_defect_new = bitwise_and_rgb_with_binary(edge, new_bin_img)
|
||||||
res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
|
res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
|
||||||
|
nogreen = bitwise_and_rgb_with_binary(edge, res)
|
||||||
|
cv2.imshow('nogreen', nogreen)
|
||||||
white = find_reflection(img_path)
|
white = find_reflection(img_path)
|
||||||
|
|
||||||
# SVM预测
|
# SVM预测
|
||||||
@ -260,13 +273,12 @@ def main():
|
|||||||
cv2.imshow('fore', fore)
|
cv2.imshow('fore', fore)
|
||||||
cv2.imshow('fore_g_r_t', fore_g_r_t)
|
cv2.imshow('fore_g_r_t', fore_g_r_t)
|
||||||
cv2.imshow('mask', mask)
|
cv2.imshow('mask', mask)
|
||||||
print('mask', mask.shape)
|
|
||||||
print('filled', filled_img.shape)
|
|
||||||
print('largest', new_bin_img.shape)
|
|
||||||
print('rp', org_defect.shape)
|
|
||||||
cv2.imshow('res', res)
|
cv2.imshow('res', res)
|
||||||
|
|
||||||
|
# lower_hsv = np.array([19, 108, 15])
|
||||||
|
# upper_hsv = np.array([118, 198, 134])
|
||||||
|
# max_connected_area = extract_max_connected_area(img_path, lower_hsv, upper_hsv)
|
||||||
|
# cv2.imshow('Max Connected Area', max_connected_area)
|
||||||
|
|
||||||
# 显示原始图像
|
# 显示原始图像
|
||||||
original_img = cv2.imread(img_path)
|
original_img = cv2.imread(img_path)
|
||||||
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
| 指令1 | 指令2 | 指令含义 |
|
| 指令1 | 指令2 | 指令含义 |
|
||||||
| :---: | :---: | :----------: |
|
| :---: | :---: | :----------: |
|
||||||
|
| Y | R | 预热数据 |
|
||||||
| T | O | 番茄数据 |
|
| T | O | 番茄数据 |
|
||||||
| P | F | 百香果数据 |
|
| P | F | 百香果数据 |
|
||||||
| R | E | 返回结果数据 |
|
| R | E | 返回结果数据 |
|
||||||
@ -25,6 +26,10 @@
|
|||||||
|
|
||||||
## **数据**
|
## **数据**
|
||||||
|
|
||||||
|
**预热数据包:‘Y’‘R’**,不包含数据字段,仅有**长度字段+指令字段**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**RGB图像数据包:'指令1''指令2 '**,`数据1`~`数据i`包含了图像的行数rows(高度)、列数cols(宽度)、以及图像的RGB数据,组合方式为**高度+宽度+RGB数据**
|
**RGB图像数据包:'指令1''指令2 '**,`数据1`~`数据i`包含了图像的行数rows(高度)、列数cols(宽度)、以及图像的RGB数据,组合方式为**高度+宽度+RGB数据**
|
||||||
$$
|
$$
|
||||||
i-4=rows \times cols \times 3
|
i-4=rows \times cols \times 3
|
||||||
@ -49,8 +54,6 @@ $$
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**返回结果数据包:'R''E'**,`数据1`~`数据i`包含了糖度值Brix、颜色占比color、直径long、预估重量weight、缺陷个数num、缺陷面积area、结果图像的行数rows(高度)、列数cols(宽度)、以及结果图像的RGB数据,组合方式为**糖度值+颜色占比+直径+预估重量+缺陷个数+缺陷面积+高度+宽度+RGB数据**
|
**返回结果数据包:'R''E'**,`数据1`~`数据i`包含了糖度值Brix、颜色占比color、直径long、预估重量weight、缺陷个数num、缺陷面积area、结果图像的行数rows(高度)、列数cols(宽度)、以及结果图像的RGB数据,组合方式为**糖度值+颜色占比+直径+预估重量+缺陷个数+缺陷面积+高度+宽度+RGB数据**
|
||||||
$$
|
$$
|
||||||
i-16=rows \times cols \times 3
|
i-16=rows \times cols \times 3
|
||||||
@ -61,4 +64,6 @@ $$
|
|||||||
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | --- | --- | --- | --- |
|
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | --- | --- | --- | --- |
|
||||||
| Brix[15:8] | Brix[7:0] | color[7:0] | long[15:8] | long[7:0] | weight[7:0] | num[15:8] | num[7:0] | area[31:24] | area[23:16] | area[15:8] | area[7:0] | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | ... | |
|
| Brix[15:8] | Brix[7:0] | color[7:0] | long[15:8] | long[7:0] | weight[7:0] | num[15:8] | num[7:0] | area[31:24] | area[23:16] | area[15:8] | area[7:0] | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | ... | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**返回空果数据包:‘K’‘O’**,不包含数据字段,仅有**长度字段+指令字段**
|
**返回空果数据包:‘K’‘O’**,不包含数据字段,仅有**长度字段+指令字段**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user