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生成视频功能的优势主要包括:
- 高效率:使用GAPISDK生成视频功能可以大大提高工业相机的数据传输和处理效率。相比传统的相机数据传输方式,使用GAPISDK可以更好地优化数据传输流程,减少数据冗余和传输时间,从而提高整体的处理效率。
- 高质量:GAPISDK针对图像处理进行了深度优化,可以更好地处理图像数据,提高图像质量。使用GAPISDK生成的视频可以更好地保持原始图像的清晰度和色彩,从而提高视频的质量。
- 实时性:使用GAPISDK生成视频功能可以保证数据的实时性。通过优化数据传输和处理流程,GAPISDK可以更好地保证数据传输的实时性和处理的及时性,从而满足工业生产中对实时性的要求。
- 可扩展性:GAPISDK是一个开放性的软件开发套件,可以方便地与其他工业相机和控制软件集成。这使得工业相机在使用GAPISDK生成视频功能时具有更好的可扩展性,可以根据实际需求进行定制和扩展。
- 灵活性:GAPISDK提供了丰富的API接口和函数库,可以方便地进行二次开发和定制。这使得工业相机在使用GAPISDK生成视频功能时具有更高的灵活性,可以根据实际需求进行灵活的定制和控制。
总之,工业相机使用GAPISDK生成视频功能具有高效率、高质量、实时性、可扩展性和灵活性等优势,可以更好地满足工业生产中对图像处理和视频生成的需求。
Baumer工业相机使用GAPISDK生成视频的行业应用
Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,主要包括:
- 汽车制造:在汽车制造过程中,Baumer工业相机可以用于拍摄零部件的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、尺寸测量、缺陷检测等任务。这可以提高生产效率和质量。
- 电子制造:在电子制造领域,Baumer工业相机可以用于识别和检测电子元器件的外观和位置,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、质量检测和分类等任务。这可以提高生产流程的效率和品质。
- 食品加工:在食品加工行业中,Baumer工业相机可以用于拍摄食品的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、品质检测和分类等任务。这可以提高生产流程的效率和品质。
- 物流仓储:在物流仓储领域,Baumer工业相机可以用于拍摄货物的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、识别和跟踪等任务。这可以实现自动化仓库管理和智能物流配送等目标。
- 医疗影像:在医疗影像领域,Baumer工业相机可以用于拍摄医学影像,如X光片、CT扫描和MRI等,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、分析和诊断等任务。这可以提高医疗诊断的准确性和效率。
总之,Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,涉及到制造业、物流业、医疗行业等多个领域。随着工业自动化和智能化的发展,其应用前景也将越来越广阔。
相关文章:

Baumer工业相机堡盟工业相机如何使用BGAPISDK生成视频(C++)
Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还…...

CentOS 搭建本地 yum 源方式 安装 httpd 服务
CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容: /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…...

第二篇 渲染框架2.x
简介 整个渲染框架主要包含:用于控制场景中所有渲染节点的渲染状态的流程的RenderFlow。更新渲染数据、写入Buffer的Assembler。暂存数据的RenderData。数据缓冲区的MeshBuffer、quadBuffer、spineBuffer。包含着色器程序和渲染技术的Material。渲染指令数据的装载…...

k8s-----25、资源调度-ResourceQuota资源配额、资源限制limitrange、服务质量QoS
1、ResourceQuota资源配额 1.0 作用 命名空间资源配额。防止公司内部人员对资源的不合理利用。 1.1、为什么需要资源配额 1、作为k8s集群的管理员,知道集群的规模,会合理规划资源,但是使用侧不知道,会导致很多不合理的使用场景…...

Pytorch使用torchvision.datasets.ImageFolder读取数据集,数据集的内容排列状况
当使用torchvision.datasets.ImageFolder读取猫狗数据集时,dataset中存的图片是 猫狗猫狗猫狗猫狗 还是 猫猫猫猫狗狗狗狗 呢? 数据集文件的存放路径如下图 测试代码如下 import torch import torchvisiontransform torchvision.transforms.Compose([torchvision.transform…...

uni-app:引用文件的方法
绝对定位 ①import common from "/utils/common.js" ②import common from "utils/common.js" <template><view></view> </template> <script>import common from "/utils/common.js"export default {data() {ret…...

软件测试必备:如何编写测试用例?
前言 今天想和大家来聊聊测试用例,这篇文章主要是想要写给软件测试小伙伴们的,因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手,我就想和大家简单的聊聊,这篇文章主要是针对功能测试的哟。 同时,我也准备…...

windows安装数据库MySQL
windows安装数据库MySQL 文章目录 windows安装数据库MySQL一、MySQL官网下载压缩包二、在D盘新建文件夹D:\MySQL,将下载的压缩包解压到该文件夹下三、配置环境变量四、通过命令行模式安装、启用、配置SQL服务 一、MySQL官网下载压缩包 下载地址:https:/…...

2023CCF中国开源大会 | 麒麟信安作为首批合作伙伴入驻全国信创开源广场
聚开源各界群智,于湘江之滨论道。10月21-22日,以“开源联合,聚力共赢”为主题的2023 CCF中国开源大会(CCF ChinaOSC)在长沙隆重召开。本届大会由中国计算机学会、开放原子开源基金会主办,中国工程院院士、鹏…...

python网络爬虫实例
目录 1、访问百度 2、输入单词百度翻译 3、豆瓣电影排行榜 4、豆瓣电影top250 5、下载美女壁纸 1、访问百度 from urllib.request import urlopen url"http://www.baidu.com" respurlopen(url)with open("mybaidu.html",mode"w") as f:f.wr…...

ArcGIS中如何为跨带数据投影?
北京54、西安80高斯克吕格投影是我国常用的投影坐标系统,它们是一种分带投影方式,有3和6分带,不适合大范围内的投影使用。但是如果有份数据范围较大,跨越了多个度带,该选择哪个坐标系统进行投影转换呢? 在大范围内,常用的坐标系统有Albers等面积投影和Lambert等角投影,…...

如何在Ubuntu中安装libevent库
我自己在ubuntu 22 和20上都安装成功了。应该是每个版本都适合的。 我主要是整合参考这两个人的。 Ubuntu安装及测试Libevent_如何查看ubuntu是否安装了libevent-CSDN博客 【精选】Linux Ubuntu 20.04LTS安装OpenSSL步骤_ubuntu安装openssl-CSDN博客 下载方法一:…...

领域高口碑 | 中科院1区TOP,Elsevier出版社,仅1个月Accept!稳定检索40年!
【SciencePub学术】本期,小编给大家推荐的是一本Elsevier旗下、稳定检索40年、影响因子为10.0的中科院1区TOP刊,期刊详情及专题信息如下: 期刊简介 COMPUTERS IN INDUSTRY ISSN:0166-3615 E-ISSN:1872-6194 IF&a…...

RDBMS 的历史回顾
“数据库”这个词是怎么来的?当 SQL 是 SEQUEL 时它代表什么?通过这篇有关 RDBMS 历史的文章了解所有这些内容以及更多内容。 埃里克迪特里希用户头像 经过 埃里克迪特里希 核心 Anush Gasparyan 用户头像 经过 阿努什加斯帕里安 2017年7月21日 意见…...

windows 离线安装 vue 环境
由于公司要求在内网开发项目,而内网不能连接外网,因此只能离线安装 vue 环境,在网上找过很多的离线安装方法,但都没有成功,于是在不断的尝试中找到了以下方法。 1、找一台与内网电脑相同系统的有网电脑。 2、在有网的电…...

python实现批量pdf转txt和word
文章目录 背景需求环境安装完整代码效果 背景需求 已经获取到了大量的pdf在download文件夹中,但是我需要的是txt文件和word文件~ 环境安装 pip install pdf2docx pdfminer.six完整代码 # pip install pdf2docx pdfminer.siximport os from pdf2docx …...

c++ 并发与多线程(12)线程安全的单例模式-2
一、内部静态变量的懒汉单例(C++11 线程安全) #include <iostream> #include <thread> #include <vector>class Single { public:// 获取单实例对象static Single& GetInstance();// 打印实例地址void Print();private:// 私有构造函数,防止外部创建对…...

银河麒麟v10x86或者arm离线安装服务
银河麒麟v10x86或者arm离线安装服务 最近有个项目,甲方的服务器用的全是国产化服务器银河麒麟,架构是x86的然后也无法连接外网,需要离线安装服务正常思路就是找到离线安装的包,然后拷贝到现场的服务器中进行安装所以问题就在于如…...

【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)
Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一:Agentless,即无Agent的存在1.3.2 特性二:幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…...

Telegram 引入了国产小程序容器技术
Telegram 宣布为其开发者提供了一项“能够在 App 中运行迷你应用”的新功能( 迷你应用即 Mini App,下文中以“小程序”代替)。 在一篇博客文章中,Telegram 的开发者写到“小程序提供了可替代互联网网站的灵活界面(cre…...

Capture One Pro 23图像处理工具「Mac」
Capture One Pro是一款专业的图像处理软件,旨在为摄影师和其他专业用户提供最佳的图像编辑和后期处理工具。 Capture One Pro 的主要功能包括 RAW 文件处理、图像编辑、颜色校正、曝光控制、局部调整、批处理等。它的相机支持列表非常广泛,几乎可以支持…...

rust OJ实战
目录 力扣 414. 第三大的数 力扣 628. 三个数的最大乘积 力扣 414. 第三大的数 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:…...

聊聊KafkaListener的实现机制
序 本文只要研究一下KafkaListener的实现机制 KafkaListener org/springframework/kafka/annotation/KafkaListener.java Target({ ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE }) Retention(RetentionPolicy.RUNTIME) MessageMapping Documented …...

Golang洗牌算法(Golang乱序算法)
Golang 洗牌算法(乱序算法);需求背景:从一个文件下下读取所有文件,获取他们的名字, 将名字乱序排序,按着乱序后的序列,通过名字去找到文件,再上传,以达到上传…...

SpringBoot 源码分析(三) 监听器分析以及属性文件加载分析
前言 在创建SpringBoot项目的时候会在对应的application.properties或者application.yml文件中添加对应的属性信息,这些属性文件是什么时候被加载的?如果要实现自定义的属性文件怎么来实现?在讲属性加载之前先讲下监听器分析。 一、监听器分…...

记录nvm use node.js版本失败,出现报错: exit status 1: ��û���㹻��Ȩ��ִ�д˲�����
使用管理员权限运行cmd,再使用nvm use node.js版本号 参考: nvm use (node版本号)时报错: exit status 1: �����㹻��Ȩ��ִ…...

【蓝牙协议】简介:蓝牙芯片、蓝牙协议架构
文章目录 蓝牙芯片架构另一个视角由下到上看:Controller-->Host由上到下看:Host-->Controller 蓝牙协议架构视角HW层——蓝牙芯片层Transport——数据传输层HOST——协议层 总结 参考:https://zhuanlan.zhihu.com/p/585248998 参考&…...

【深度学习】
什么是深度学习? 感知器 为了实现模拟人类的学习,科学家们首先设计了构成神经网络的基本结构神经元(感知器模型),然后再由大量的神经元构成复杂的,能够实现各种功能的神经网络。 这种模式和超能陆战队中的…...

centos启动tomcat 并指定jdk 版本
在tomcat的catalina.sh文件手动设置JAVA_HOME变量即可 例如: 前提是文件存在 保存配置重新启动tomcat...

day37(事件轮询机制 ajaxGet执行步骤与案例(五个步骤) ajax属性 PHP返回JSON对象(两种))
一.事件轮询机制 1. 无论同步还是异步代码都要经过主线程编译,同步代码开始排在执行栈(主线程)上,异步代码开 始存放在任务队列中 2. 主线程优先执行同步代码,同步代码必须前一行执行完,后一行才能执行;当异步代码…...