From f415a480a6b94115f21887c2c0e65b4df4ae4a9d Mon Sep 17 00:00:00 2001
From: "li.zhenye"
Date: Tue, 26 Jul 2022 22:35:07 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=BA=BF=E7=A8=8B?=
=?UTF-8?q?=E6=8E=A5=E6=94=B6=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 1 +
transmit.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 112 insertions(+)
create mode 100644 transmit.py
diff --git a/README.md b/README.md
index 3393cfd..7f8520c 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,7 @@

在新的镜头下,数据的分布和原本的数据已经发生了巨大的变化,根本就不是同一种东西,这就是为什么分类结果会出错了。
+这种情况的出现也和拍摄矫正不到位有关,具体细节询问周超。
## 预测过程的后处理(异色问题)
diff --git a/transmit.py b/transmit.py
new file mode 100644
index 0000000..b990718
--- /dev/null
+++ b/transmit.py
@@ -0,0 +1,111 @@
+import os
+import threading
+from queue import Queue
+import numpy as np
+from config import Config
+
+
+class Receiver(object):
+ def __init__(self):
+ self.output = None
+
+ def set_source(self, *args, **kwargs):
+ """
+ 用于设置数据的来源,每个receiver仅允许有单个来源
+ :param args:
+ :param kwargs:
+ :return:
+ """
+ raise NotImplementedError
+
+ def set_output(self, output: Queue):
+ """
+ 设置单个输出源
+ :param output:
+ :return:
+ """
+ self.output = output
+
+ def start(self, *args, **kwargs):
+ """
+ 启动接收线程或进程
+ :param args:
+ :param kwargs:
+ :return:
+ """
+ raise NotImplementedError
+
+ def stop(self, *args, **kwargs):
+ """
+ 停止接收线程或进程
+ :param args:
+ :param kwargs:
+ :return:
+ """
+ raise NotImplementedError
+
+
+class FifoReceiver(Receiver):
+ def __init__(self, fifo_path: str, output: Queue, read_max_num: int):
+ super().__init__()
+ self._input_fifo_path = None
+ self._output_queue = None
+ self._max_len = read_max_num
+
+ self.set_source(fifo_path)
+ self.set_output(output)
+ self._need_stop = threading.Event()
+ self._need_stop.clear()
+
+ def set_source(self, fifo_path: str):
+ if not os.access(fifo_path, os.F_OK):
+ os.mkfifo(fifo_path, 0o777)
+ self._input_fifo_path = fifo_path
+
+ def set_output(self, output: Queue):
+ self._output_queue = output
+
+ def start(self, post_process_func=None, name='fifo_receiver'):
+ x = threading.Thread(target=self._receive_thread_func,
+ name=name, args=(post_process_func, ))
+ x.start()
+
+ def stop(self):
+ self._need_stop.set()
+
+ def _receive_thread_func(self, post_process_func=None):
+ """
+ 接收线程
+
+ :param post_process_func:
+ :return:
+ """
+ while not self._need_stop.is_set():
+ input_fifo = os.open(self._input_fifo_path, os.O_RDONLY)
+ data = os.read(input_fifo, self._max_len)
+ if post_process_func is not None:
+ data = post_process_func(data)
+ self._output_queue.put(data)
+ os.close(input_fifo)
+ self._need_stop.clear()
+
+ @staticmethod
+ def spec_data_post_process(data):
+ if len(data) < 3:
+ threshold = int(float(data))
+ print("[INFO] Get Spec threshold: ", threshold)
+ return threshold
+ else:
+ spec_img = np.frombuffer(data, dtype=np.float32).\
+ reshape((Config.nRows, Config.nBands, -1)).transpose(0, 2, 1)
+ return spec_img
+
+ @staticmethod
+ def rgb_data_post_process(data):
+ if len(data) < 3:
+ threshold = int(float(data))
+ print("[INFO] Get RGB threshold: ", threshold)
+ return threshold
+ else:
+ rgb_img = np.frombuffer(data, dtype=np.uint8).reshape((Config.nRgbRows, Config.nRgbCols, -1))
+ return rgb_img