yolo小damo合集

 效果如下:这个是图片检测

 效果如下:这个是视频检测 

 效果如下:这个是摄像头检测 

1 相关库

除了yolov11所用库之外,本文所用到的额外库为pyqt5,输入指令进行安装

pip install pyqt5
导入所需要的库
import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap, QIcon
import cv2
from ultralytics import YOLO

2 界面

使用pyqt5进行界面创作

"""初始化主窗口。这个方法设置了窗口的标题、图标、大小,并初始化了各种组件,如标签、按钮、布局等。还创建了用于摄像头检测的定时器,并设置了初始状态为未暂停。"""super().__init__()# 设置窗口标题self.setWindowTitle("@author:晓晓")# self.setWindowIcon(QIcon("icon.png"))# 设置窗口大小self.setGeometry(300, 150, 800, 400)# 创建两个QLabel分别显示左右图像# 左侧图像标签,用于显示原始图像self.label1 = QLabel()# 设置标签内容居中对齐self.label1.setAlignment(Qt.AlignCenter)# 设置标签最小尺寸self.label1.setMinimumSize(580, 450)  # 设置标签样式,添加边框并设置背景颜色为黑色self.label1.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 右侧图像标签,用于显示检测后的图像self.label2 = QLabel()# 设置标签内容居中对齐self.label2.setAlignment(Qt.AlignCenter)# 设置标签最小尺寸self.label2.setMinimumSize(580, 450)  # 设置标签样式,添加边框并设置背景颜色为黑色self.label2.setStyleSheet('border:3px solid #6950a1; background-color: black;')  ###摄像头检测# 用于存储摄像头对象self.camera = None  # 定时器,用于定时从摄像头获取帧self.camera_timer = QTimer()  # 定时器超时连接到更新摄像头帧的方法self.camera_timer.timeout.connect(self.update_camera_frame)  # 新增属性,用于标记视频检测是否暂停self.is_video_paused = False# 新增属性,用于标记摄像头检测是否暂停self.is_camera_paused = False# 水平布局,用于放置左右两个QLabellayout = QVBoxLayout()# layout.addWidget(self.label1)hbox_video = QHBoxLayout()# 在水平布局中添加左侧标签,用于显示原始图像hbox_video.addWidget(self.label1)  # 在水平布局中添加右侧标签,用于显示检测后的图像hbox_video.addWidget(self.label2)  # 将水平布局添加到垂直布局中layout.addLayout(hbox_video)# 创建Worker对象self.worker = Worker()# 创建按钮布局hbox_buttons = QHBoxLayout()# 添加模型选择按钮self.load_model_button = QPushButton("📁模型选择")# 点击按钮时连接到load_model方法self.load_model_button.clicked.connect(self.load_model)# 设置按钮固定大小self.load_model_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.load_model_button)# 添加图片检测按钮self.image_detect_button = QPushButton("💾图片检测")# 点击按钮时连接到detect_image方法self.image_detect_button.clicked.connect(self.detect_image)# 初始状态下禁用按钮self.image_detect_button.setEnabled(False)# 设置按钮固定大小self.image_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.image_detect_button)# 添加视频检测按钮self.video_detect_button = QPushButton("🎬视频检测")# 点击按钮时连接到detect_video_start方法self.video_detect_button.clicked.connect(self.detect_video_start)# 初始状态下禁用按钮self.video_detect_button.setEnabled(False)# 设置按钮固定大小self.video_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.video_detect_button)# 添加摄像头检测按钮self.camera_detect_button = QPushButton("📷摄像头检测")# 点击按钮时连接到start_camera_detection方法self.camera_detect_button.clicked.connect(self.start_camera_detection)# 初始状态下禁用按钮self.camera_detect_button.setEnabled(False)# 设置按钮固定大小self.camera_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.camera_detect_button)# 添加显示检测物体按钮self.display_objects_button = QPushButton("🔍显示检测物体")# 点击按钮时连接到show_detected_objects方法self.display_objects_button.clicked.connect(self.show_detected_objects)# 初始状态下禁用按钮self.display_objects_button.setEnabled(False)# 设置按钮固定大小self.display_objects_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.display_objects_button)# 添加退出按钮self.exit_button = QPushButton("❌退出")# 点击按钮时连接到exit_application方法self.exit_button.clicked.connect(self.exit_application)# 设置按钮固定大小self.exit_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.exit_button)# 将按钮布局添加到垂直布局中layout.addLayout(hbox_buttons)# 创建中心部件central_widget = QWidget()# 设置中心部件的布局central_widget.setLayout(layout)# 设置窗口的中心部件self.setCentralWidget(central_widget)# 用于存储当前检测结果self.current_results = None

