tag 标签: 系统

相关博文
  • 2024-6-20 17:20
    0 个评论
    随着自动驾驶技术的成熟,对系统架构师的需求逐渐增加。自动驾驶系统架构师负责设计整个系统的结构、组件、接口和数据流;需要协调不同领域的专业知识,确保系统的可靠性、安全性和性能。总之,自动驾驶系统架构师是一个新兴且不断发展的职业。随着技术的进步,这一领域将继续吸引更多人才,推动自动驾驶技术的发展。 自动驾驶架构师在设计和开发自动驾驶系统时将面临一系列挑战,包括:安全关键的边缘情况、领域概括、模拟数据、多模态传感器和传感器融合、动态场景等。作为一名自动驾驶系统架构师,需要综合考虑技术、业务和人员方面的要素;需要具备广泛的知识和技能,以便设计和构建复杂的自动驾驶系统。 初级自动驾驶架构师应该掌握智能网联汽车概论;软件定义汽车;计算机网络;汽车电子电器架构;智能汽车关键技术概述;环境感知与车联网通讯技术;规划与控制;嵌入式软件开发简介;ADAS算法开发;ACC功能设计;HWA功能开发;APA功能开发;详细的学习课程可关注微信公众号【 自动驾驶测试验证技术创新论坛】 微信号GRCC_Auto获取详细信息。
  • 热度 13
    2023-4-4 16:54
    1228 次阅读|
    0 个评论
    为什么树莓派爱好者在谈论 USB 启动时会感到兴奋?因为它使树莓派明显更快。或者,更准确地说,内存随闪存 (ROM) 传输。RPi 启动速度更快,尤其是在 64 位操作系统中,因为它是一个未压缩的内核。或者将页面从缓存加载到 Chromium 中。因此,任何使用闪存传输大量数据的东西都会更快。但是,例如,深度学习应用程序不会运行得更快,因为它们主要使用 RAM。你也不会更好地传输YouTube流;这与您的互联网带宽有关,与您的闪存卡无关。 USB启动如此受欢迎的另一个原因是,使用过的SSD卡比较小的SD卡磨损得更少。 硬件 USB 启动需要专用硬件。一个简单的USB 3.0盘可以完成这项工作,但传输速度与SD卡相同,约为80-100MB / s。网络,它会更糟一些,因为在初始化RPi板上的USB控制器时大约有0.5秒的开销。 只有使用快速 SSD 驱动器(400 MB/s 或更高),您才能从 USB 启动中充分受益。这些 SSD 驱动器不作为 USB 设备提供。需要一个额外的USB 3.0适配器将其连接到树莓。确保使用适合 UASP 传输的适配器。它是USB 3.0支持的新的,最快的协议。最后要考虑的一点是功耗。相对较小的SSD驱动器可以通过USB端口供电。这是首选,因为否则,您还需要额外的电源。一个相对便宜的组合是金士顿240GB A400 SATA 3(32欧元)和Inateck 2.5硬盘盒(15欧元)。 树莓派 4 USB 启动 树莓派巧妙地启动。启动后,位于EEPROM中的小程序立即仅加载I/O的驱动程序。这就是为什么,例如,即使没有插入SD卡,您仍然会看到诊断屏幕。然后,该程序尝试在树莓派中加载操作软件。完成后,它将控制权转移到树莓派,并在其余时间保持空闲状态。 到目前为止,启用USB启动的最简单方法是使用Raspberry Pi Imager。从 1.6 版开始,您可以找到适用于 USB 启动的专用 EEPROM 设置。看看下面的幻灯片。 在PC中插入(小型)SD卡,然后烧录您选择的EEPROM镜像。可以使用启动顺序首先是SD卡,其次是USB,或者在幻灯片中选择的启动顺序,USB优先,SD卡其次。使用树莓派 4 和 EEPROM 更新中新闪存的 SD 卡启动。屏幕变为绿色后,您的EEPROM已准备就绪。您始终可以通过简单地使用不同的设置重复上述过程来更改启动顺序。 其余过程与第一段中所述的标准SD卡安装相同。使用imager在 USB 设备上烧录树莓派 64 操作系统,从树莓派 4 中取出 SD 卡,然后将 USB 设备插入(蓝色)USB 3.0 连接器。现在,按照通常的安装顺序进行操作。 密切关注 USB 设备的功耗。一个SSD卡没有问题,但更多的就需要一个单独的电源集线器。 故障 排除 最常见的故障原因是 USB 到 SATA(SSD 卡)适配器不支持 UASP 协议。UASP代表USBAttachedSCSIProtocol,Raspberry Pi使用的一种极快的数据传输协议。一些适配器,如流行的JMicron,在某些UASP命令上会有问题。您会看到性能缓慢、频繁断开连接或错误报告。即使连接到USB 2.0也无法解决问题,因为Linux内核在看到USB 3.0设备时仍然使用UAS命令。 唯一的解决方案是在启动后立即使用命令禁用 UASP 传输。在command.txt文件中,您需要提供 USB 驱动器的硬件 ID。您可以通过将SSD驱动器连接到仍在SD卡上工作的Raspberry Pi的USB来获得它。 # Get the verdor and product ID $ lsusb 找到的数字在命令usb-storage.quirks=xxxx:yyyy:u中作为参数给出 此命令必须设置为 /boot/cmdline.txt中找到的长行中的第一个参数。 在 USB 文件夹的启动部分找到该文件。请参阅下面的屏幕转储,从常规SD卡启动的RPi。启动后连接 USB 设备。 你也可以使用nano编辑器 Benchmark 经过所有的努力,大多数人只想知道一件事:值得吗?答案很简单是肯定的。 您不仅拥有更多的内存空间,而且具有分布式磨损的SSD卡的使用寿命也比SD卡长得多。 而且SSD卡要快得多。您可以在树莓菜单上找到Benchmark测试工具。 执行后,您可以请求报告。 我们研究了三种不同的选择。首先是标准的SD卡,当然是最慢的。 第二种选择是带有不支持 UASP 的 SATA 到 USB 转换器的 SSD 卡;进步很大。 第三个选项是相同的SSD卡,但现在具有支持UASP的转换器。显然是最快的。 不得不说,如果没有UASP,你仍然有很多速度增益。 最后两点意见 在树莓诊断报告中,您会看到 IOPS。它代表每秒的 I/O 操作数。如您所见,一次读取或写入传输为 4 KBYTE。您可以将这些数字相乘以获得以每秒(兆)字节为单位的传输速率。 这些令人印象深刻的传输速率仅反映从ROM读取或写入数据,而不是工作存储器(RAM)。最终,您的Raspberry Pi将运行得更快,但是,例如,使用SSD卡在RAM中具有模型的深度学习应用程序不会更快。 启动顺序 对于高级用户,有引导加载程序配置文件指示Raspberry Pi将如何启动。在rpi-eeprom-config文件中,您可以定义两个媒体(SD、USB、UART、网络)尝试引导 RPi。如果第一个(例如SD卡)出现故障,它将尝试从第二个(可以是您的USB)启动。这样,当SSD驱动器发生故障时,您的SD卡可以用作一种备份。 但是请注意,一旦启动,您将只能使用该设备。换句话说,如果由于功能不当,您从“旧”SD卡而不是“新”SSD驱动器启动,则由于加载了“旧”SD卡文件结构,您将丢失SSD驱动器上的所有工作。如果您的 SSD 驱动器仍在内部启动或其电源尚不可用,则可能会发生这种情况。您必须采取预防措施来解决此问题。一定次数的引导重试可能是解决方案。 在开始修改rpi-eeprom-config文件之前,请仔细阅读此页面上的说明。 $ sudo -E rpi-eeprom-config --edit # modify BOOT_ORDER=0xf41 # first SSD (USB), second SD card $ BOOT_ORDER= 0xf14 # save + , , $ sudo reboot 同样,这适用于高级用户。大多数人只需从Pi中取出SD卡即可享受改进的性能。 文章转自: https://qengineering.eu/install-raspberry-64-os.html
  • 热度 3
    2022-5-10 20:25
    2171 次阅读|
    1 个评论
    工程中经常会用到的控制算法想必就是PID了,现代控制理论为何陷入了迷思呢? 不去尝试,永远不知道新理论和算法能不能用。本文希望能给出一些控制算法研究中的工程哲学供大家参考。 先进控制算法为何给大家感觉不如PID呢? 一种可能,别人用上了,效果好,自己用不上,乃至说不知道怎么用,只能用PID,这说明自己落后。 另外一种可能,有很多所谓先进的理论和算法确实很难在实际中用,根本就是为了发论文而做的。 还有一种可能,大家都在用PID,但控制效果远不能令人满足,只是暂时找不到/发现不了更好的方法。 另外有个值得注意的,底层是PID,看中上层是不是PID。即虽然是PID,但是是结合比如自适应、模糊、容错等等。而且PID的调参是否用了比如频域分析、鲁棒等等。 如何区分这几者,是很重要的。 控制算法要能处理known known,known unknown,unknown known,unknown unknown。 只此一件的控制系统,在较为确定的环境里工作,参数可以专门针对硬件,调到很好。但也会跟温室一样,系统乃至环境的很多东西有明确的规定,甚至细到某个螺丝要拧几圈半,外界的干扰要可忽略,等等。如此的系统,有时可以应用上较为复杂的控制算法,也就没有什么好稀奇的:known known知道,unknown known能通过对系统不断加深理解变成known known,known unknown、unknown unknown则可以通过对系统和环境的控制减少到可忽略。 但商业化产品中的控制系统,上量之后件件之间有差距,加上使用环境不确定的话,known unknown、unknown unknown都会大,而控制算法要能鲁棒(不仅限于传统鲁棒控制中的鲁棒)到可以处理到这些,即使known known、unknown known处理到最好。 比如一个信号,近似等于个高斯白噪声,用过去数据,估算出均值与方差,是known known。但肯定不准的,因为现实中就不存在标准的高斯白噪声,于是做出一个误差区间,有各种做法,算是known unknown。但known known跟known unknown加起来,也还是与实际有差距,是unknown unknown,是there is nothing you can do about it的了。但常被忽视的是unknown known,比如这个信号里面,可以分离出一个周期信号(不一定是正弦),是一个干扰。知道之后,unknown known变成known known。如此等等。前面说了,可以从不同层面考虑,比如信号分成确定部分和随机部分,确定部分是known known。但确定部分与实际的确定部分有差别,是unknown known。随机部分,知道分布的话,是known unknown。随机部分也与实际的随机部分有差别,是unknown unknown。如是如是,不一而足。从这个层面分析,不如上一段中的分析对实际有指导意义。 当然还有系统。比如一个系统,有输入输出数据,建模、辨识出一个LTI模型,有参数,是known known。但这个模型肯定不是完全吻合数据,所以要给一定的不确定性,比如在参数上,可能有个区间,是known unknown。即使加上这个区间,也还是与实际有差别,是谓unknown unknown。但如果一分析,发现这个模型其实可以分离成一个LTI模型,加上一个比如Wiener模型,就是unknown known被发现了。 当然也可以在不同的层面分析。参数很多,花时间调,总能调出个鼻子乱舞的大象,特别是在仿真中更是如此。但物理学的历史告诉我们,这个时候,应该是存在更有结构化的理论框架。当然,这样的理论框架,如PID,如Kalman滤波,等等,也还是留有一定的参数让在实际中调,因为known unknown与unknown unknown,是另一个层面的问题了。
  • 热度 2
    2019-5-31 10:53
    3223 次阅读|
    1 个评论
    解决HP ProLiant DL380 G5的Centos 7安装与启动不能识别硬盘问题 默认进入安装页面选择 选中“Install Centos 7” 按下【Tab】键 键入“空格” 键入“hpsa.hpsa_simple_mode=1 hpsa.hpsa_allow_any=1”参数 按下【回车】键 开始安装 安装完毕重新启动时硬盘还是无法识别 2.2、启动界面硬盘识别方法 启动后选择第一项 ········································(core) 按下【e】进入编辑状态 找到“linux17”行 选择到这一行的行尾 同样键入“hpsa.hpsa_simple_mode=1 hpsa.hpsa_allow_any=1”参数 按下【Ctrl+X】可正常引导 2.3、重启测试 reboot 搜索 复制
