当前位置: 首页 > news >正文

Qt5 互动地图,实现无人机地面站效果

一、概述

本文主要通过Qt5+opmapcontrol实现一个简单的无人机地面站效果。opmapcontrol是一个比较古老的QT开源地面站库,可选择谷歌地图,必应地图, 雅虎地图,GIS等。可直接使用源码,也可以编译生成库进行调用。
实现效果:
在这里插入图片描述

二、环境

Qt:5.15.2
编译器: Qt 5.15.2 MinGW 64-bit
系统:windows 10

三. 功能特点

(1) 支持缓存地图
(2)支持选择各厂商地图,以及切换街道地图
(3)支持地图互动:拖动、放大缩小
(4)支持添加航点,以及航点的编辑、删除、保存、加载、航点信息显示
(5)支持设置home,以及安全区域
(6)支持显示运动轨迹

四.opmapcontrol

从github上下载下来的源码包调用的时候,不同版本的Qt会有些小bug,可以直接搜opmapcontrol。
CSDN免积分下载链接(包含编译好的库、和简单的调用demo):
https://download.csdn.net/download/ever__ever/89290882?spm=1001.2014.3001.5503
(以下为opmapcontrol中mapwidget子项目各个类的功能讲解,只想知道如何使用的话可以跳过本节,直接前往第五节)
这个库中我们主要看mapwidget子项目,里面提供了对地图、无人机、航点、轨迹、home等相关操作的接口。

  1. OPMapWidget类

这个类主要继承QGraphicsView,提供一个地图交互场景视图。
(1)void SetShowDiagnostics(bool const & value)
设置是否显示诊断信息。当传入的值为true时,会创建定时器用于刷新诊断信息,同时创建GPS对象(如果不存在),并设置透明度。当传入的值为false时,会清除诊断信息、定时器、GPS对象等。
(2)void SetUavPic(QString UAVPic)
用于设置无人机的图片。如果无人机对象存在,会调用其SetUavPic函数设置图片。
(3)UAVItem* AddUAV(int id)
用于添加一个新的无人机对象,并将其添加到地图中。它返回指向新添加的无人机对象的指针。
(4)void AddUAV(int id, UAVItem* uav)
用于添加一个已存在的无人机对象,并将其添加到地图中。
(5)void DeleteUAV(int id)
用于删除指定ID的无人机对象。
(6)UAVItem* GetUAV(int id)
用于获取指定ID的无人机对象。
(7)const QList<UAVItem*> GetUAVS()
用于获取所有无人机对象的列表。
(8)WayPointLine *WPLineCreate(WayPointItem *from, WayPointItem *to, QColor color, bool dashed, int width)
用于创建两个航点之间的连线。
(9)WayPointLine *WPLineCreate(HomeItem *from, WayPointItem *to, QColor color, bool dashed, int width)
用于创建Home点到航点之间的连线。

  1. Configuration类
    它主要用于集中管理地图控件的大部分配置选项。

这个类包含了一些成员变量,如EmptytileBrushEmptyTileTextEmptyTileBorders等,用于配置地图空白瓦片的绘制、文本、边框等样式。同时,它还包含了一些成员函数,用于设置和获取地图的访问模式、语言、内存缓存使用情况、缓存文件的位置等。
总的来说,Configuration类的作用是提供一个集中管理地图控件配置选项的地方,使得在代码中可以方便地对这些配置进行设置和获取。

  1. GPSItem类

继承自QObjectQGraphicsItem的类,用于在地图上表示一个无人机(UAV)。提供了一系列函数用于管理无人机的位置、轨迹以及到达状态等属性,以及相应的信号与槽机制用于与其他对象进行交互。
这个类的作用主要有以下几点:

  • **表示无人机:**GPSItem类用于在地图上绘制表示无人机的图形元素,可以根据给定的参数设置无人机的位置、高度和朝向。
  • **设置无人机轨迹:**可以根据不同的轨迹类型设置无人机的轨迹显示方式,包括按时间间隔绘制轨迹点或按距离间隔绘制轨迹点等。
  • **管理轨迹显示:**可以设置是否显示无人机的轨迹以及轨迹线,并提供相应的函数来控制轨迹的显示和清除。
  • **自动设置到达状态:**可以设置无人机自动根据距离到达航点,并根据设定的距离自动设置航点到达状态。
  1. HomeItem类