3实现

每个部分的按钮实现

    def detect_image(self):if self.camera_timer.isActive():  # 判断摄像头检测是否正在运行,如果是则关闭self.camera_timer.stop()if self.camera is not None:self.camera.release()image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")if image_path:image = cv2.imread(image_path)if image is not None:self.current_results = self.worker.model.predict(image)if self.current_results:annotated_image = self.current_results[0].plot()image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGBheight1, width1, channel1 = image_rgb.shapebytesPerLine1 = 3 * width1qimage1 = QImage(image_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap1 = QPixmap.fromImage(qimage1)self.label1.setPixmap(pixmap1.scaled(self.label1.size(), Qt.KeepAspectRatio))annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)  # 转换为RGBheight2, width2, channel2 = annotated_image.shapebytesPerLine2 = 3 * width2qimage2 = QImage(annotated_image.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap2 = QPixmap.fromImage(qimage2)self.label2.setPixmap(pixmap2.scaled(self.label2.size(), Qt.KeepAspectRatio))def detect_video_start(self):if self.camera_timer.isActive():  # 判断摄像头检测是否正在运行,如果是则关闭self.camera_timer.stop()if self.camera is not None:self.camera.release()video_path, _ = QFileDialog.getOpenFileName(None, "选择视频文件", "", "视频文件 (*.mp4 *.avi)")if video_path:cap = cv2.VideoCapture(video_path)while cap.isOpened():success, frame = cap.read()if success:frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)height1, width1, channel1 = frame_rgb.shapebytesPerLine1 = 3 * width1qimage = QImage(frame_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label1.setPixmap(pixmap.scaled(self.label1.size(), Qt.KeepAspectRatio))results = self.worker.model.predict(frame)# Visualize the results on the frameannotated_frame = results[0].plot()frame_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)height2, width2, channel2 = frame_rgb.shapebytesPerLine2 = 3 * width2qimage = QImage(frame_rgb.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label2.setPixmap(pixmap.scaled(self.label2.size(), Qt.KeepAspectRatio))if cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# Break the loop if the end of the video is reachedbreak# Release the video capture object and close the display windowcap.release()cv2.destroyAllWindows()def start_camera_detection(self):self.camera = cv2.VideoCapture(0)  # 打开默认摄像头(索引为0)if self.camera.isOpened():self.camera_timer.start(30)  # 设置定时器间隔,每30毫秒更新一帧else:QMessageBox.warning(self, "摄像头错误", "无法打开摄像头,请检查设备是否连接正常。")def update_camera_frame(self):success, frame = self.camera.read()if success:# 对获取到的摄像头帧进行水平翻转,实现镜像效果frame = cv2.flip(frame, 1)frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)height1, width1, channel1 = frame_rgb.shapebytesPerLine1 = 3 * width1qimage = QImage(frame_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label1.setPixmap(pixmap.scaled(self.label1.size(), Qt.KeepAspectRatio))results = self.worker.model.predict(frame)# 此处修改,将每次摄像头检测的结果都更新到self.current_results中(以列表形式存储每次结果)if self.current_results is None:self.current_results = []self.current_results.clear()self.current_results.append(results)annotated_frame = results[0].plot()frame_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)height2, width2, channel2 = frame_rgb.shapebytesPerLine2 = 3 * width2qimage = QImage(frame_rgb.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label2.setPixmap(pixmap.scaled(self.label2.size(), Qt.KeepAspectRatio))else:self.camera_timer.stop()self.camera.release()QMessageBox.warning(self, "摄像头错误", "摄像头读取失败,请检查设备是否正常工作。")def show_detected_objects(self):if self.current_results:all_det_info = []for result in self.current_results:det_info = result[0].boxes.clsall_det_info.extend(det_info.tolist())object_count = len(all_det_info)object_info = f"识别到的物体总个数:{object_count}\n"object_dict = {}class_names_dict = self.current_results[0][0].namesfor class_id in all_det_info:class_name = class_names_dict[int(class_id)]if class_name in object_dict:object_dict[class_name] += 1else:object_dict[class_name] = 1sorted_objects = sorted(object_dict.items(), key=lambda x: x[1], reverse=True)for obj_name, obj_count in sorted_objects:object_info += f"{obj_name}: {obj_count}\n"if self.video_detect_button.isEnabled() and self.video_detect_button.isChecked():self.is_video_paused = Trueelif self.camera_detect_button.isEnabled() and self.camera_detect_button.isChecked():self.is_camera_paused = Truemsg_box = QMessageBox(self)msg_box.setWindowTitle("识别结果")msg_box.setText(object_info)msg_box.finished.connect(self.resume_detection)msg_box.exec_()else:self.show_message_box("识别结果", "未检测到物体")def show_message_box(self, title, message):msg_box = QMessageBox(self)msg_box.setWindowTitle(title)msg_box.setText(message)msg_box.exec_()def load_model(self):if self.worker.load_model():self.image_detect_button.setEnabled(True)self.display_objects_button.setEnabled(True)self.video_detect_button.setEnabled(True)self.camera_detect_button.setEnabled(True)def resume_detection(self):if self.is_video_paused:self.is_video_paused = Falseelif self.is_camera_paused:self.is_camera_paused = Falsedef exit_application(self):# 终止程序运行sys.exit()