相关资源
  • 所需E币: 5
    时间: 2024-12-26 12:07
    大小: 1.92MB
    上传者: 木头1233
    基于单片机电子秒表系统设计论文基于单片机电子秒表系统设计论文
  • 所需E币: 5
    时间: 2024-12-26 12:06
    大小: 538.73KB
    上传者: 木头1233
    基于单片机的直流电机调速系统设计论文基于单片机的直流电机调速系统设计论文
  • 所需E币: 5
    时间: 2025-1-6 14:45
    大小: 33KB
    上传者: 木头1233
    基于单片机的指纹密码锁系统中期报告基于单片机的指纹密码锁系统中期报告
  • 所需E币: 5
    时间: 2025-1-6 14:43
    大小: 720.13KB
    上传者: 木头1233
    基于51单片机自动浇水系统设计论文基于51单片机自动浇水系统设计论文
  • 所需E币: 5
    时间: 2025-1-6 14:45
    大小: 39.5KB
    上传者: 木头1233
    基于单片机的指纹密码锁系统任务书基于单片机的指纹密码锁系统任务书
  • 所需E币: 5
    时间: 2025-1-6 14:42
    大小: 29KB
    上传者: 木头1233
    基于51单片机的自动浇花系统开题报告基于51单片机的自动浇花系统开题报告
  • 所需E币: 5
    时间: 2025-1-8 22:24
    大小: 36.26KB
    上传者: 木头1233
    基于51单片机智能温控风扇系统开题报告基于51单片机智能温控风扇系统开题报告
  • 所需E币: 0
    时间: 2024-11-27 14:07
    大小: 3.25KB
    上传者: huangyasir1990
    一、ChatGLM定义ChatGLM是由清华技术成果转化的公司智谱AI发布的开源的、支持中英双语问答的对话语言模型系列,并针对中文进行了优化,该模型基于GeneralLanguageModel(GLM)架构构建,ChatGLM是一款基于人工智能技术的智能聊天机器人,它具备强大的自然语言处理能力,能够理解和回答我们的问题,通过与ChatGLM的对话,我们可以轻松获取各种信息,解决生活中的疑惑,甚至寻求专业建议,ChatGLM的出现,让我们在获取信息、解决问题上更加高效便捷。二、发展历程早期对话系统:最初的对话系统基于规则和模板,能够回答特定的问题或执行简单的任务。统计模型:随后,统计机器学习方法被用于对话系统,使得模型能够处理更多样化的输入。神经网络:深度学习的兴起带来了基于神经网络的对话系统,这些系统能够生成更自然的回答。预训练语言模型:BERT、GPT等预训练语言模型的出现极大地提升了对话系统的性能。专门化的聊天模型:随着技术的进步,出现了专门为聊天设计的模型,如Meena、DialoGPT、ChatGLM等。三、ChatGLM3-6B模型私有化部署ChatGLM-6B是一个开源的、支持中英双语的对话语言模型,基于GeneralLanguageModel(GLM)架构,具有62亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4量化级别下最低只需6GB显存)。ChatGLM-6B使用了和ChatGPT相似的技术,针对中文问答和对话进行了优化。经过约1T标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62亿参数的ChatGLM-6B已经能生成相当符合人类偏好的回答。四、AI数字人技术开发的几个关键趋势和进展:B端市场扩大:数字人的制造和运营服务市场正不断扩大,从传统的电影动画领域向广告营销、电商直播、虚拟偶像等多个领域扩展。未来,数字人有望为更广泛的C端用户提供服务。技术迭代:技术的不断迭代推动了数字人在外形上更接近真人,制作效能得到提升。这包括建模技术、物理仿真算法、渲染引擎和GPU算力的提升,以及动捕技术的优化。AI赋能:AI技术是数字人发展的重要推动力,它使得数字人能够进行多模态交互,更神似人。AI技术的应用不仅限于交互,还覆盖了数字人的全流程,包括视频生成、建模、动作捕捉等。融合发展:数字人技术与SLAM、3D交互、体积视频、空间音频等技术的深度融合,预示着渲染技术将从本地转移到云端,为数字人提供更强大的支持。行业应用:数字人将成为人机交互的新入口,应用场景广泛,从简单的信息服务到复杂的情感交流,数字人都能提供更好的用户体验。UGC模式:随着技术门槛和成本的降低,用户生成内容(UGC)的数字人将加速出现,成为产业的增量空间。显示设备:虽然数字人主要以2D显示设备为主,但3D显示设备如AR/VR眼镜等,将在特定领域提供新的解决方案。在场感:数字人发展的高级阶段将与应用场景深度耦合,提供更真实的沉浸感和更大的价值。艺术与技术双轮驱动:北京等地区有望成为数字人产业的新高地,艺术和技术的结合将推动数字人产业的发展。合规性:随着数字人产业的发展,版权保护和行业合规体系的建设也变得尤为重要,以确保数字人的可用性、可靠性、可知性和可控性。五、数字人技术开发的关键组成部分通常包括:人物建模:使用3D建模软件创建数字人的外形,包括面部特征、身体结构等。动作捕捉:通过捕捉真人的动作数据,将其映射到数字人模型上,使其能够做出逼真的动作。语音合成:将文本转换为口语,使用TTS技术让数字人能够“说话”。面部表情生成:利用AI算法生成逼真的面部表情和嘴型,以匹配其语音输出。动画生成:通过编程或AI算法生成数字人的动作和姿态变化。交互能力:集成NLP技术,使数字人能够理解用户的输入并做出适当的反应。个性化:允许用户根据个人喜好定制数字人的外观和行为。实时渲染:使用游戏引擎或其他实时渲染技术,使数字人能够在视频或直播中实时显示。云计算和边缘计算:提供必要的计算资源,支持数字人的高度复杂计算需求。API和SDK:为开发者提供工具和接口,以便他们可以创建自己的数字人应用。六、虚拟数字人的基本组成一个完整的AI虚拟数字人通常包括以下几个部分:视觉模型:3D模型或2D动画,用于展示虚拟人的外观。语音合成:将文本转换为语音,使虚拟人能够发声。自然语言处理(NLP):理解用户输入并生成相应的回应。动作驱动:根据语音和情绪驱动虚拟人的面部表情和肢体动作。七、语音合成与识别使用第三方API进行语音合成可以使用诸如GoogleText-to-Speech、AmazonPolly或微软AzureTTS等成熟的语音合成API。以下是一个使用Python调用GoogleTTS的示例:importopenaiopenai.api_key='your_api_key'defchat_with_gpt(prompt):  response=openai.Completion.create(   engine="davinci",   prompt=prompt,   max_tokens=150  )  returnresponse.choices[0].text.strip()user_input="你好,你是谁?"response=chat_with_gpt(user_input)print("AI:",response)
  • 所需E币: 0
    时间: 2024-8-26 12:23
    大小: 3.46KB
    上传者: huangyasir1990
    一、什么是流媒体流媒体是一种以流的形式在网络上进行数字媒体(音频、视频)传输的技术。它将频、音视频之类的连续媒体经压缩编码、数据打包后按照一定的时间间隔要求连续地发送给接收方,接收方在后续数据不断到达的同时对接收到的数据进行重组、解码和播放。如果你对流媒体感兴趣的话,可以看一下Live555,一个更流行且更专业的流媒体库。它支持了各种标准流媒体传输协议,如RTP/RTCP、RTSP、SIP,实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持。播放VLC和MPlayer都是基于它来实现流媒体播放的功能,并且非常适合嵌入式领域。二、视频编码 是指压缩编码。在计算机的世界中,一切都是0和1组成的,音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据。特别在视频中,由于画面是逐渐过渡的,因此整个视频中,包含了大量画面/像素的重复,这正好提供了非常大的压缩空间。因此,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。三、simple-rtmp-server[多种类型直播]一个简单高效的实时视频服务器,使用C++开发,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。SRS提供了丰富的接入方案将RTMP流接入SRS,包括推送RTMP到SRS、推送RTSP/UDP/FLV到SRS、拉取流到SRS。SRS还支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、流截图、转发给其他服务器、转封装成HTTP-FLV流、转封装成HLS、转封装成HDS、录制成FLV四、音视频处理框架1.OpenCVOpenCV全称是OpenSourceComputerVisionLibrary,是一个跨平台的计算机视觉库,是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。可用于开发实时的图像处理、计算机视觉以及模式识别程序。OpenCV用C++语言编写,有大量的Python,JavaandMATLAB(版本2.5)的接口。2.GstreamerGStreamer是一个基于管道的多媒体框架,基于GObject,以C语言写成。可以很容易地创建各种多媒体功能组件,包括简单的音频回放,音频和视频播放,录音,流媒体和音频编辑。适用于所有主要操作系统,例如Linux、Android、Windows、MaxOSX、iOS,以及大多数BSD、商业Unix、Solaris和Symbian。GStreamers功能可以通过新插件进行扩展。3.FFmpeg一套开源的音视频处理的框架,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec(用于多个项目中音频和视频的解码器库)以及libavformat(音频与视频格式转换库)五、多媒体处理功能  多媒体视频处理工具FFmpeg有非常强大的功能[1]包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。视频采集功能    FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由FabriceBellard发起的,现在由MichaelNiedermayer主持。    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。    ffmpeg在Linux下的视频采集    在Linux平台上,ffmpeg对V4L2的视频设备提高了很好的支持,如:    ./ffmpeg-t10-fvideo4linux2-s176*144-r8-i/dev/video0-vcodech263-frtprtp://192.168.1.105:5060>/tmp/ffmpeg.sdp    以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为h263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。六、视频会议传输模块的开发选择视频会议主要是开发音视频、数据的传输的软件,在这些开发过程中,最核心的模块是传输模块,传输模块的性能直接影响到视频会议的最终质量,因此传输模块的选择在视频会议开发当中尤其重要。传输模块在开发过程中,由于考虑到QOS的影响,一般都会使用数据重发的技术,因此传输模块以及成为视频会议底层开发的一个重点,我们开发的传输模块,可以选择用TCP、UDP直接进行开发或者利用开源的传输库,因为一些开源传输库以及比较成熟,直接拿来用就可以,如果自己开发传输模块,估计也是一个巨大工程。现在我们介绍一下传输模块的开发选择。七、商用流媒体软件的选用如果项目在稳定性、安全性和责任约束上比较苛刻,还是建议选用商用产品。商用流媒体服务器软件的选择范围不大,基本上是国内外几家专业的公司在做,可选产品包括:Wowza、AdobeFlashMediaServer和国内NTVMediaServerG3等。Wowza是一个美国WowzaMediaSystems公司的产品,也是目前应用最广泛的一款流媒体服务器产品,在国内也有它的代理商。通过发放软件授权证书进行授权,可以按月、按年度购买使用授权,官网上有明确的报价。国内代理商加上自己的包装和技术支持费用,价格不一。AdobeFlashMediaServer是早些年使用最广泛的一款产品,产品成熟,价格相对高昂,随着Adobe公司退出中国市场,技术支持也主要有一些国内代理商负责。和Wowza一样,由于由国内厂商支持,加上语言、技术能力和时差等问题,在技术支持上并不尽人意。
  • 所需E币: 0
    时间: 2024-5-29 11:05
    大小: 3.26KB
    上传者: 开心就很好了
    一、什么是OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。它由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV提供了大量的计算机视觉、图像处理和模式识别的算法,包括实时图像处理、视频分析、特征检测、目标跟踪、人脸识别、物体识别、图像分割、光流法、立体视觉、运动估计、机器学习和深度学习等。OpenCV是一个跨平台的库,支持多种操作系统,包括Linux、Windows、Android、MacOS和iOS等。它使用C++编写,同时也提供了Python、Java、MATLAB等语言的接口,方便不同编程语言的开发者使用。由于OpenCV的开源性和跨平台性,它已经成为计算机视觉领域最受欢迎的库之一,广泛应用于工业检测、医学影像处理、智能交通系统、安防监控系统、机器人视觉、游戏开发等领域。OpenCV的设计初衷是实现计算机视觉的自动化,帮助计算机去理解我们的世界,以便自动完成一些基本的任务。它提供了一系列的算法和工具,使得开发者可以更加便捷地实现各种计算机视觉应用。同时,OpenCV也支持多种硬件加速技术,如Intel的IPP和GPU加速,使得计算机视觉应用的性能得到了极大的提升。二、OpenCV4软件特性OpenCV4官方版是一款开源的跨平台计算机视觉库。OpenCV4最新版软件兼容性强,支持Linux、Windows、MacOS等多种操作系统,适用于机互动、物体识别、运动跟踪、图像分割等领域。OpenCV4软件内置了Python、MATLAB、Ruby等语言的接口,用户能够轻松的使用和修改代码。三、opencv主要模块calib3d:该模块由相机校准(calibration)和三维重建(3d)两个部分组成,主要用于相机标定与三维视觉等;core:OpenCV的内核模块,定义了基础数据结构与基础计算;dnn:该模块主要用于深度学习推理部署,不支持模型训练;features2d:该模块主要用于特征点处理,例如特征点检测与匹配等;flann:FLANN为快速最近邻算法(FastLibraryforApproximateNearestNeighbors)的缩写,该模块包含快速近似最近邻搜索和聚类等功能;gapi:该模块对图像处理算法做了加速处理,不属于OpenCV的功能模块;highgui:该模块用于创建图像化界面操作,例如创建和操作图像显示窗口、鼠标与键盘事件处理,进度条等图像化交互操作;imgcodecs:该模块负责图像文件读写,如图像读取与保存;imgproc:该模块是OpenCV图像处理最重要的模块,主要功能如图像滤波、图像几何变换、直方图操作等;ml:该模块为机器学习模块,包含常见的机器学习算法,如支持向量机和随机森林等;objdetect:该模块主要用于图像目标检测,例如Haar特征检测等;photo:该模块主要负责照片处理,如照片修复和去噪等;stitching:该模块负责图像拼接,功能包括图像特征点寻找与匹配等图像拼接技术;video:该模块用于视频分析,如运动估计、背景分离等;videoio:该模块负责视频读写,主要视频文件的读取和写入。四、opencv4比opencv3多了哪些OpenCV4相较于OpenCV3,主要增加了对SIFT与SURF的支持、改进了DNN模块、增加了对特定网络结构的支持、新增了DNN例程、以及功能提升。对SIFT与SURF的支持:在OpenCV3中,SIFT与SURF的API调用文件是包含在扩展模块中的。而在OpenCV4中,如果想要使用SIFT与SURF,需要从源代码中通过CMake编译生成Python版本的安装包。DNN模块的改进:OpenCV4对DNN模块进行了改进,包括:增加了对ONNX中LSTM、Broadcasting、Algebraoverconstants、Slicewithmultipleinputs的支持。增加了对DarkNet中groupedconvolutions、sigmoid、swish、scale_channels的支持。新增了对MobileNetV3-SSD目标检测网络的支持。改进了对TensorFlow、Darknet和ONNX模型导入的功能。新增的DNN例程:人体解析(服饰分割)例程Clothespartssegmentation。DaSiamRPN目标跟踪例程,该算法出自中科院和商汤科技ECCV2018的论文Distractor-awareSiameseNetworksforVisualObjectTracking。功能提升:imgproc模块中的霍夫变换进行圆检测的HoughCircles()函数新增了HOUGH_GRADIENT_ALT实现,显著提高了圆检测的召回率和精度。这些改进和新增功能使得OpenCV4在计算机视觉领域的应用更加广泛和高效。五、opencv配置配置OpenCV环境主要涉及下载、安装、环境变量设置、以及在VisualStudio中添加必要的目录和依赖项。以下是详细的步骤:1、下载和安装OpenCV:访问OpenCV官网,下载适合Windows版本的OpenCV。运行下载的exe文件进行安装2、环境变量设置:在系统属性的高级设置中,进入环境变量设置。在系统变量中,找到并编辑Path变量,添加OpenCV的路径。对于64位系统,通常需要添加的路径是opencv\build\x64\vc16\bin和opencv\build\bin。3、VisualStudio中添加目录和依赖项:打开VisualStudio,创建一个新的C++项目。在项目属性中,添加包含目录(IncludeDirectories),库目录(LibraryDirectories),以及必要的静态和动态链接库。4、测试配置:创建一个C++源文件,编写简单的代码来测试摄像头读取或图像显示功能。如果程序能够正确运行并显示图像或视频流,则说明OpenCV环境配置成功。这些步骤涵盖了从下载安装到环境配置的整个过程,确保在配置时注意区分Debug和Release模式下的不同设置,以及根据具体的OpenCV版本调整路径和文件名。
  • 所需E币: 0
    时间: 2024-3-12 10:43
    大小: 7.6MB
    上传者: htwdb
    随着计算机技术的飞速发展和生物识别技术的广泛应用,人们越来越多地关注身份认证的安全,指纹识别因其隐私性和便捷性,已经成为当前发展最成熟的身份认证技术,在各个行业领域中都得到了广泛应用.除了有着重要的理论意义和应用价值之外,指纹识别技术也是一门能广泛应用在信息安全、网络安全、犯罪处理等多个领域的综合性技术.本文以本人在校外实习期间参与完成的高性能指纹识别芯片课题为基础,详细介绍了指纹组成、特征及指纹识别算法流程,并对各个步骤的原理和算法具体实现过程做出了详细描述,并结合C语言指纹识别算法,针对PC端对系统时间、系统空间以及函数代码这三个方面提出了一些优化策略和方法.然后详细介绍了用MFC图形化界面设计指纹预处理图形交互界面的流程,通过对C语言各个模块函数的调用展示了指纹录入、指纹预处理的功能,并对界面进行优化,增强了软件界面的灵活性.   本文将研究设计分为"C语言算法描述与优化"和"MFC图形化界面设计"这两个主要部分:(1)C语言算法描述与优化:对指纹识别算法中指纹图像采集、指纹图像预处理、指纹特征提取这三个关键步骤的原理进行了介绍,并结合C语言指纹识别算法,详细描述了各个步骤的原理和算法实现过程.针对PC端系统时间、系统空间的一些优化方案的原理和具体实现进行了说明和概述.主要内容包括系统时间优化的方案如Gabor滤波模块优化、算法数据浮点转定点,系统空间优化的方案如选择合适的数据结构和尽量小的数据类型,并概括了一些实习工作中总结的函数代码优化的方法.(2)MFC图形化界面设计:着重介绍用MFC中的C++类库设计一个指纹预处理系统界面,这个系统界面的目的是评估指纹预处理算法,在MFC对话框类的基础上添加不同的控件,通过对C语言的算法调用,在PC端展示从文件中选择指纹图像、指纹预处理图像显示、各模块阈值自定义设定等功能,并对界面进行优化,实现了界面与控件自适应、界面尺寸控制等功能,增强了软件界面的灵活性.最后,本文对研究工作进行总结,并在本论文的工作基础上提出了一些进一步的优化方案,对课题未来进行展望.
  • 所需E币: 5
    时间: 2024-3-1 10:10
    大小: 4.52MB
    上传者: htwdb
    本文中介绍了基于嵌入式的智能协议转换器工作原理、硬件设计及其软件设计。该协议转换器成功了解决了多种不同的控制网络之间的通信问题。
  • 所需E币: 0
    时间: 2024-3-5 11:09
    大小: 557.33KB
    上传者: 随遇而安1992
    这是一个系统测试报告的模板,可以根据个人实际工作内容进行填充,形成自己的系统测试报告
  • 所需E币: 0
    时间: 2024-2-26 10:46
    大小: 2.97KB
    上传者: 开心就很好了
    一、Spark3.0.0运行环境安装Spark常见部署模式:Local模式:在本地部署单个Spark服务所谓的Local模式,就是不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等。在IDEA中运行代码的环境称之为开发环境,和Local模式还是有区别的。Standalone模式:Spark自带的任务调度模式。(国内常用)YARN模式:Spark使用Hadoop的YARN组件进行资源与任务调度。(国内常用)Windows模式:为了方便在学习测试spark程序,Spark提供了可以在windows系统下启动本地集群的方式,这样,在不使用虚拟机或服务器的情况下,也能满足Spark的基本使用。Mesos&K8S模式:(了解)。Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,在Twitter得到广泛使用,管理着Twitter超过30,0000台服务器上的应用部署,但是在国内,依然使用着传统的Hadoop大数据框架,所以国内使用Mesos框架的并不多,但是原理都差不多。容器化部署是目前业界很流行的一项技术,基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是Kubernetes(k8s),而Spark也在最近的版本中支持了k8s部署模式。1、配置javajdk1.8环境变量配置路径:电脑→属性→高级系统设置→环境变量path中加入:%JAVA_HOME%/bin。注:jdk版本不宜过高。2、配置scala2.12.0下载scala安装包,选择对应版本,这里我选择的是scala2.12.0版本。3、配置scala环境环境变量配置路径:此电脑→属性→高级系统设置→环境变量path中加入:%SCALA_HOME%/bin。验证配置cmd验证配置:scala-version4、配置Hadoop3.1.0Hadoop下载从Apache官网下载Hadoop,官网下载速度较慢,也可使用国内镜像下载。Hadoop环境变量配置,配置步骤同Scala配置。注意:需要把%HADOOP_HOME%\bin与%HADOOP_HOME%\sbin一同加入path中。5、配置Spark3.0.3Spark下载Spark环境配置,配置步骤同scala配置。注意:需要把%SPARK_HOME%\bin与%SPARK_HOME%\sbin一同加入path中。配置验证cmd命令:spark-shellSpark配置成功。二、spark实战Spark是用于大规模数据处理的统一分析引擎,也可以说是目前用于可伸缩计算的最广泛的引擎,成千上万的公司包括财富500强中的80%都在使用。Spark生态系统集成了丰富的数据科学、机器学习、SQL分析和BI、存储和基础设施等框架,并将这个生态使用可以扩展到数千台机器大规模数据使用。Spark提供了Java、Scala、Python和R的高级api,以及支持通用执行图的优化引擎。Spark支持一系列丰富的高级工具,包括用于SQL和结构化数据处理的SparkSQL,用于pandas工作负载的Spark上的pandasAPI,用于机器学习的MLlib,用于图形处理的GraphX,以及用于增量计算和流处理的StructuredStreaming。Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式,Spark的Standalone模式体现了经典的master-slave模式。#拷贝一个部署spark-standalone目录cp-rspark-3.3.0-bin-hadoop3spark-standalone#进入目录cdspark-standalone/cdconf#准备workers配置文件mvworkers.templateworkers#修改workers内容为viworkershadoop1hadoop2hadoop3#准备spark-env.sh配置文件mvspark-env.sh.templatespark-env.sh#spark-env.sh添加如下内容vispark-env.sexportJAVA_HOME=/home/commons/jdk8SPARK_MASTER_HOST=hadoop1SPARK_MASTER_PORT=7077#分发到其他两台上scp-r/home/commons/spark-standalonehadoop2:/home/commons/scp-r/home/commons/spark-standalonehadoop3:/home/commons/#进入根目录下sbin执行目录和启动cdsbin/./start-all.sh由于spark-shell停止掉后,集群监控页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。#先停止前面启动的集群./stop-all.sh#准备spark-defaults.confcd../confmvspark-defaults.conf.templatespark-defaults.conf#修改spark-defaults.confvimspark-defaults.confspark.eventLog.enabled     truespark.eventLog.dir       hdfs://myns:8020/sparkhis#需要启动Hadoop集群,HDFS上的目录需要提前存在hadoopfs-mkdir/sparkhis#修改spark-env.sh文件,添加如下配置:vispark-env.shexportSPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://myns:8020/sparkhis-Dspark.history.retainedApplications=30"#参数1含义:WEBUI访问的端口号为18080#参数2含义:指定历史服务器日志存储路径(读)#参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。由于hadoop是HA模式因此配置为hdfs-site.xml下的dfs.nameservices的value值  <property>    <name>dfs.nameservices</name>    <value>myns</value><!--core-site.xml的fs.defaultFS使用该属性值-->  </property>#分发配置到另外两台上scpspark-defaults.confspark-env.shhadoop2:/home/commons/spark-standalone/conf/scpspark-defaults.confspark-env.shhadoop3:/home/commons/spark-standalone/conf/#启动集群./start-all.sh#启动历史服务./start-history-server.sh
  • 所需E币: 0
    时间: 2024-2-20 14:51
    大小: 2.59KB
    一、《flink实时规则营销系统》项目背景传统的“精准营销平台”由营销人员基于画像标签数据去圈选人群,进行营销推送,存在不足;这种传统手段,往往无法抓住那些“转瞬即逝的营销机会”;如:一个促销狂热型用户,正在浏览包包时,及时推送出正在做促销活动的包包信息,是最有效的;如:一个价格敏感型用户,正在犹豫不决反复查看他购物车中的某目标商品时,适时推送优惠券,是最有效的;这些场景,显然无法通过营销人员通过人工手段去发现,需要用软件系统自动、实时监控用户的行为,并实时做出判断,并进而驱动营销消息推送系统推送相关营销内容;总之,在应对这一类的需求时,以前的传统的“基于用户画像标签库的精准营销平台”显得力不从心;因而,擅长用键鼠改变世界的攻城狮们,决定为公司的推广、运营部门开发一个应对上述场景的自动化、智能的、实时、规则动态可变的营销利器——《实时动态规则智能运营系统》二、需求分析2.1营销规则举例-搜索兴趣词包含“商务休闲”的用户,如果浏览包含“商务休闲”的商品页面,则触发一个优惠券推送消息;-活跃度等级为C的用户,且在规则发布前的3天内,发生过“搜索雀巢”AND“加购”,当他再次上线时,触发一个app弹窗消息;-活跃度等级为C的用户,规则发布前2天内,发生过A事件3次以上,规则上线后发生了B事件,且之后间隔1天再次发生B事件,则触发;-规则运行时,检测到用户发生了下单事件,而在随后的15分钟内没有支付,则触发;-规则运行时,一个用户如果搜索的关键词符合某正则表达式,则触发;-宝妈用户,在2022-08-07开始,做过A行为3+次,做过(B行为,E行为)序列2+次,则触发;2.2规则营销需求的宏观抽象-营销规则有多样化的灵活的定义(不光参数可以支持自定义,且运算模型也可以自定义);-营销规则通常针对满足某画像的人群,也可没有针对性-营销规则通常都有有效期(也有可能是无限期的),要求系统能够支持动态增加、停用运营计划(规则)-营销规则根据需求的变化,需要能够方便地进行在线管理,如新增、停用、修改三、行为判断的逻辑分析1)行为判断:行为事件的类型及属性的判断判断用户的某个行为事件,是否是规则条件中要求的事件-简单的,可能就是 event_id="X"   ANDproperties["p1"]=/>/!=/<"v1"-稍微复杂的,可能就是  event_id="X"   AND  properties["p1"] 包含"kw1"-再复杂点的,可能就是  event_id="X"   AND properties["p1"] +properties["p2"]>100   ANDproperties["p3"]满足正则表达式 [1,10]*?a2)行为序列的判断判断用户的一系列行为事件中,是否满足规则条件所要求的依次发生的序列,比如A  B  E行为序列判断,是上述“行为判断”的衍生本质上,就是在判断事件的基础上,加上时间先后的序列关系这个逻辑,可以用正则匹配进行计算(全窗口运算); 也可以用滚动聚合的方式计算;3)事件(序列)发生次数的判断判断要求的事件或事件序列,发生了多少次是上述“行为判断”、“行为序列判断”的衍生本质上,就是在判断事件(或序列)的基础上,进行次数累计四、画像条件判断的实现难点初略考虑,应该就是查询用户画像标签库即可;站在系统的角度来考虑时:什么时机去查询? 去哪里查?比如: 查询时机: 当一个人的某个行为触发了某个规则,此时去查询该用户的画像标签是否满足规则的人群画像条件查询的目标: 用户画像标签数据库如果画像数据库在hbase中,可以用如下伪代码来快速判断##如果条件是:活跃等级=C  AND   首单时间<"2022-06-01"get=newGet(guid)get.addColumn("活跃等级")get.addColumn("首单时间")result=table.get(Get)activeLevel=result.getValue("活跃等级")firstOrderDate=result.getValue("首单时间")if(activeLevel='C' && firstOrderDate<"2022-06-01") returntrue;##如果条件是:兴趣词:包含"速溶咖啡"##这种条件,用hbase的支撑就不太好处理了//favroitWords:[海底捞,咖啡伴侣,小罐速溶咖啡,乔丹,篮球]favroitWords=result.getValue("兴趣词")  
  • 所需E币: 0
    时间: 2024-2-20 10:28
    大小: 3.01KB
    上传者: 开心就很好了
    flink实时规则营销系统(39期,2023版)——简单来说,本系统核心是一个基于事件驱动且可进行动态规则计算的实时系统,在技术上它是通用的;本套架构及系统内核,不仅可以用于“实时运营”,也可以用于“实时风控”,“实时推荐”,“实时交通监控”等场景。运营场景举例:下单促付款,新品发布信息精准送达。本系统,在核心规则引擎之外,也集成了大量metric及跟踪数据输出,能在系统中及系统外进行多维度数据分析,以深度掌握各类市场运营活动的效果,以及系统运行的各类状态什么是flink?flink是一个分布式,高性能,随时可用的以及准确的流处理计算框架,flink可以对无界数据(流处理)和有界数据(批处理)进行有状态计算(flink天生支持状态计算)的分布式,高性能的计算框架。flink的基石flink的四大基石:checkpoint,state,time,windowcheckpoint:基于chandy-lamport算法实现分布式计算任务的一致性语义;state:flink中的状态机制,flink天生支持state,state可以认为程序的中间计算结果或者是历史计算结果;time:flink中支持基于事件时间和处理时间进行计算,sparkstreaming只能按照processtime进行处理;基于事件时间的计算我们可以解决数据迟到和乱序等问题。window:flink提供了更多丰富的window,基于时间,基于数量,sessionwindow,同样支持滚动和滑动窗口的计算。Flink的应用Flink是一个大数据流处理引擎,它可以为不同的行业提供大数据实时处理的解决方案。随着Flink的快速发展完善,如今在世界范围许多公司都可以见到Flink的身影。目前在全球范围内,北美、欧洲和金砖国家均是Flink的应用热门区域。当然,这些地区其实也就是IT、互联网行业较发达的地区。Flink在国内热度尤其高,一方面是因为阿里的贡献和带头效应,另一方面也跟中国的应用场景密切相关。中国的人口规模与互联网使用普及程度,决定了对大数据处理的速度要求越来越高,也迫使中国的互联网企业去追逐更高的数据处理效率。试想在中国,一个网站可能要面对数亿的日活用户、每秒数亿次的计算峰值,这对很多国外的公司来说是无法想象的。而Flink恰好给我们高速准确的处理海量流式数据提供了可能。Flink环境部署:要了解一个系统,一般都是从架构开始。我们关心的问题是:系统部署成功后各个节点都启动了哪些服务,各个服务之间又是怎么交互和协调的。当Flink集群启动后,首先会启动一个JobManger和一个或多个的TaskManager。由Client提交任务给JobManager,JobManager再调度任务到各个TaskManager去执行,然后TaskManager将心跳和统计信息汇报给JobManager。TaskManager之间以流的形式进行数据的传输。上述三者均为独立的JVM进程。Client为提交Job的客户端,可以是运行在任何机器上(与JobManager环境连通即可)。提交Job后,Client可以结束进程(Streaming的任务),也可以不结束并等待结果返回。JobManager主要负责调度Job并协调Task做checkpoint,职责上很像Storm的Nimbus。从Client处接收到Job和JAR包等资源后,会生成优化后的执行计划,并以Task的单元调度到各个TaskManager去执行。TaskManager在启动的时候就设置好了槽位数(Slot),每个slot能启动一个Task,Task为线程。从JobManager处接收需要部署的Task,部署启动后,与自己的上游建立Netty连接,接收数据并处理。本地模式环境部署步骤如下:#1.下载安装包并上传到/usr/local/src目录#2.解压安装包并重命名为flink[root@nodesrc]$tar-zxfflink-1.14.4-bin-scala_2.12.tgz[root@nodesrc]$tar-zxfjdk-8u111-linux-x64.tar.gz#3.修改安装包所属用户和用户组权限[root@nodesrc]$chown-Rroot.rootflink-1.14.5#4.配置Flink环境变量并重新加载使其生效[root@nodesrc]$vim~/.bash_profileexportJAVA_HOME=/usr/local/src/jdk1.8.0_111/exportFLINK_HOME=/usr/local/src/flink-1.14.5/exportPATH=$PATH:$JAVA_HOME/bin:$FLINK_HOME/bin[root@nodesrc]$source~/.bash_profile#4.启动"集群"[root@nodesrc]$start-cluster.shStartingcluster.Startingstandalonesessiondaemononhostnode.Startingtaskexecutordaemononhostnode.[root@nodesrc]$jps17186Jps17078TaskManagerRunner16809StandaloneSessionClusterEntrypoint#5.访问WebUI界面8081端口查看运行情况分发Flink安装包配置到另外两个节点使用Linuxscp命令把node01节点的配置分发到另外两个节点上。#使用scp分发[root@node01conf]$cd/usr/local[root@node01local]$scp-rflinknode02:/usr/local/[root@node01local]$scp-rflinknode03:/usr/local/启动Flink集群#批量统一启动[root@node01bin]$start-cluster.shStartingcluster.Startingstandalonesessiondaemononhostnode01.Startingtaskexecutordaemononhostnode01.Startingtaskexecutordaemononhostnode02.Startingtaskexecutordaemononhostnode03. #单独启动[root@node01bin]$ jobmanager.shstart/stop[root@node01bin]$ taskmanager.shstart/stop #使用脚本查看服务进程[root@node01bin]$jps
  • 所需E币: 1
    时间: 2023-12-21 17:37
    大小: 44.95MB
    上传者: 魏治亮
    GB∕T40134-2021航天系统电磁兼容性要求.pdf
  • 所需E币: 0
    时间: 2023-12-21 11:36
    大小: 3.66KB
    一个完整的在线办公系统具备哪些功能:1、线下会议管理功能2、审批会议申请功能3、TRTC在线视频会议功能4、罚款模块5、请假管理6、报销管理那么,如何去开发这样一个在线办公的系统,这样的系统用到哪些技术才能实现?接下来,我将带着大家一步步来开发这样的办公系统。这个项目我用的技术有:SpringBoot2.4.1,SpringMVC5.3.1,MyBatis3.5.7,VUE3.0.3,ElementUIplus1.0.2。第一步,环境搭建数据库mysql我用的是8.0版本,使用Navicat作为MySQL的客户端,大家可以到网上下载Navicat安装文件。另外,强烈建议大家的操作系统要用Win10,不建议大家使用Win7或者Win11系统。安装客户端程序(RedisDesktopManager),如果是MacOS的用户,可以到软件商店中查找免费的Redis客户端软件。MongoDB的客户端,我们使用Navicat就可以,写上正确的连接信息就能连接上MongoDB。我们不需要向MongoDB导入数据,将来使用的过程中,MongoDB会积累业务数据。安装JDK,大家本地的JDK尽量使用1.8+的版本吧安装Maven环境,后端Java项目使用Maven构建,所以大家要在本地建立Maven环境第二步就是最关键的代码实战部分:用上了GROUP_CONCAT()函数,我们的SQL语句变成了下面的样子SELECTu.username,    d.dept_nameASdeptName,( SELECTGROUP_CONCAT(role_nameseparator",") FROMtb_role WHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)) )ASrolesFROMtb_useruJOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))LEFTJOINtb_deptdONu.dept_id=d.idWHERE r.role_name="超级管理员" 了解过SQL语句的各种语法之后,下面才是我们正式要写的SQL语句。<selectid="searchUserByPage"parameterType="HashMap"resultType="HashMap">  SELECT    DISTINCTu.id,    u.name,    u.sex,    u.tel,    u.email,    d.dept_nameASdept,    u.hiredate,    u.root,    u.status,    (SELECTGROUP_CONCAT(role_nameseparator",")FROMtb_roleWHEREJSON_CONTAINS(u.role,CONVERT(id,CHAR)))ASroles  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  LEFTJOINtb_deptdONu.dept_id=d.id  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDd.id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if>  LIMIT#{start},#{length}</select><selectid="searchUserCount"parameterType="HashMap"resultType="long">  SELECT     COUNT(DISTINCTu.id)  FROMtb_useru  JOINtb_rolerONJSON_CONTAINS(u.role,CONVERT(r.id,CHAR))  WHERE1=1  <iftest="name!=null">    ANDu.nameLIKE"%${name}%"  </if>  <iftest="sex!=null">    ANDu.sex=#{sex}  </if>  <iftest="role!=null">    ANDr.role_name=#{role}  </if>  <iftest="deptId!=null">    ANDu.dept_id=#{deptId}  </if>  <iftest="status!=null">    ANDu.status=#{status}  </if></select>在UserServiceImpl.java类中实现抽象方法。publicclassUserServiceImplimplementsUserService{  ……  @Override  publicPageUtilssearchUserByPage(HashMapparam){    ArrayList<HashMap>list=userDao.searchUserByPage(param);    longcount=userDao.searchUserCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在Vue的声明周期回调函数created()中调用了loadRoleList()和loadDeptList()函数,所以可以保证用户管理页面显示的时候,部门列表和角色列表的数据都是从数据库中查询得来的。<el-table  :data="dataList"  border  v-loading="dataListLoading"  @selection-change="selectionChangeHandle"  cell-style="padding:4px0"  style="width:100%;"  size="medium">  <el-table-columntype="selection"header-align="center"align="center"width="50"/>  <el-table-columntype="index"header-align="center"align="center"width="100"label="序号">    <template#default="scope">      <span>{{(pageIndex-1)*pageSize+scope.$index+1}}</span>    </template>  </el-table-column>  <el-table-columnprop="name"header-align="center"align="center"min-width="100"label="姓名"/>  <el-table-columnprop="sex"header-align="center"align="center"min-width="60"label="性别"/>  <el-table-columnprop="tel"header-align="center"align="center"min-width="130"label="电话"/>  <el-table-column    prop="email"    header-align="center"    align="center"    min-width="240"    label="邮箱"    :show-overflow-tooltip="true"  />  <el-table-columnprop="hiredate"header-align="center"align="center"min-width="130"label="入职日期"/>  <el-table-column    prop="roles"    header-align="center"    align="center"    min-width="150"    label="角色"    :show-overflow-tooltip="true"  />  <el-table-columnprop="dept"header-align="center"align="center"min-width="120"label="部门"/>  <el-table-columnprop="status"header-align="center"align="center"min-width="100"label="状态"/>  <el-table-columnheader-align="center"align="center"width="150"label="操作">    <template#default="scope">      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        @click="updateHandle(scope.row.id)"      >        修改      </el-button>      <el-button        type="text"        size="medium"        v-if="isAuth(['ROOT','USER:UPDATE'])"        :disabled="scope.row.status=='离职'||scope.row.root"        @click="dimissHandle(scope.row.id)"      >        离职      </el-button>      <el-button        type="text"        size="medium"        :disabled="scope.row.root"        v-if="isAuth(['ROOT','USER:DELETE'])"        @click="deleteHandle(scope.row.id)"      >        删除      </el-button>    </template>  </el-table-column></el-table>在TbRoleDao.xml文件中,定义SQL用于查询角色分页数据。看上面的截图可知,在角色管理页面上,只有按照角色名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个角色拥有的权限数量,而且tb_role表的permissions字段是JSON数组格式,所以我们统计数组的元素数量,就是该角色拥有的权限数量。恰好JSON_LENGTH()函数能获取JSON数组的长度,所以我就用在SQL语句中了。@Data@Schema(description="查询角色分页表单")publicclassSearchRoleByPageForm{  @Pattern(regexp="^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,10}$",message="roleName内容不正确")  @Schema(description="角色名称")  privateStringroleName;  @NotNull(message="page不能为空")  @Min(value=1,message="page不能小于1")  @Schema(description="页数")  privateIntegerpage;  @NotNull(message="length不能为空")  @Range(min=10,max=50,message="length必须在10~50之间")  @Schema(description="每页记录数")  privateIntegerlength;}在TbDeptDao.xml文件中,定义SQL用于查询部门分页数据。看上面的截图可知,在部门管理页面上,只有按照部门名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个部门拥有的员工数量,所以用了COUNT()汇总函数。publicclassDeptServiceImplimplementsDeptService{  ……  @Override  publicPageUtilssearchDeptByPage(HashMapparam){    ArrayList<HashMap>list=deptDao.searchDeptByPage(param);    longcount=deptDao.searchDeptCount(param);    intstart=(Integer)param.get("start");    intlength=(Integer)param.get("length");    PageUtilspageUtils=newPageUtils(list,count,start,length);    returnpageUtils;  }}在DeptController.java类中,定义Web方法,然后大家就可以在Swagger页面测试Web方法了。publicclassDeptController{……  @PostMapping("/searchDeptByPage")  @Operation(summary="查询部门分页数据")  @SaCheckPermission(value={"ROOT","DEPT:SELECT"},mode=SaMode.OR)  publicRsearchDeptByPage(@Valid@RequestBodySearchDeptByPageFormform){    intpage=form.getPage();    intlength=form.getLength();    intstart=(page-1)*length;    HashMapparam=JSONUtil.parse(form).toBean(HashMap.class);    param.put("start",start);    PageUtilspageUtils=deptService.searchDeptByPage(param);    returnR.ok().put("page",pageUtils);  }}本文到此告一段落,感谢大家的观看!
  • 所需E币: 2
    时间: 2023-12-22 14:55
    大小: 137.14MB
    上传者: 浩瀚星蓝
    这本书应当是市面上最好的模电书籍,相比于国内教材的晦涩难懂,这本书讲解的十分透彻,对于小白来说,十分容易理解。
  • 所需E币: 1
    时间: 2023-12-23 13:44
    大小: 1.14MB
    上传者: 魏治亮
    GB∕T38909-2020民用轻小型无人机系统电磁兼容性要求与试验方法.pdf