继承自QObjectQGraphicsItem的类,用于在地图上表示一个home点的位置。提供了一系列函数用于管理home的位置、安全区域以及相应的交互功能。
这个类的作用主要有以下几点:

  • **表示home的位置:**HomeItem类用于在地图上绘制表示home的图形元素,可以设置home的位置坐标和海拔高度。
  • **显示安全区域:**可以设置是否显示home的安全区域,并提供相应的函数进行控制。
  • **提供信号与槽机制:**通过信号与槽机制,可以实现当home的位置发生变化时通知其他对象,以及当home位置被双击时触发相应的事件。
  • **提供鼠标事件处理:**可以处理鼠标的移动、按下、释放和双击等事件,以便实现交互功能。
  1. MapGraphicItem类
    MapGraphicItem
    类是一个用于地图显示和交互的主要图形项。它是一个继承自 QObjectQGraphicsItem 的类,是地图小部件中核心的图形项,负责管理地图的显示和交互,以及地图相关的逻辑处理。

这个类的作用主要有以下几点:

  • **显示地图:**负责在地图小部件上绘制地图,并处理地图的显示逻辑。
  • **地图交互:**处理鼠标事件(移动、点击、滚动等)和键盘事件,以实现地图的交互功能,如拖拽、缩放、选择区域等。
  • **地图坐标转换:**提供方法将经纬度坐标转换为本地坐标,以及将本地坐标转换为经纬度坐标。
  • **地图操作:**包括设置地图的缩放级别、旋转角度、地图类型等。
  • **地图重绘:**在需要更新地图显示时,负责重新绘制地图。
  • **地图逻辑:**处理地图的逻辑操作,如获取地图类型、设置当前位置、设置鼠标滚轮缩放类型等。
  1. TrailItem类

用于在地图上显示路径轨迹的图形项,它可以根据传入的经纬度坐标和颜色刷,在地图上绘制路径。

  1. UAVItem类

表示无人机(UAV)的图形项,用于在地图上显示无人机的位置、航向、速度等信息。可以根据无人机的位置和状态信息进行绘制,同时提供了一系列方法和信号,用于处理与无人机相关的逻辑。
这个类的作用主要有以下几点:

  • **初始化无人机项:**通过构造函数初始化无人机项,传入地图图形项、父部件指针和无人机图片路径等参数。
  • **设置无人机信息:**提供一系列方法,用于设置无人机的位置、NED(北东地)坐标、地面速度、空速、航向角速度等信息。
  • **绘制无人机:**实现 paint 方法,用于在地图上绘制无人机。绘制时可以根据当前无人机的位置、航向等信息进行绘制。
  • **边界矩形:**实现 boundingRect 方法,返回无人机项的边界矩形,用于在场景中定位无人机项的位置。
  • **类型标识:**定义了 type 方法,返回无人机项的类型标识,方便识别无人机项。
  • **信号与槽:**提供多个槽函数,用于处理无人机位置更新、透明度设置等操作。还定义了一些信号,用于与其他部件进行通信,如当无人机达到航点时发出信号等。
  1. WayPointItem类

表示航点的图形项,用于在地图上显示航点的位置、描述和相关信息。可以根据航点的位置和状态信息进行绘制,同时提供了一系列方法和信号,用于处理与航点相关的逻辑。
这个类的作用主要有以下几点:

  • **初始化航点项:**提供多个构造函数,用于初始化航点项,可以传入航点的经纬度坐标、海拔高度、描述信息等参数。
  • **设置航点信息:**提供一系列方法,用于设置和获取航点的描述、是否到达、航点编号、经纬度坐标、海拔高度等信息。
  • **绘制航点:**实现 paint 方法,用于在地图上绘制航点的图标,并根据航点是否到达以及是否显示航点编号进行绘制。
  • **边界矩形:**实现 boundingRect 方法,返回航点项的边界矩形,用于在场景中定位航点项的位置。
  • **类型标识:**定义了 type 方法,返回航点项的类型标识,方便识别航点项。

