Почему в приложении kivy вместо рамок появляется черный экран ⇐ Python
Почему в приложении kivy вместо рамок появляется черный экран
Итак, у меня есть приложение kivy, которое показывает временные рамки, полученные от серверной программы на ПК. При работе на ПК он работает нормально, но при запуске на телефоне вместо рамок отображается черный экран (только виджет Image — черный экран, все остальное в порядке. Вот kivy (клиентская сторона):
из kivymd.app импортировать MDApp из kivymd.uix.boxlayout импортировать MDBoxLayout из kivymd.uix.button импортировать MDRaishedButton из kivymd.uix.textfield импортировать MDTextField из kivy.uix.image импортировать изображение из kivy.uix.button Кнопка импорта из kivymd.uix.label импорт MDLabel из kivy.clear импорт часов из kivy.graphics.texture импортировать текстуру из kivymd.uix.dialog импорт MDDialog из kivy.uix.popup Всплывающее окно импорта импорт сокета импортировать cv2 импортный маринованный огурец структура импорта из даты и времени импорта даты и времени импорт потоков класс Ангелус (MDApp): защита сборки (сам): макет = MDBoxLayout (ориентация = «вертикальная») self.text= "ПОДКЛЮЧИТЬ" Clock.schedule_once(лямбда dt: self.show_popup(), 0) self.image = Изображение (size_hint = (1, 0,8)) макет.add_widget(self.image) #self.button = MDRaishedButton() self.label = MDLabel(text=self.text, Adaptive_height = Истина, halign='центр', valign='средний') макет.add_widget(self.label) self.counter = 0 self.data = b"" self.payload_size = struct.calcsize("Q") возвратный макет защита show_popup (сам): контент = MDBoxLayout (ориентация = «вертикальная», интервал = «12dp», заполнение = «12dp») text_field = MDTextField( size_hint = (0,84, нет) ) content.add_widget(текстовое_поле) диалог = MDDialog( title='Введите свой IP', md_bg_color=self.theme_cls.bg_dark, size_hint = (0,8, нет), высота=200, auto_dismiss = Ложь, кнопки=[ MDRaisingButton( текст="ПОДКЛЮЧИТЬ", on_release=lambda *args: self.on_ok(dialog, text_field.text) ), ], ) диалог.add_widget(содержание) диалог.открыть() def on_ok(сам, диалог, текст): # Сохраняем введенный текст в переменную self.host_ip = текст self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.data_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #self.host_ip = '192.168.1.8' self.port = 1055 self.port2 = 1077 self.client_socket.connect((self.host_ip, self.port)) self.data_socket.connect((self.host_ip, self.port2)) Clock.schedule_interval(lambda dt: self.update_data(self.data_socket), 1/2) Clock.schedule_interval(lambda dt: self.update_frame(self.client_socket), 1.0/30.0) диалог.отклонить() защита update_frame(self, dt): в то время как len(self.data) < self.payload_size: пакет = self.client_socket.recv(4 * 1024) если не пакет: сломать self.data += пакет package_msg_size = self.data[:self.payload_size] self.data = self.data[self.payload_size:] msg_size = struct.unpack("Q", package_msg_size)[0] в то время как len(self.data) < msg_size: self.data += self.client_socket.recv(4 * 1024) Frame_data = self.data[:msg_size] self.data = self.data[msg_size:] фрейм = Pickle.loads(frame_data) буфер = cv2.flip(frame, 0).tobytes() текстура = Texture.create(size=(frame.shape[1],frame.shape[0]), colorfmt='bgr') текстура.blit_buffer(buffer, colorfmt='bgr',ufferfmt='ubyte') self.image.texture = текстура защита update_data(self, dt): data2 = str(self.data_socket.recv(1024).decode()) self.counter= self.counter +1 печать(данные2[0]) сейчас = дата-время.сейчас() current_time = now.strftime("%H:%M:%S") если (self.counter==1): self.label.text = "ПОДКЛЮЧЕНО" self.label.size_hint_x = Нет self.label.width = self.label.texture_size[0] данные2 = [] elif data2[0] == "5": self.label.text = "ПЕРЕМЕЩЕНО В: " + текущее_время self.label.size_hint_x = Нет self.label.width = self.label.texture_size[0] данные2 = [] Ангелус().запустить() а вот серверная часть:
импортировать cv2 импортировать numpy как np импортировать ОС импортировать тензорный поток как tf импорт сокета импортный маринованный огурец структура импорта из object_detection.utils импортируйте label_map_util из object_detection.utils импортируйте Visualization_utils как viz_utils из object_detection.builders импортируйте model_builder из object_detection.utils импортировать config_util импорт потоков @tf.function защита обнаружения_fn (изображение): изображение, фигуры = обнаружение_модель.препроцесс (изображение) предсказание_дикт = обнаружение_модель.предсказание (изображение, фигуры) обнаружения =Detection_model.postprocess(prediction_dict, shape) обнаружение возврата защита send_frames (image_np_with_detections, client_socket): a = Pickle.dumps(image_np_with_detections) сообщение = struct.pack("Q", len(a)) + a client_socket.sendall (сообщение) server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) data_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) имя_хоста = сокет.getимя_хоста() хост_ip = '192.168.1.8' print('IP-адрес хоста:', host_ip) порт = 1055 порт2= 1077 сокет_адрес = (host_ip, порт) адрес_данных = (ip_хоста, порт2) server_socket.bind(адрес_сокета) data_socket.bind(адрес_данных) TF_RECORD_SCRIPT_NAME = 'generate_tfrecord.py' LABEL_MAP_NAME = 'label_map.pbtxt' пути = { 'CHECKPOINT_PATH': os.path.join('заврсени модели', 'модель jaje'), } файлы = { 'PIPELINE_CONFIG': os.path.join('заврсени модели', 'модель jaje', 'pipeline.config'), 'LABELMAP': os.path.join('zavrseni modeli', 'model jaje', 'label_map.pbtxt') } configs = config_util.get_configs_from_pipeline_file(files['PIPELINE_CONFIG']) Detection_model = model_builder.build(model_config=configs['model'], is_training=False) ckpt = tf.compat.v2.train.Checkpoint(модель=модель_обнаружения) ckpt.restore(os.path.join(paths['CHECKPOINT_PATH'], 'ckpt-31')).expect_partial() Category_index = label_map_util.create_category_index_from_labelmap (файлы['LABELMAP']) крышка = cv2.VideoCapture(0) ширина = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) высота = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) server_socket.listen(5) data_socket.listen(5) print("СЛУШИВАНИЕ: ",socket_address) print("СЛУШИВАНИЕ: ",data_address) client_socket, адрес = server_socket.accept() client_data, addr2 = data_socket.accept() print('ПОЛУЧИЛОСЬ СОЕДИНЕНИЕ ОТ:', адрес) print('ПОЛУЧИЛОСЬ СОЕДИНЕНИЕ ОТ:', addr2) ко=0 в то время как cap.isOpened(): ret, кадр = cap.read() image_np = np.array(frame) если image_np не имеет значения None: input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32) обнаружения =Detect_fn(input_tensor) если обнаружение не имеет значения «Нет»: num_detections = int(detections.pop('num_detections')) обнаружения = {ключ: значение[0, :num_detections].numpy() для ключа, значение в обнаружении.items()} обнаружения['num_detections'] = num_detections обнаружения['detection_classes'] = обнаружения['detection_classes'].astype(np.int64) label_id_offset = 1 image_np_with_detections = image_np.copy() viz_utils.visualize_boxes_and_labels_on_image_array( image_np_with_detections, обнаружения['detection_boxes'], обнаружения['detection_classes'] + label_id_offset, обнаружения['detection_scores'], индекс_категории, use_normalized_coordinates=Истина, max_boxes_to_draw=1, min_score_thresh=.7, agnostic_mode = Ложь) ''' a = Pickle.dumps(image_np_with_detections) сообщение = struct.pack("Q", len(a)) + a client_socket.sendall (сообщение) ''' client_thread = threading.Thread(target=send_frames, args=(image_np_with_detections, client_socket)) client_thread.start() cv2.imshow("Обнаружения",image_np_with_detections) min_score_thresh = 0,7 порог = 0,5 max_scores = max(обнаружения['detection_scores']) для меня в диапазоне (num_detections): box = обнаружения['detection_boxes'] оценка = обнаружения['detection_scores'] если оценка > .7: ymin, xmin, ymax, xmax = box.tolist() pos = ymin + ymax + xmax + xmin print("POS:", pos) print("КО: ",ко) х = абс(поз-ко) распечатать(х) если х>0,05: print("Послато") client_data.send(str(5).encode()) ко = позиция еще : print("ниже послано") ко = позиция еще : client_data.send(str(0).encode()) если cv2.waitKey(10) & 0xFF == ord('q'): крышка.релиз() cv2.destroyAllWindows() client_socket.close() client_data.close() перерыв Я попробовал добавить модуль thread, и он показывает тот же черный экран. И, как вы можете видеть, у меня есть 2 сокета: один для фрейма, другой для данных, и сокет данных работает нормально.
Итак, у меня есть приложение kivy, которое показывает временные рамки, полученные от серверной программы на ПК. При работе на ПК он работает нормально, но при запуске на телефоне вместо рамок отображается черный экран (только виджет Image — черный экран, все остальное в порядке. Вот kivy (клиентская сторона):
из kivymd.app импортировать MDApp из kivymd.uix.boxlayout импортировать MDBoxLayout из kivymd.uix.button импортировать MDRaishedButton из kivymd.uix.textfield импортировать MDTextField из kivy.uix.image импортировать изображение из kivy.uix.button Кнопка импорта из kivymd.uix.label импорт MDLabel из kivy.clear импорт часов из kivy.graphics.texture импортировать текстуру из kivymd.uix.dialog импорт MDDialog из kivy.uix.popup Всплывающее окно импорта импорт сокета импортировать cv2 импортный маринованный огурец структура импорта из даты и времени импорта даты и времени импорт потоков класс Ангелус (MDApp): защита сборки (сам): макет = MDBoxLayout (ориентация = «вертикальная») self.text= "ПОДКЛЮЧИТЬ" Clock.schedule_once(лямбда dt: self.show_popup(), 0) self.image = Изображение (size_hint = (1, 0,8)) макет.add_widget(self.image) #self.button = MDRaishedButton() self.label = MDLabel(text=self.text, Adaptive_height = Истина, halign='центр', valign='средний') макет.add_widget(self.label) self.counter = 0 self.data = b"" self.payload_size = struct.calcsize("Q") возвратный макет защита show_popup (сам): контент = MDBoxLayout (ориентация = «вертикальная», интервал = «12dp», заполнение = «12dp») text_field = MDTextField( size_hint = (0,84, нет) ) content.add_widget(текстовое_поле) диалог = MDDialog( title='Введите свой IP', md_bg_color=self.theme_cls.bg_dark, size_hint = (0,8, нет), высота=200, auto_dismiss = Ложь, кнопки=[ MDRaisingButton( текст="ПОДКЛЮЧИТЬ", on_release=lambda *args: self.on_ok(dialog, text_field.text) ), ], ) диалог.add_widget(содержание) диалог.открыть() def on_ok(сам, диалог, текст): # Сохраняем введенный текст в переменную self.host_ip = текст self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.data_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #self.host_ip = '192.168.1.8' self.port = 1055 self.port2 = 1077 self.client_socket.connect((self.host_ip, self.port)) self.data_socket.connect((self.host_ip, self.port2)) Clock.schedule_interval(lambda dt: self.update_data(self.data_socket), 1/2) Clock.schedule_interval(lambda dt: self.update_frame(self.client_socket), 1.0/30.0) диалог.отклонить() защита update_frame(self, dt): в то время как len(self.data) < self.payload_size: пакет = self.client_socket.recv(4 * 1024) если не пакет: сломать self.data += пакет package_msg_size = self.data[:self.payload_size] self.data = self.data[self.payload_size:] msg_size = struct.unpack("Q", package_msg_size)[0] в то время как len(self.data) < msg_size: self.data += self.client_socket.recv(4 * 1024) Frame_data = self.data[:msg_size] self.data = self.data[msg_size:] фрейм = Pickle.loads(frame_data) буфер = cv2.flip(frame, 0).tobytes() текстура = Texture.create(size=(frame.shape[1],frame.shape[0]), colorfmt='bgr') текстура.blit_buffer(buffer, colorfmt='bgr',ufferfmt='ubyte') self.image.texture = текстура защита update_data(self, dt): data2 = str(self.data_socket.recv(1024).decode()) self.counter= self.counter +1 печать(данные2[0]) сейчас = дата-время.сейчас() current_time = now.strftime("%H:%M:%S") если (self.counter==1): self.label.text = "ПОДКЛЮЧЕНО" self.label.size_hint_x = Нет self.label.width = self.label.texture_size[0] данные2 = [] elif data2[0] == "5": self.label.text = "ПЕРЕМЕЩЕНО В: " + текущее_время self.label.size_hint_x = Нет self.label.width = self.label.texture_size[0] данные2 = [] Ангелус().запустить() а вот серверная часть:
импортировать cv2 импортировать numpy как np импортировать ОС импортировать тензорный поток как tf импорт сокета импортный маринованный огурец структура импорта из object_detection.utils импортируйте label_map_util из object_detection.utils импортируйте Visualization_utils как viz_utils из object_detection.builders импортируйте model_builder из object_detection.utils импортировать config_util импорт потоков @tf.function защита обнаружения_fn (изображение): изображение, фигуры = обнаружение_модель.препроцесс (изображение) предсказание_дикт = обнаружение_модель.предсказание (изображение, фигуры) обнаружения =Detection_model.postprocess(prediction_dict, shape) обнаружение возврата защита send_frames (image_np_with_detections, client_socket): a = Pickle.dumps(image_np_with_detections) сообщение = struct.pack("Q", len(a)) + a client_socket.sendall (сообщение) server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) data_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) имя_хоста = сокет.getимя_хоста() хост_ip = '192.168.1.8' print('IP-адрес хоста:', host_ip) порт = 1055 порт2= 1077 сокет_адрес = (host_ip, порт) адрес_данных = (ip_хоста, порт2) server_socket.bind(адрес_сокета) data_socket.bind(адрес_данных) TF_RECORD_SCRIPT_NAME = 'generate_tfrecord.py' LABEL_MAP_NAME = 'label_map.pbtxt' пути = { 'CHECKPOINT_PATH': os.path.join('заврсени модели', 'модель jaje'), } файлы = { 'PIPELINE_CONFIG': os.path.join('заврсени модели', 'модель jaje', 'pipeline.config'), 'LABELMAP': os.path.join('zavrseni modeli', 'model jaje', 'label_map.pbtxt') } configs = config_util.get_configs_from_pipeline_file(files['PIPELINE_CONFIG']) Detection_model = model_builder.build(model_config=configs['model'], is_training=False) ckpt = tf.compat.v2.train.Checkpoint(модель=модель_обнаружения) ckpt.restore(os.path.join(paths['CHECKPOINT_PATH'], 'ckpt-31')).expect_partial() Category_index = label_map_util.create_category_index_from_labelmap (файлы['LABELMAP']) крышка = cv2.VideoCapture(0) ширина = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) высота = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) server_socket.listen(5) data_socket.listen(5) print("СЛУШИВАНИЕ: ",socket_address) print("СЛУШИВАНИЕ: ",data_address) client_socket, адрес = server_socket.accept() client_data, addr2 = data_socket.accept() print('ПОЛУЧИЛОСЬ СОЕДИНЕНИЕ ОТ:', адрес) print('ПОЛУЧИЛОСЬ СОЕДИНЕНИЕ ОТ:', addr2) ко=0 в то время как cap.isOpened(): ret, кадр = cap.read() image_np = np.array(frame) если image_np не имеет значения None: input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32) обнаружения =Detect_fn(input_tensor) если обнаружение не имеет значения «Нет»: num_detections = int(detections.pop('num_detections')) обнаружения = {ключ: значение[0, :num_detections].numpy() для ключа, значение в обнаружении.items()} обнаружения['num_detections'] = num_detections обнаружения['detection_classes'] = обнаружения['detection_classes'].astype(np.int64) label_id_offset = 1 image_np_with_detections = image_np.copy() viz_utils.visualize_boxes_and_labels_on_image_array( image_np_with_detections, обнаружения['detection_boxes'], обнаружения['detection_classes'] + label_id_offset, обнаружения['detection_scores'], индекс_категории, use_normalized_coordinates=Истина, max_boxes_to_draw=1, min_score_thresh=.7, agnostic_mode = Ложь) ''' a = Pickle.dumps(image_np_with_detections) сообщение = struct.pack("Q", len(a)) + a client_socket.sendall (сообщение) ''' client_thread = threading.Thread(target=send_frames, args=(image_np_with_detections, client_socket)) client_thread.start() cv2.imshow("Обнаружения",image_np_with_detections) min_score_thresh = 0,7 порог = 0,5 max_scores = max(обнаружения['detection_scores']) для меня в диапазоне (num_detections): box = обнаружения['detection_boxes'] оценка = обнаружения['detection_scores'] если оценка > .7: ymin, xmin, ymax, xmax = box.tolist() pos = ymin + ymax + xmax + xmin print("POS:", pos) print("КО: ",ко) х = абс(поз-ко) распечатать(х) если х>0,05: print("Послато") client_data.send(str(5).encode()) ко = позиция еще : print("ниже послано") ко = позиция еще : client_data.send(str(0).encode()) если cv2.waitKey(10) & 0xFF == ord('q'): крышка.релиз() cv2.destroyAllWindows() client_socket.close() client_data.close() перерыв Я попробовал добавить модуль thread, и он показывает тот же черный экран. И, как вы можете видеть, у меня есть 2 сокета: один для фрейма, другой для данных, и сокет данных работает нормально.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение