Baumer工业相机堡盟工业相机如何使用BGAPISDK生成视频(C++)

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。

Baumer工业相机BGAPISDK生成视频的技术背景

Baumer工业相机的BGAPI SDK是Baumer公司开发的针对其相机产品系列的一套软件开发工具包。该SDK提供了一组API,使开发人员可以编写专业应用程序,从而控制、捕获、处理和显示Baumer相机的图像和数据。BGAPI SDK支持多种编程语言,包括C++、C#、Visual Basic、LabVIEW、Matlab等,并提供了大量示例代码和文档,以帮助用户轻松上手,快速完成应用程序的开发。

BGAPI SDK提供了丰富的功能,可以控制Baumer相机的所有参数,包括曝光时间、增益、白平衡、触发模式等,以及支持各种数据格式,例如Raw、BMP、JPG等,同时还提供了实时显示、数据采集、图像处理等功能,为开发人员提供了高度定制化的解决方案。此外,BGAPI SDK还支持多相机系统的开发,并可支持各种计算机操作系统,如Windows、Linux、Mac OS等。

Baumer工业相机通过SDK生成视频功能的技术背景主要涉及到图像处理和视频生成两个核心环节。

在图像处理方面,Baumer工业相机使用OpenCV库进行图像处理。OpenCV是一款开源的计算机视觉和机器学习软件库,包含了众多算法和函数,可以实现对图像的读取、预处理、特征提取、目标检测等功能。Baumer工业相机通过引用OpenCV库,实现了对图像的高效处理和解析。

在视频生成方面,Baumer工业相机通过GAPISDK(Baumer公司自主研发的软件开发套件)实现了对图像数据的进一步处理和生成视频。GAPISDK针对Baumer工业相机的特点和性能进行了优化,可以更好地利用相机的硬件资源,提高处理速度和效率。同时,GAPISDK还提供了丰富的API接口和函数库,可以方便地进行二次开发和定制,满足不同用户的需求。

通过引用OpenCV库和GAPISDK,Baumer工业相机实现了对图像的高效处理和生成视频的功能。这不仅提高了工业生产中的图像处理效率,也进一步推动了工业自动化和智能化的发展。

本文介绍的通过集成BGAPI SDK进行生成视频的功能。

Baumer工业相机通过BGAPISDK循环查找相机序列功能

下面介绍在C++里Baumer工业相机如何通过BGAPISDK循环查找相机序列功能方式

1.引用合适的类文件
代码如下(示例):

/* Copyright 2019-2020 Baumer Optronic */
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <set>
#include <vector>
#include <algorithm>
#include <string>
#include <functional>// This example shows how to convert a set of images (in alphabetical order) into a video file using the openCV
// library. If no command line parameters are given the example will generate a set of images in the folder
// 'ExampleImages' (if not empty the images will be used) and create a video file 'ExampleVideo.avi' from this
// images// openCV must be available!!!// Command Line Parameters
//
// --imgDir: sets the directory where source images are located, if not set, the default 'ExampleImages' will be used
// Important: All image files need to have the same dimension for the video creation to be successful
// Tip: You can use the  Baumer CameraExplorer Image Recorder functionality to record some example images
//
// --videoFile: sets the output file name for the created video, if not, the default 'ExampleVideo.avi' will be usedconst std::string gc_sImageDirDefault = "ExampleImages";
const std::string gc_sVideoFileNameDefault = "ExampleVideo.avi";#if defined(_WIN32)
#   include <direct.h>
#else
#   include <sys/stat.h>
#endif
#include "Arguments.h"
#include "HelperFunctions.h"#define EXAMPLE_IMAGES 1#if defined(_WIN32)
static const char c_cPathSeparator = '\\';
#else
static const char c_cPathSeparator = '/';
#endif

如下为CMakeLists里代码:

cmake_minimum_required(VERSION 3.10)message(STATUS "## ${CMAKE_CURRENT_BINARY_DIR} ##")
get_filename_component(EXAMPLE_NAME "${CMAKE_CURRENT_BINARY_DIR}" NAME)
string(SUBSTRING ${EXAMPLE_NAME} 0 3 TARGET_NAME)
project(${EXAMPLE_NAME})set(SOURCE_FILES ${EXAMPLE_NAME}.cpp${SHARED_DIR}/Arguments.cpp${SHARED_DIR}/Arguments.h${SHARED_DIR}/HelperFunctions.cpp${SHARED_DIR}/HelperFunctions.hUserTemplate.user
)
include_directories(${SHARED_DIR})# =================== Add openCV support! ==============================
if(ENABLE_OPENCV)message(STATUS "\n======================= Configure OpenCV library =======================")set(BUILD_SHARED_LIBS OFF)find_package(OpenCV QUIET COMPONENTS core highgui imgproc)  # some packages in OpenCV obsolete ?!?if(OpenCV_FOUND)message(STATUS "OpenCV Version: '${OpenCV_VERSION}'")message(STATUS "OpenCV LibDir:  '${OpenCV_LIB_PATH}'")if(OpenCV_VERSION_MAJOR GREATER "2")add_definitions(-DUSE_OCL_COMPONENT=3)find_package(OpenCV COMPONENTS videoio imgcodecs)if(NOT OpenCV_FOUND)message(STATUS "OpenCV has no Video support!")endif()elseif (OpenCV_VERSION_MAJOR LESS "2")option(ENABLE_OPENCV "Enable OpenCV Support in SDK example" OFF)option(OpenCV_FOUND "OpenCV Found" OFF)message(STATUS "OpenCV with Version 1.x not supported!")else()  # OpenCV Version 2.xfind_package(OpenCV COMPONENTS ocl)  # this package in OpenCV obsolete ?!?endif()else()message(STATUS "OpenCV not supported!")endif()if(OpenCV_FOUND AND ENABLE_OPENCV)add_definitions(-DUSE_OPENCV=1)list(APPEND INCLUDE_DIR ${OpenCV_INCLUDE_DIRS})message(STATUS "OpenCV Libs:  '${OpenCV_LIBS}'")else()message(STATUS "This means program '${PROJECT_NAME}' couldn't run properly!")message(STATUS "Please set the correct search path for the OpenCV package and/or use OpenCV > 3.0!")message(STATUS "=====================================================================\n")endif()
endif()message(STATUS "## OpenCV is configured: ${PROJECT_NAME}! ##\n")
message(STATUS "=====================================================================\n")add_executable(${TARGET_NAME} ${SOURCE_FILES})
if(OpenCV_FOUND)target_link_libraries(${TARGET_NAME} "${OpenCV_LIBS}")
endif()set_property(TARGET ${TARGET_NAME} PROPERTY PROJECT_LABEL ${PROJECT_NAME})
set_property(TARGET ${TARGET_NAME} PROPERTY OUTPUT_NAME ${PROJECT_NAME})if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")if(OpenCV_FOUND AND OpenCV_SHARED)get_target_property(OpenCV_DLL_DEBUG   opencv_world IMPORTED_LOCATION_DEBUG)get_target_property(OpenCV_DLL_RELEASE opencv_world  IMPORTED_LOCATION_RELEASE)set(OpenCV_WorldLib  "$<$<CONFIG:debug>:${OpenCV_DLL_DEBUG}>$<$<CONFIG:release>:${OpenCV_DLL_RELEASE}>")add_custom_command(TARGET ${TARGET_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different "${OpenCV_WorldLib}"  $<TARGET_FILE_DIR:${TARGET_NAME}>COMMENT "copy OpenCV library to output directory")endif()set(USER_FILE ${TARGET_NAME}.vcxproj.user)configure_file(UserTemplate.user ${USER_FILE} @ONLY)
endif()

2.通过BGAPISDK生成视频的功能

Baumer工业相机通过BGAPI SDK生成视频核心代码如下所示:

// ---------------------------------------------------------------------------------------------------------------------
// Here you can use argument parameters for sImgDirectory and sVideoFileName!
int main(int argc, char* argv[]) {std::string sImgDirectory;std::string sVideoFileName;static const Argument argumentList[] = {{ &sImgDirectory,    "p", "imgPath",   false   , argumentString,     0, "Pathname",     "Image Path" },{ &sVideoFileName,   "v", "videoFile", false   , argumentString,     0, "Filename", "Video File Name" },};parseArguments(argumentList, (sizeof(argumentList)/sizeof(argumentList[0])), argc, argv);int iReturnCode = 0;try {std::cout << std::endl;std::string sExampleName = __FILE__;sExampleName = sExampleName.substr(sExampleName.find_last_of(c_cPathSeparator) + 1);writeHeader1(sExampleName);writeHeader1("EXAMPLE VIDEO FROM IMAGE DIRECTORY");// The flag USE_OPENCV is set by the CMake run, CMake tries to find OpenCV >= Version 2
#if USE_OPENCV  // OpenCV// The flag USE_OCL_COMPONENT is set by the CMake run if OpenCV can use OpenCL to speed up it's functionality
#   if USE_OCL_COMPONENTif (cv::ocl::haveOpenCL()) {cv::ocl::Context context;if (!context.create(cv::ocl::Device::TYPE_GPU)) {// FAIL: no context} else {std::cout << "OpenCL available!" << std::endl;for (size_t i = 0; i < context.ndevices(); i++) {cv::ocl::Device clDevice = context.device(i);std::cout << clDevice.vendorName() << std::endl;std::cout << clDevice.driverVersion() << std::endl << std::endl;}}}
#   endif  // USE_OCL_COMPONENTstringvec fileList;std::string imgDir;if (!sImgDirectory.empty()) {imgDir = sImgDirectory;} else {imgDir = gc_sImageDirDefault;std::cout << "Using default setting for 'imgPath': " << imgDir << std::endl;// Create the directory below the execution dir
#if defined(_WIN32)_mkdir(imgDir.c_str());
#elsemkdir(imgDir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
#endif}
#ifdef WITH_REGEXreadDirectory(imgDir, ".*.jpg", &fileList);
#elsereadDirectory(imgDir, "*.jpg", &fileList);
#endifsize_t slashPos = imgDir.find_last_of("/\\");std::string exampleDir = imgDir;if (slashPos < std::string::npos)exampleDir = imgDir.substr(slashPos+1);if (fileList.empty() && (exampleDir == gc_sImageDirDefault)) {// Create some images if the image directory identical with the defaultstd::cout << "Here were be some test images with changing colors created!" << std::endl;createExampleImages(imgDir, cv::Size(1000, 500));readDirectory(imgDir, ".*.jpg", &fileList);}// If the fileList is empty, exit the program:if (fileList.empty()) {std::cout << "No Image(s) found!" << std::endl;return 102;}std::sort(fileList.begin(), fileList.end(), std::less<std::string>());// Now there are some pictures in the list - and you can create a video file from thiscv::Mat frame = cv::imread(imgDir + "/" + fileList.at(0));cv::Size frameSize = cv::Size(frame.cols, frame.rows);int frames_per_second = 10;// Create and initialize the VideoWriter object:// std::string sVideoFileName;if (sVideoFileName.empty()) {sVideoFileName = gc_sVideoFileNameDefault;std::cout << "Using default setting for 'videoFile': " << sVideoFileName << std::endl;}
#ifdef CV_FOURCC_MACROcv::VideoWriter oVideoWriter(sVideoFileName,CV_FOURCC('M', 'J', 'P', 'G'),  // cv::VideoWriter::fourccframes_per_second, frameSize, true);
#elsecv::VideoWriter oVideoWriter(sVideoFileName,cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),frames_per_second, frameSize, true);
#endif// If the VideoWriter object is not initialized successfully, exit the program:if (oVideoWriter.isOpened() == false) {std::cout << "Cannot save the video to a file" << std::endl;return 103;}// ... and now write all pictures in the video fileint iNumber = 0;for (std::string filename : fileList) {std::cout << "file" << (++iNumber) << ": " << filename << std::endl;cv::Mat frame2 = cv::imread(imgDir + "/" + filename);if (!frame2.empty())  // use valid picture only!oVideoWriter.write(frame2);}oVideoWriter.release();#else  // USE_OPENCV// If we could not find OpenCV this text will be displayed.std::cout << "Without OpenCV we cannot create the video in this example!" << std::endl;std::cout << "Availability is checked while CMake creates this project." << std::endl;std::cout << "Please install OpenCV (version 2.3 or later) or set 'OpenCV_DIR' to the" << std::endl;std::cout << "correct path in the CMakeTests.txt script or as a variable in your environment" << std::endl;std::cout << "and run CMake again. " << std::endl;std::cout << "######################################" << std::endl << std::endl;#endif  // USE_OPENCVstd::cout << std::endl;std::cout << "End" << std::endl << std::endl;}catch (const std::exception& e) {iReturnCode = (iReturnCode == 0) ? 1 : iReturnCode;std::cout << "unhandled std exception: '" << e.what() << "'" << std::endl;}catch (...) {iReturnCode = (iReturnCode == 0) ? 1 : iReturnCode;std::cout << "unhandled exception" << std::endl;}if (iReturnCode != 0)std::cout << "Example ends with error: " << iReturnCode << std::endl;std::cout << "Press ENTER to close the program!" << std::endl;int endKey = std::cin.get();endKey = endKey;  // unused variablereturn iReturnCode;
}


Baumer工业相机使用GAPISDK生成视频功能的优势

工业相机使用GAPISDK生成视频功能的优势主要包括:

  1. 高效率:使用GAPISDK生成视频功能可以大大提高工业相机的数据传输和处理效率。相比传统的相机数据传输方式,使用GAPISDK可以更好地优化数据传输流程,减少数据冗余和传输时间,从而提高整体的处理效率。
  2. 高质量:GAPISDK针对图像处理进行了深度优化,可以更好地处理图像数据,提高图像质量。使用GAPISDK生成的视频可以更好地保持原始图像的清晰度和色彩,从而提高视频的质量。
  3. 实时性:使用GAPISDK生成视频功能可以保证数据的实时性。通过优化数据传输和处理流程,GAPISDK可以更好地保证数据传输的实时性和处理的及时性,从而满足工业生产中对实时性的要求。
  4. 可扩展性:GAPISDK是一个开放性的软件开发套件,可以方便地与其他工业相机和控制软件集成。这使得工业相机在使用GAPISDK生成视频功能时具有更好的可扩展性,可以根据实际需求进行定制和扩展。
  5. 灵活性:GAPISDK提供了丰富的API接口和函数库,可以方便地进行二次开发和定制。这使得工业相机在使用GAPISDK生成视频功能时具有更高的灵活性,可以根据实际需求进行灵活的定制和控制。

总之,工业相机使用GAPISDK生成视频功能具有高效率、高质量、实时性、可扩展性和灵活性等优势,可以更好地满足工业生产中对图像处理和视频生成的需求。


Baumer工业相机使用GAPISDK生成视频的行业应用

Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,主要包括:

  1. 汽车制造:在汽车制造过程中,Baumer工业相机可以用于拍摄零部件的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、尺寸测量、缺陷检测等任务。这可以提高生产效率和质量。
  2. 电子制造:在电子制造领域,Baumer工业相机可以用于识别和检测电子元器件的外观和位置,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、质量检测和分类等任务。这可以提高生产流程的效率和品质。
  3. 食品加工:在食品加工行业中,Baumer工业相机可以用于拍摄食品的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、品质检测和分类等任务。这可以提高生产流程的效率和品质。
  4. 物流仓储:在物流仓储领域,Baumer工业相机可以用于拍摄货物的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、识别和跟踪等任务。这可以实现自动化仓库管理和智能物流配送等目标。
  5. 医疗影像:在医疗影像领域,Baumer工业相机可以用于拍摄医学影像,如X光片、CT扫描和MRI等,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、分析和诊断等任务。这可以提高医疗诊断的准确性和效率。

总之,Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,涉及到制造业、物流业、医疗行业等多个领域。随着工业自动化和智能化的发展,其应用前景也将越来越广阔。


 

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

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

相关文章

总结使用React做过的一些优化

一、修改css模拟v-show {!flag && <MyComponent style{{display: none}} />} {flag && <MyComponent />}<MyComponent style{{ display: flag ? block : none }} />二、循环使用key const todosList todos.map(item > {<li key{it…

Web APIs——焦点事件以及小米搜索框

一、事件类型 二、焦点事件 <body><input type"text"><script>const input document.querySelector(input)input.addEventListener(focus,function(){console.log(有焦点触发)})input.addEventListener(blur,function(){console.log(失去焦点触…

JS数组扁平化多维数组变为一维数组的三种方法

在实践中&#xff0c;我们有一个多维数组&#xff0c;我想把它变为一维数组&#xff0c;我们该怎么办呢&#xff1f; 让我为大家介绍一下吧&#xff01; 1.flat方法 我们使用flat可以实现降维 // 声明一个数组const arr [1,2,3,[4,5,6]]// 我们使用flat方法console.log(arr.…

hbase和aerospike基础概念及所对应的python包API使用

Hbase Hbase shell常用操作 1.创建表 create table name,column familytable name&#xff1a;表名 column family:列族名 2.查看所有表名称 list3.插入操作 put table name,row1,column family:column name,valuerow1:行键(即Row Key) column family:column name&#xf…

如何使用 JMeter 进行 HTTPS 请求测试?

本文将介绍如何使用 JMeter 测试 HTTPS 请求&#xff0c;并提供相关的技巧和注意事项。 在进行性能测试时&#xff0c;很多网站都采用了 HTTPS 协议。当我们测试 HTTPS 请求&#xff0c;如果服务端开启了双向认证&#xff0c;则需要客户端发送请求时带上证书。本文介绍如何在 …

【Axure视频教程】曲线图

今天教大家在Axure制作可视化曲线图的原型模板&#xff0c;鼠标移入曲线图后&#xff0c;会显示弹窗并回显对应折点的具体数据&#xff0c;该模板是用Axure原生元件制作的&#xff0c;所以使用方便&#xff0c;可以任意修改对应样式或者交互效果。该原型模板的具体效果可以参考…

Oracle通过局域网进行连接访问的设置

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

Pytorch--3.使用CNN和LSTM对数据进行预测

这个系列前面的文章我们学会了使用全连接层来做简单的回归任务&#xff0c;但是在现实情况里&#xff0c;我们不仅需要做回归&#xff0c;可能还需要做预测工作。同时&#xff0c;我们的数据可能在时空上有着联系&#xff0c;但是简单的全连接层并不能满足我们的需求&#xff0…

docker运行elastic和kibana,并使用密码连接

1. elasticsearch 运行容器 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.7.0 进入容器 docker exec -it elasticsearch bash修改配置开启密码校验 vi ./conf/elasticsearch.yml添加以下内容 …

PX4天大bug,上电反复重启,连不上QGC!

一、Debug与Bug 由于自己写的代码CPU占用率过高&#xff0c;解锁报错 CPU load too high!无法解锁。 于是把 COM_CPU_MAX 从默认的 90% 变为 99%&#xff08;千万别这样搞&#xff0c;这是bug&#xff0c;除非想玩&#xff01;&#xff09;。 然后重启&#xff0c;飞机就反…

css3 3D 转换 技巧详细解析与代码实例

CSS3 3D转换是CSS3中的一项新特性&#xff0c;通过它我们可以比较容易地实现3D效果。在这里&#xff0c;我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时&#xff0c;需要了解一些基础概念&#xff1a; 三维坐标系&#xf…

【Docker】Docker学习之一:离线安装Docker步骤

前言&#xff1a;基于Ubuntu Jammy 22.04 (LTS)版本安装和测试 1、Docker安装 1.1、离线安装 步骤一&#xff1a;官网下载 docker 安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz步骤二&#xff1a;解压安装包; tar -zxvf docker…

谈谈Net-SNMP软件

Net-SNMP是一个开源的SNMP软件套件&#xff0c;它提供了SNMP代理&#xff08;snmpd&#xff09;和SNMP工具&#xff08;如snmpget、snmpwalk等&#xff09;&#xff0c;可以用于监控和管理网络设备。 Net-SNMP最初是从UC Davis的SNMP软件衍生而来&#xff0c;现在已经成为广泛…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程&#xff0c;以校园生活助手系统的实际应用需要出发&#xff0c;架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

纺织工厂数字孪生3D可视化管理平台,推动纺织产业数字化转型

近年来&#xff0c;我国加快数字化发展战略部署&#xff0c;全面推进制造业数字化转型&#xff0c;促进数字经济与实体经济深度融合。以数字孪生、物联网、云计算、人工智能为代表的数字技术发挥重要作用。聚焦数字孪生智能工厂可视化平台&#xff0c;推动纺织制造业数字化转型…

【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;ConcurrentHashMap是怎么…

手把手教你在项目中引入Excel报表组件

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 GrapeCity Documents for Excel&#xff08;以下简称GcExcel&#xff09;是葡萄城公司的…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台&#xff0c;该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元&#xff0c;该板卡具有4个FMC子卡接口&#xff08;其中有2个为FMC接口&#xff09;&#x…

Vue3.3指北(二)

Vue3.3指北 Vue31、组件基础1.1、全局组件1.2、局部组件1.3、组件的命名1.4、组件的数据存放1.5、组件标签化 2、父组件向子组件传递数据2.1、props2.2、动态props2.3、props传数组2.4、props传对象2.4.1、默认值和必传值 3、子组件向父组件传递数据4、父子组件互相访问4.1、父…

服务器之日常整活

文章目录 一&#xff0c;序二、服务器相关流水帐未完&#xff0c;待补充 一&#xff0c;序 假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f; 等等&#xff0c;什么叫假如你有一台服务器&#xff0c;假如只有一台&#xff0c;肯定我想搞第二台&#xff0c;顺便第三台…