五.主程序结构

├── UAVMapDemo
├── UAVMapDemo.pro
├── main.cpp (程序入口:加载样式表)
├── mainwindow.h (主界面,没什么操作)
├── mainwindow.cpp
├── mainwindow.ui
├── 3rdparty (包括opmapcontrol的头文件和库文件)
│ ├── opmapcontrol
│ │ └── include
│ │ └── MinGW
├── MapControl
│ ├── MapControl.pri
│ ├── MapWidget.h (继承OPMapWidget,调用opmapwidget相关接口实现地图和无人机操作)
│ ├── MapWidget.cpp
│ ├── UAS_types.h (存放一些数据类型和转化)
│ ├── UAS_types.cpp
├── Robot
│ ├── Robot.pri
│ ├── uavmanagerwidget.h (无人机地面站界面,实现模型飞行、起飞、降落等接口)
│ ├── uavmanagerwidget.cpp
│ ├── uavmanagerwidget.ui
│ ├── mapsetmiddleform.h (一个小界面,不用关心)
│ ├── mapsetmiddleform.h
│ ├── mapsetmiddleform.h
├── res
│ ├── image (图片资源)
│ ├── styleSheet (样式资源)
│ │ └── default.qss

六.程序源码主要部分说明

  1. pro文件

添加opmapcontrol相关头文件和库文件

CONFIG(debug, debug|release){win32-g++ {}else:msvc {}
}
else {win32-g++ {INCLUDEPATH += $$PWD/3rdparty/opmapcontrol/include/mapwidgetLIBS += -L$$PWD/3rdparty/opmapcontrol/MinGW -lopmapwidget}else:msvc {}
}
  1. UAVManagerWidget 无人机地面站界面

initWidget() : 新建一个配置文件,存放经纬度、home点经纬度、缩放比例、添加一个无人机类,编号为0,不显示无人信息,设置无人机的位置为home位置。
handleUISignals() : 处理界面上的一些ui信号,加了一个定时器,用于模拟飞行。
flySimulation() : 模拟飞行,随机经纬度。

void UAVManagerWidget::initWidget()
{m_mapSetForm = new MapSetMiddleForm();m_mapSetForm->setRobotBtnName(u8"无人机");m_conf = new QSettings("./MapControl/data/UAV.ini", QSettings::IniFormat);int zoom;m_homeLat = m_conf->value("mapWidget_home_lat", 34.257287).toDouble();m_homeLng = m_conf->value("mapWidget_home_lng", 108.888931).toDouble();m_uavLat = m_homeLat;m_uavLng = m_homeLng;zoom = m_conf->value("lastZoom", 13).toInt();internals::PointLatLng p(m_homeLat, m_homeLng);ui->widget_map->SetCurrentPosition(p);ui->widget_map->SetZoom(zoom);ui->widget_map->setConf(m_conf);uav = ui->widget_map->AddUAV(0);uav->SetNumber(0);uav->SetShowUAVInfo(false);uav->SetMapFollowType(mapcontrol::UAVMapFollowType::Types::CenterMap);uav->SetUAVPos(p, 10);
}void UAVManagerWidget::handleUISignals()
{// 连接connect(ui->btn_connect, &QPushButton::clicked, this, &UAVManagerWidget::connectUav);// 起飞connect(ui->btn_takeoff, &QPushButton::clicked, this, &UAVManagerWidget::uavTakeoff);// 降落connect(ui->btn_land, &QPushButton::clicked, this, &UAVManagerWidget::uavLand);// 返回connect(ui->btn_back, &QPushButton::clicked, this, &UAVManagerWidget::uavGoHome);// planconnect(ui->btn_plan, &QPushButton::clicked, this, &UAVManagerWidget::flyByWaypoint);// 地图中心点connect(ui->btn_home, &QPushButton::clicked, this, [=]() {m_mapSetForm->setCurrentPos(ui->widget_map->CurrentPosition().Lng(),ui->widget_map->CurrentPosition().Lat());QPoint buttonPos = ui->btn_home->mapToGlobal(ui->btn_home->rect().center());int dialogX = buttonPos.x() + ui->btn_home->width() - 15;int dialogY = buttonPos.y() - m_mapSetForm->height() / 2;m_mapSetForm->showWidget(QPoint(dialogX, dialogY));});// 置于homeconnect(m_mapSetForm, &MapSetMiddleForm::signal_setHome, this, [=]() {ui->widget_map->SetCurrentPosition(internals::PointLatLng(m_homeLat, m_homeLng));});// 置于无人机connect(m_mapSetForm, &MapSetMiddleForm::signal_setRobot, this, [=]() {if (uav) {ui->widget_map->SetCurrentPosition(internals::PointLatLng(m_uavLat, m_uavLng));}});// 置于自定义中心connect(m_mapSetForm, &MapSetMiddleForm::signal_setCustom, this, [=](double lng, double lat) {if (uav) {ui->widget_map->SetCurrentPosition(internals::PointLatLng(lat, lng));}});// 无人机超出home设定安全范围connect(uav,SIGNAL(UAVLeftSafetyBouble(internals::PointLatLng)),this,SLOT(uavWarnning(internals::PointLatLng)));// 用于模拟飞行的定时器,随机生成无人机位置timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(flySimulation()));// 模拟飞行按钮connect(ui->btn_simFly, &QPushButton::clicked, this, [=]() {if (ui->btn_simFly->isChecked()) {timer->start(100);} else {timer->stop();}});
}void UAVManagerWidget::flySimulation()
{m_uavLat += 0.000001;m_uavLng += QRandomGenerator::global()->bounded(0.000001) - 0.000005;internals::PointLatLng ll(m_uavLat, m_uavLng);uav->SetUAVPos(ll, 10);
}
  1. MapWidget 地图窗口,继承OPMapwidget。

MapWidget() : 构造函数,选择必应地图,其他的需要科学上网。

MapWidget::MapWidget(QWidget* parent): mapcontrol::OPMapWidget(parent)
{m_conf = NULL;configuration->SetAccessMode(core::AccessMode::CacheOnly);configuration->SetTileMemorySize(200);configuration->SetCacheLocation("./data/");SetZoom(4);SetMinZoom(4);// 地图选择必应SetMapType(MapType::BingHybrid);// 显示罗盘SetShowCompass(true);// set initial valuesm_bSelectArea = 0;m_pSelectArea1.SetLat(-9999);m_pSelectArea1.SetLng(-9999);m_pSelectArea2.SetLat(-9999);m_pSelectArea2.SetLng(-9999);m_homeShow = 1;m_homeAlt = 440;m_homePos.SetLat(-9999);m_homePos.SetLng(-9999);m_homeSafearea = 100;m_flightHeight = 20;// setup menussetupMenu();
}

*setConf(QSettings conf) : **配置文件设置,地图加载接口(服务器、缓存)、地图类型、缓存位置、home点和安全区域设置。


void MapWidget::setConf(QSettings* conf)
{m_conf = conf;if (m_conf == NULL)return;// map type & access mode{MapType::Types mapType;core::AccessMode::Types accessMode;QString cacheLocation;// load settingsaccessMode = (core::AccessMode::Types)m_conf->value("mapWidget_accessMode",(int)(core::AccessMode::CacheOnly)).toInt();mapType = (MapType::Types)m_conf->value("mapWidget_mapType",(int)(MapType::GoogleSatellite)).toInt();cacheLocation = m_conf->value("mapWidget_cacheLocation", "./MapControl/data/").toString();// set configurationsconfiguration->SetAccessMode(accessMode);configuration->SetCacheLocation(cacheLocation);SetMapType(mapType);// set accessMode actionsif (accessMode == core::AccessMode::ServerAndCache) {m_actMapAccess_ServerAndCache->setChecked(true);m_actMapAccess_Cache->setChecked(false);} else if (accessMode == core::AccessMode::CacheOnly) {m_actMapAccess_ServerAndCache->setChecked(false);m_actMapAccess_Cache->setChecked(true);}}// home & safe area{m_homeShow = m_conf->value("mapWidget_home_show", m_homeShow).toInt();m_homePos.SetLat(m_conf->value("mapWidget_home_lat", m_homePos.Lat()).toDouble());m_homePos.SetLng(m_conf->value("mapWidget_home_lng", m_homePos.Lng()).toDouble());m_homeAlt = m_conf->value("mapWidget_home_alt", m_homeAlt).toDouble();m_homeSafearea = m_conf->value("mapWidget_home_safeArea", m_homeSafearea).toDouble();m_flightHeight = m_conf->value("mapWidget_flightHeight", m_flightHeight).toDouble();if (m_homeShow) {this->SetShowHome(true);this->Home->SetCoord(m_homePos);this->Home->SetAltitude((int)(m_homeAlt));this->Home->SetSafeArea((int)(m_homeSafearea));m_actHome_ShowHide->setChecked(true);} else {m_actHome_ShowHide->setChecked(false);}}
}

**setupMenu() **: 右键菜单,提供对地图、航点、home、安全区域等各个功能的接口。

int MapWidget::setupMenu(void)
{// setup actionsm_actMapType = new QAction(tr(u8"地图类型"), this);connect(m_actMapType, SIGNAL(triggered()), this, SLOT(actMapType_SelectMap()));m_actMapAccess_ServerAndCache = new QAction(tr(u8"服务器和缓存"), this);m_actMapAccess_ServerAndCache->setCheckable(true);m_actMapAccess_ServerAndCache->setChecked(false);connect(m_actMapAccess_ServerAndCache, SIGNAL(triggered()),this, SLOT(actMapAccess_ServerAndCache()));m_actMapAccess_Cache = new QAction(tr(u8"缓存"), this);m_actMapAccess_Cache->setCheckable(true);m_actMapAccess_Cache->setChecked(true);connect(m_actMapAccess_Cache, SIGNAL(triggered()), this, SLOT(actMapAccess_Cache()));m_actWaypoint_add = new QAction(tr(u8"航点添加"), this);connect(m_actWaypoint_add, SIGNAL(triggered()), this, SLOT(actWaypoint_add()));m_actWaypoint_del = new QAction(tr(u8"航点删除"), this);connect(m_actWaypoint_del, SIGNAL(triggered()), this, SLOT(actWaypoint_del()));m_actWaypoint_edit = new QAction(tr(u8"航点编辑"), this);connect(m_actWaypoint_edit, SIGNAL(triggered()), this, SLOT(actWaypoint_edit()));m_actWaypoint_clear = new QAction(tr(u8"航点清除"), this);connect(m_actWaypoint_clear, SIGNAL(triggered()), this, SLOT(actWaypoint_clear()));m_actWaypoint_save = new QAction(tr(u8"航点保存"), this);connect(m_actWaypoint_save, SIGNAL(triggered()), this, SLOT(actWaypoint_save()));m_actWaypoint_load = new QAction(tr(u8"航点加载"), this);connect(m_actWaypoint_load, SIGNAL(triggered()), this, SLOT(actWaypoint_load()));m_actSelectArea_beg = new QAction(tr(u8"选择区域起点"), this);connect(m_actSelectArea_beg, SIGNAL(triggered()), this, SLOT(actSelectArea_beg()));m_actSelectArea_end = new QAction(tr(u8"选择区域终点"), this);connect(m_actSelectArea_end, SIGNAL(triggered()), this, SLOT(actSelectArea_end()));m_actSelectArea_clear = new QAction(tr(u8"选择区域清除"), this);connect(m_actSelectArea_clear, SIGNAL(triggered()), this, SLOT(actSelectArea_clear()));m_actHome_Set = new QAction(tr(u8"设置Home"), this);connect(m_actHome_Set, SIGNAL(triggered()), this, SLOT(actHome_Set()));m_actHome_Safearea = new QAction(tr(u8"设置Home安全区域"), this);connect(m_actHome_Safearea, SIGNAL(triggered()), this, SLOT(actHome_Safearea()));m_actHome_ShowHide = new QAction(tr(u8"显示/隐藏Home"), this);m_actHome_ShowHide->setCheckable(true);m_actHome_ShowHide->setChecked(true);connect(m_actHome_ShowHide, SIGNAL(triggered()), this, SLOT(actHome_ShowHide()));m_actCacheMap = new QAction(tr(u8"缓存地图"), this);connect(m_actCacheMap, SIGNAL(triggered()), this, SLOT(actCacheMap()));m_actTrail_clear = new QAction(tr(u8"清除轨迹"), this);connect(m_actTrail_clear, SIGNAL(triggered()), this, SLOT(actClearTrail()));// setup menum_popupMenu = new QMenu("Menu");QMenu* menuAccessMode = m_popupMenu->addMenu(u8"接口类型");m_popupMenu->addAction(m_actMapType);m_popupMenu->addAction(m_actCacheMap);m_popupMenu->addSeparator();m_popupMenu->addAction(m_actTrail_clear);m_popupMenu->addSeparator();m_popupMenu->addAction(m_actWaypoint_add);m_popupMenu->addAction(m_actWaypoint_del);m_popupMenu->addAction(m_actWaypoint_edit);m_popupMenu->addAction(m_actWaypoint_clear);m_popupMenu->addAction(m_actWaypoint_save);m_popupMenu->addAction(m_actWaypoint_load);m_popupMenu->addSeparator();m_popupMenu->addAction(m_actSelectArea_beg);m_popupMenu->addAction(m_actSelectArea_end);m_popupMenu->addAction(m_actSelectArea_clear);m_popupMenu->addSeparator();m_popupMenu->addAction(m_actHome_Set);m_popupMenu->addAction(m_actHome_Safearea);m_popupMenu->addAction(m_actHome_ShowHide);menuAccessMode->addAction(m_actMapAccess_ServerAndCache);menuAccessMode->addAction(m_actMapAccess_Cache);return 0;
}

七.最终效果

20240510_164348 00_00_00-00_00_30.gif

八.源代码链接

https://download.csdn.net/download/ever__ever/89291117?spm=1001.2014.3001.5503

相关文章:

Qt5 互动地图,实现无人机地面站效果

一、概述 本文主要通过Qt5opmapcontrol实现一个简单的无人机地面站效果。opmapcontrol是一个比较古老的QT开源地面站库&#xff0c;可选择谷歌地图&#xff0c;必应地图&#xff0c; 雅虎地图&#xff0c;GIS等。可直接使用源码&#xff0c;也可以编译生成库进行调用。实现效果…...

【文末附gpt升级方案】TikTok Symphony AI套件:智能视频制作的新篇章

TikTok Symphony AI套件&#xff1a;智能视频制作的新篇章 摘要 随着短视频平台的兴起&#xff0c;视频内容的创作与制作已成为品牌方吸引用户、传递信息的重要手段。TikTok作为全球领先的短视频平台&#xff0c;近日宣布推出Symphony AI套件&#xff0c;旨在通过人工智能技术…...

面试回答——有高并发、高性能、高可用系统架构设计实践以及性能调优经验

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…...

rocketmq初识

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/3/26* Time: 2:26* Description: 单向消息生产…...

php 使用phpoffice导出导出excel

荆轲刺秦王 在PHP中&#xff0c;可以使用 PhpSpreadsheet 库来创建和导出Excel文件。PhpSpreadsheet 是一个纯PHP 编写的组件库&#xff0c;它使用现代 PHP 写法&#xff0c;代码质量和性能比 PHPExcel 高不少&#xff0c;完全可以替代PHPExcel&#xff08;PHPExcel已不再维护…...

安装docker版elasticsearch和kibana

本文将介绍用docker的方式安装elasticsearch和kibana&#xff0c;并用浏览器访问elasticsearch。这里的elasticsearch主要给测试环境使用&#xff0c;因此不会设置https和密码。kibana是elasticsearch的前端&#xff0c;可以用来访问elasticsearch&#xff0c;展示数据图表、搜…...

大语言模型的工程技巧(四)——梯度检查点

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论如何利用梯度检查点算法来减少模型在训练时候&#xff08;更准确地说是运行反向传播算法时&#xff09;的内存开支。…...

批量复制文件智能删除已复制,轻松管理文件新体验!让您的文件整理更高效无忧

在信息爆炸的时代&#xff0c;文件管理无疑成为我们日常生活和工作中不可或缺的一部分。面对堆积如山的文件&#xff0c;我们时常陷入无尽的复制、粘贴、删除循环中&#xff0c;不仅耗时耗力&#xff0c;还容易出错。但今天&#xff0c;我要向您推荐一款颠覆传统的文件管理工具…...

从零训练yolov8

1.收集数据 2.数据标注 pip install labelimg3.划分数据集 0.2的验证机0.8的训练集 import os from shutil import copyfile from sys import exit import randomsource r"D:\Data\imgs\screenc" \\ target_train r"D:\Data\imgs\datasets\mydata\images\t…...

民国漫画杂志《时代漫画》第14期.PDF

时代漫画14.PDF: https://url03.ctfile.com/f/1779803-1247458399-6732ac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;...

maven-依赖管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Maven BOM二、使用三、SpringBoot的依赖管理 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 依赖管理能带来啥&#xff1a; 避免…...

Java之设计模式

概述 设计模式就是经过我们开发人员通过长时间的开发实践得出的一种开发模式,目的就是在开发过程中降低代码耦合度,提高代码可复用性/扩展/维护。目前设计模式可以分为创建型模式、行为型模式、结构型模式,一共包括23种设计模式。本文列举了实际项目中使用到的设计模式,包括单…...

大胆预测:计算机将要回暖

中概财报集体亮眼 虽然最近几天恒指&#xff08;港股&#xff09;稍有回落&#xff0c;但年线仍有 9% 的上涨。 过去三年&#xff0c;恒指分别下跌 14.08%、15.46% 和 13.82%。 而在近期&#xff0c;国内各大互联网都公布了财报&#xff0c;别看各个大厂的作妖不断&#xff0c;…...

49 序列化和反序列化

本章重点 理解应用层的作用&#xff0c;初识http协议 理解传输层的作用&#xff0c;深入理解tcp的各项特性和机制 对整个tcp/ip协议有系统的理解 对tcp/ip协议体系下的其他重要协议和技术有一定的了解 学会使用一些网络问题的工具和方法 目录 1.应用层 2.协议概念 3. 网络计…...

PS —— 精修图像

PS —— 精修图像 修复污点修复画笔工具修复画笔工具 美白滤镜去杂锐化加杂减淡和锐化工具 我觉得今天这篇博客&#xff0c;无论是男同胞还是女同胞&#xff0c;都要熟练掌握&#xff08;哈哈哈哈…) 今天我们来学习如何精修图像&#xff0c;精修图像一般分为几步——修复&…...

哥白尼哨兵系列卫星数据不能下载的解决方法

自2023年1月24日起&#xff0c;一个新的哥白尼数据空间生态系统已经启动&#xff0c;为所有哨兵数据&#xff08;Sentinel-1, Sentinel-2, Sentinel-3 and Sentinel-5P&#xff09;提供可视化和数据处理&#xff0c;地址为&#xff1a;https://dataspace.copernicus.eu/。详细介…...