4总代码

import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap, QIcon
import cv2
from ultralytics import YOLOclass Worker:def __init__(self):self.model = Nonedef load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "选择模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)return self.model is not Nonereturn Falseclass MainWindow(QMainWindow):def __init__(self):"""初始化主窗口。这个方法设置了窗口的标题、图标、大小,并初始化了各种组件,如标签、按钮、布局等。还创建了用于摄像头检测的定时器,并设置了初始状态为未暂停。"""super().__init__()# 设置窗口标题self.setWindowTitle("@author:晓晓")# self.setWindowIcon(QIcon("icon.png"))# 设置窗口大小self.setGeometry(300, 150, 800, 400)# 创建两个QLabel分别显示左右图像# 左侧图像标签,用于显示原始图像self.label1 = QLabel()# 设置标签内容居中对齐self.label1.setAlignment(Qt.AlignCenter)# 设置标签最小尺寸self.label1.setMinimumSize(580, 450)  # 设置标签样式,添加边框并设置背景颜色为黑色self.label1.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 右侧图像标签,用于显示检测后的图像self.label2 = QLabel()# 设置标签内容居中对齐self.label2.setAlignment(Qt.AlignCenter)# 设置标签最小尺寸self.label2.setMinimumSize(580, 450)  # 设置标签样式,添加边框并设置背景颜色为黑色self.label2.setStyleSheet('border:3px solid #6950a1; background-color: black;')  ###摄像头检测# 用于存储摄像头对象self.camera = None  # 定时器,用于定时从摄像头获取帧self.camera_timer = QTimer()  # 定时器超时连接到更新摄像头帧的方法self.camera_timer.timeout.connect(self.update_camera_frame)  # 新增属性,用于标记视频检测是否暂停self.is_video_paused = False# 新增属性,用于标记摄像头检测是否暂停self.is_camera_paused = False# 水平布局,用于放置左右两个QLabellayout = QVBoxLayout()# layout.addWidget(self.label1)hbox_video = QHBoxLayout()# 在水平布局中添加左侧标签,用于显示原始图像hbox_video.addWidget(self.label1)  # 在水平布局中添加右侧标签,用于显示检测后的图像hbox_video.addWidget(self.label2)  # 将水平布局添加到垂直布局中layout.addLayout(hbox_video)# 创建Worker对象self.worker = Worker()# 创建按钮布局hbox_buttons = QHBoxLayout()# 添加模型选择按钮self.load_model_button = QPushButton("📁模型选择")# 点击按钮时连接到load_model方法self.load_model_button.clicked.connect(self.load_model)# 设置按钮固定大小self.load_model_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.load_model_button)# 添加图片检测按钮self.image_detect_button = QPushButton("💾图片检测")# 点击按钮时连接到detect_image方法self.image_detect_button.clicked.connect(self.detect_image)# 初始状态下禁用按钮self.image_detect_button.setEnabled(False)# 设置按钮固定大小self.image_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.image_detect_button)# 添加视频检测按钮self.video_detect_button = QPushButton("🎬视频检测")# 点击按钮时连接到detect_video_start方法self.video_detect_button.clicked.connect(self.detect_video_start)# 初始状态下禁用按钮self.video_detect_button.setEnabled(False)# 设置按钮固定大小self.video_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.video_detect_button)# 添加摄像头检测按钮self.camera_detect_button = QPushButton("📷摄像头检测")# 点击按钮时连接到start_camera_detection方法self.camera_detect_button.clicked.connect(self.start_camera_detection)# 初始状态下禁用按钮self.camera_detect_button.setEnabled(False)# 设置按钮固定大小self.camera_detect_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.camera_detect_button)# 添加显示检测物体按钮self.display_objects_button = QPushButton("🔍显示检测物体")# 点击按钮时连接到show_detected_objects方法self.display_objects_button.clicked.connect(self.show_detected_objects)# 初始状态下禁用按钮self.display_objects_button.setEnabled(False)# 设置按钮固定大小self.display_objects_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.display_objects_button)# 添加退出按钮self.exit_button = QPushButton("❌退出")# 点击按钮时连接到exit_application方法self.exit_button.clicked.connect(self.exit_application)# 设置按钮固定大小self.exit_button.setFixedSize(120, 30)# 将按钮添加到按钮布局中hbox_buttons.addWidget(self.exit_button)# 将按钮布局添加到垂直布局中layout.addLayout(hbox_buttons)# 创建中心部件central_widget = QWidget()# 设置中心部件的布局central_widget.setLayout(layout)# 设置窗口的中心部件self.setCentralWidget(central_widget)# 用于存储当前检测结果self.current_results = Nonedef detect_image(self):if self.camera_timer.isActive():  # 判断摄像头检测是否正在运行,如果是则关闭self.camera_timer.stop()if self.camera is not None:self.camera.release()image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")if image_path:image = cv2.imread(image_path)if image is not None:self.current_results = self.worker.model.predict(image)if self.current_results:annotated_image = self.current_results[0].plot()image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGBheight1, width1, channel1 = image_rgb.shapebytesPerLine1 = 3 * width1qimage1 = QImage(image_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap1 = QPixmap.fromImage(qimage1)self.label1.setPixmap(pixmap1.scaled(self.label1.size(), Qt.KeepAspectRatio))annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)  # 转换为RGBheight2, width2, channel2 = annotated_image.shapebytesPerLine2 = 3 * width2qimage2 = QImage(annotated_image.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap2 = QPixmap.fromImage(qimage2)self.label2.setPixmap(pixmap2.scaled(self.label2.size(), Qt.KeepAspectRatio))def detect_video_start(self):if self.camera_timer.isActive():  # 判断摄像头检测是否正在运行,如果是则关闭self.camera_timer.stop()if self.camera is not None:self.camera.release()video_path, _ = QFileDialog.getOpenFileName(None, "选择视频文件", "", "视频文件 (*.mp4 *.avi)")if video_path:cap = cv2.VideoCapture(video_path)while cap.isOpened():success, frame = cap.read()if success:frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)height1, width1, channel1 = frame_rgb.shapebytesPerLine1 = 3 * width1qimage = QImage(frame_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label1.setPixmap(pixmap.scaled(self.label1.size(), Qt.KeepAspectRatio))results = self.worker.model.predict(frame)# Visualize the results on the frameannotated_frame = results[0].plot()frame_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)height2, width2, channel2 = frame_rgb.shapebytesPerLine2 = 3 * width2qimage = QImage(frame_rgb.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label2.setPixmap(pixmap.scaled(self.label2.size(), Qt.KeepAspectRatio))if cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# Break the loop if the end of the video is reachedbreak# Release the video capture object and close the display windowcap.release()cv2.destroyAllWindows()def start_camera_detection(self):self.camera = cv2.VideoCapture(0)  # 打开默认摄像头(索引为0)if self.camera.isOpened():self.camera_timer.start(30)  # 设置定时器间隔,每30毫秒更新一帧else:QMessageBox.warning(self, "摄像头错误", "无法打开摄像头,请检查设备是否连接正常。")def update_camera_frame(self):success, frame = self.camera.read()if success:# 对获取到的摄像头帧进行水平翻转,实现镜像效果frame = cv2.flip(frame, 1)frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)height1, width1, channel1 = frame_rgb.shapebytesPerLine1 = 3 * width1qimage = QImage(frame_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label1.setPixmap(pixmap.scaled(self.label1.size(), Qt.KeepAspectRatio))results = self.worker.model.predict(frame)# 此处修改,将每次摄像头检测的结果都更新到self.current_results中(以列表形式存储每次结果)if self.current_results is None:self.current_results = []self.current_results.clear()self.current_results.append(results)annotated_frame = results[0].plot()frame_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)height2, width2, channel2 = frame_rgb.shapebytesPerLine2 = 3 * width2qimage = QImage(frame_rgb.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap = QPixmap.fromImage(qimage)self.label2.setPixmap(pixmap.scaled(self.label2.size(), Qt.KeepAspectRatio))else:self.camera_timer.stop()self.camera.release()QMessageBox.warning(self, "摄像头错误", "摄像头读取失败,请检查设备是否正常工作。")def show_detected_objects(self):if self.current_results:all_det_info = []for result in self.current_results:det_info = result[0].boxes.clsall_det_info.extend(det_info.tolist())object_count = len(all_det_info)object_info = f"识别到的物体总个数:{object_count}\n"object_dict = {}class_names_dict = self.current_results[0][0].namesfor class_id in all_det_info:class_name = class_names_dict[int(class_id)]if class_name in object_dict:object_dict[class_name] += 1else:object_dict[class_name] = 1sorted_objects = sorted(object_dict.items(), key=lambda x: x[1], reverse=True)for obj_name, obj_count in sorted_objects:object_info += f"{obj_name}: {obj_count}\n"if self.video_detect_button.isEnabled() and self.video_detect_button.isChecked():self.is_video_paused = Trueelif self.camera_detect_button.isEnabled() and self.camera_detect_button.isChecked():self.is_camera_paused = Truemsg_box = QMessageBox(self)msg_box.setWindowTitle("识别结果")msg_box.setText(object_info)msg_box.finished.connect(self.resume_detection)msg_box.exec_()else:self.show_message_box("识别结果", "未检测到物体")def show_message_box(self, title, message):msg_box = QMessageBox(self)msg_box.setWindowTitle(title)msg_box.setText(message)msg_box.exec_()def load_model(self):if self.worker.load_model():self.image_detect_button.setEnabled(True)self.display_objects_button.setEnabled(True)self.video_detect_button.setEnabled(True)self.camera_detect_button.setEnabled(True)def resume_detection(self):if self.is_video_paused:self.is_video_paused = Falseelif self.is_camera_paused:self.is_camera_paused = Falsedef exit_application(self):# 终止程序运行sys.exit()if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

喜欢的请三连哦 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…

25考研王道数据机构课后习题-----顺序表链表部分

文章目录 1.顺序表题目2.链表相关题目3.我的个人总结 声明&#xff1a;以下内容来自于B站知名up主白话拆解数据结构&#xff0c;望获悉&#xff1b; 1.顺序表题目 下面的这个说的是&#xff1a;下面的哪一个是组成我们的顺序表的有限序列&#xff0c;这个应该是数据元素&#x…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务&#xff0c;通过网络接口&#xff0c;提供 AI 模型功能的服务&#xff0c;允许通过发送 HTTP 请求&#xff0c;交互…

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)

概念 事务定义 事务&#xff0c;就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行&#xff0c;我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行&#xff0c;我们称该事务被提交。…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

多线程访问FFmpegFrameGrabber.start方法阻塞问题

一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能&#xff0c;其底层利用javacv的FFmpegFrameGrabber进行拉流、推流&#xff0c;进而实现了视频中转。 …

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…

在Microsoft Windows上安装MySQL

MySQL仅适用于Microsoft Windows 64位操作系统&#xff0c;在Microsoft Windows上安装MySQL有不同的方法&#xff1a;MSI、包含您解压缩的所有必要文件的标准二进制版本&#xff08;打包为压缩文件&#xff09;以及自己编译MySQL源文件。 注意&#xff1a;MySQL8.4服务器需要在…

探索最新的编程技术趋势:AI 编程助手和未来的编程方式

随着技术的飞速发展&#xff0c;编程技术领域在近年来经历了深刻的变革。从人工智能到低代码开发工具&#xff0c;新的技术趋势不断涌现&#xff0c;不仅大幅提高了开发效率&#xff0c;也重新定义了开发者的角色和工作方式。本篇博客将探讨几项当前最值得关注的编程技术&#…

k8s集群,CRI-Docker部署条件及方法

CRI-Docker部署条件及方法 文章目录 CRI-Docker部署条件及方法CRI-Docker使用条件安装 cri-docker 的步骤&#xff1a; CRI-Docker使用条件 在 Kubernetes 1.20 及以上版本&#xff0c;kubeadm 默认使用 containerd 作为容器运行时&#xff08;Container Runtime Interface, C…

OKHttp调用第三方接口,响应转string报错okhttp3.internal.http.RealResponseBody@4a3d0218

原因分析 通过OkHttp请求网络&#xff0c;结果请求下来的数据一直无法解析并且报错&#xff0c;因解析时String res response.body().toString() 将toString改为string即可&#xff01;

oceanbase集群访问异常问题处理

1.报错现象 2.问题排查 检查obproxy状态发现为不可用状态 重启obproxy 依次重启Obproxy集群 观察任务状态 重启完成 Obproxy状态正常 3.验证登录 登录成功

如何判断状态:停留还是移动。【计算加速度de方案】

跑步过程中 记录了一天时间的经纬度 时间&#xff0c;如何判断状态&#xff1a;停留还是移动。需要完整的解决方案。精准判断是停留还是移动 邓 要判断在跑步过程中是“停留”还是“移动”&#xff0c;需要根据GPS的经纬度数据以及时间来进行分析。你可以通过以下步骤实现准确…

ruckus R510升级到Unleashe后不能访问

ruckus R510 是IPQ4019&#xff0c;升级到Unleashe&#xff0c;它弹窗提示 但是这个IP没办法用&#xff0c;访问不了AP。 必应了一下&#xff0c;官方提示用advance ip scanner扫描。 扫描持续好久&#xff0c;发现IP竟然是从主路由获得。 9090的端口不用填&#xff0c;甚至不…

使用R语言绘制标准的中国地图和世界地图

在日常的学习和生活中&#xff0c;有时我们常常需要制作带有国界线的地图。这个时候绘制标准的国家地图就显得很重要。目前国家标准地图服务系统向全社会公布的标准中国地图数据&#xff0c;是最权威的地图数据。 今天介绍的R包“ggmapcn”&#xff0c;就是基于最新公布的地图…

影刀RPA高级操作实战(二):数据抓取与数据库写入

在数字化转型的浪潮中&#xff0c;影刀RPA凭借其强大的自动化能力&#xff0c;成为企业提升效率、降低成本的重要工具。掌握影刀RPA的高级操作&#xff0c;能够帮助我们应对更加复杂的业务场景&#xff0c;实现高效的数据处理与系统集成。本文将详细讲解影刀RPA在数据抓取与数据…

【精读电影】至暗时刻

Order! Order! 肃静&#xff01; Mr. Speaker&#xff01; Mr. Speaker! 议长先生&#xff01; 议长先生&#xff01; The leader of the Opposition, Clement Attle. 请工党领袖 克莱门特艾德礼 发言。 Mr. Speaker&#xff01; 议长先生&#xff01; It seem that I have not…

linux上安装MySQL教程

1.准备好MySQL压缩包&#xff0c;并进行解压 tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /usr/local 2.检查是否有mariadb数据库 rpm -aq|grep mariadb 关于mariadb:是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目…

Qt仿音乐播放器:客户端唯一化

一、铺垫 1.我们采用共享内存来进行客户端的唯一化&#xff1b; 2.我刚看到的时候&#xff0c;就感觉&#xff0c;这是人想出来的吗&#xff1f;太绝了 二、实例 int main(int argc, char *argv[]) {QApplication a(argc, argv);QSharedMemory shareMemory("Widget&qu…