结构型模式之桥接模式

文章目录 概述原理结构图代码示例 小结 概述 桥接模式(bridge pattern) 的定义是&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转…...

数据结构--顺序表

目录 1.顺序表 1.1顺序表的概念及结构 线性表 2、顺序表分类 2.1顺序表和数组的区别 静态顺序表 动态顺序表 3.顺序表的实现 3.1初始化 随后便可对顺序表初始化 3.2插入数据 尾插 头插 在指定位置插入数据 顺序表的查找 头删、尾删及指定位置删除 实现代码&#x…...

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…...

7.2k star的万能视频解析下载插件

今天给大家介绍一个超级厉害的浏览器插件&#xff0c;可以解析各个平台网页视频——猫抓。 项目简介 猫抓&#xff08;cat-catch&#xff09; 是一款资源嗅探扩展插件&#xff0c;他能够帮助你筛选列出当前页面的资源。简单来说&#xff0c;当你打开任意一个带有视频的网页&a…...

dmanywhere的docker制作

dmanywhere的docker制作 官网地址&#xff1a; http://www.dmanywhere.cn/ 下载相关执行文件。 Dockerfile的默认命名是“Dockerfile”&#xff0c; 在构建镜像时&#xff0c;如果没有指定Dockerfile文件&#xff0c;Docker通常会寻找名为“Dockerfile”的文件 1.Dockerf…...

Leetcode | 5-21| 每日一题

2769. 找出最大的可达成数字 考点: 暴力 数学式子计算 思维 题解 通过式子推导: 第一想法是二分确定区间在区间内进行查找是否符合条件的, 本题最关键的便是 条件确定 , 第二种方法: 一般是通过数学公式推导的,这种题目我称为数学式编程题 代码 条件判断式 class Solution {…...

vue3添加收藏网站页面

结构与样式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…...

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …...

牛客NC362 字典序排列【中等 DFS Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/de49cf70277048518314fbdcaba9b42c 解题方法 DFS&#xff0c;剪枝Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回…...

PHP获取文件路径getcwd()、__DIR__、__FILE__的区别

getcwd() getcwd() 是一个函数&#xff0c;它返回当前工作目录&#xff08;CWD&#xff09;的完整路径。当前工作目录是脚本开始执行时所在的目录&#xff0c;除非在脚本执行过程中通过 chdir() 函数进行了更改。 $cwd getcwd(); echo $cwd; // 输出当前工作目录的完整路径…...

Kafka(十三)监控与告警

目录 Kafka监控与告警1 解决方案1.2 基础知识JMX监控指标代理查看KafkaJMX远程端口 1.3 真实案例Kafka Exporter:PromethusPromethus Alert ManagerGrafana 1.3 实际操作部署监控和告警系统1.2.1 部署Kafka Exporter1.2.2 部署Prometheus1.2.3 部署AlertManger1.2.4 添加告警规…...

SBC3568启动升级,灵活更换动画logo

今天小智将会带着大家体验如何在openharmony sdk内替换开机logo和动态动画。 1. 更换开机logo 开机logo分为uboot阶段【logo.bmp】和kernel阶段【logo_kernel.bmp】的logo两个文件&#xff0c;对图片的要求是&#xff1a;必须为bmp格式&#xff0c;8或者24位深&#xff0c;且…...

v-if 与 v-show(vue3条件渲染)

v-if 是“真正”的条件渲染&#xff0c;因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。 v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。 相比之下&a…...

nuxt: generate打包后访问资源404问题

现象 使用Nuxt.js开发的个人页面&#xff0c;部署到nginx服务器中&#xff0c;/_nuxt/*.js、/_nuxt/*.css等静态问题不能访问&#xff0c;提示404错误。 而我们的这些资源文件是存在的。 解决方法 加上此处代码进行上下文配置 baseURL: /nuxt/ 此时在nginx配置 /nuxt 代理 lo…...