第六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:摄像头标定

传奇开心果博文系列

  • 系列博文目录
    • Python的OpenCV库技术点案例示例系列
  • 博文目录
    • 一、前言
    • 二、OpenCV摄像头标定介绍
    • 三、摄像头内外参数标定示例代码和扩展
    • 四、立体视觉标定示例代码和扩展
    • 五、归纳总结

系列博文目录

Python的OpenCV库技术点案例示例系列

博文目录

一、前言

在这里插入图片描述OpenCV摄像头标定:包括摄像头内外参数标定、立体视觉标定等功能。

二、OpenCV摄像头标定介绍

在这里插入图片描述OpenCV是一个广泛使用的计算机视觉库,提供了许多功能用于图像处理和计算机视觉任务。其中包括摄像头标定功能,用于获取摄像头的内部和外部参数,以及立体视觉标定功能,用于获得立体相机系统的参数。

  1. 摄像头内外参数标定:
    摄像头内外参数标定是指确定摄像头的内部参数(如焦距、主点坐标等)和外部参数(如旋转矩阵、平移向量等)的过程。这些参数对于图像校正、三维重建等应用非常重要。

    OpenCV提供了一些函数和工具来进行摄像头内外参数标定。其中最常用的是calibrateCamera()函数,它使用棋盘格图像或其他已知的三维模型来估计摄像头的内部和外部参数。通过采集一系列不同姿态的棋盘格图像,并提供棋盘格的尺寸,calibrateCamera()函数可以计算出摄像头的参数矩阵、畸变系数等。

  2. 立体视觉标定:
    立体视觉标定是指确定立体相机系统的参数,包括摄像头的内外参数以及两个摄像头之间的相对位置和姿态。这些参数对于立体视觉的深度感知、物体定位等任务至关重要。

    OpenCV提供了一些函数和工具来进行立体视觉标定。其中最常用的是stereoCalibrate()函数,它使用棋盘格图像或其他已知的三维模型来估计两个摄像头的内部和外部参数,并计算出两个摄像头之间的相对位置和姿态。通过采集一系列不同姿态的棋盘格图像,并提供棋盘格的尺寸,stereoCalibrate()函数可以得到立体相机系统的参数矩阵、畸变系数、旋转矩阵和平移向量等。

    在进行立体视觉标定之后,可以使用这些参数来进行立体图像的匹配、深度图的计算以及三维点云的重建等任务。

需要注意的是,摄像头标定是一个相对复杂的过程,需要准备合适的标定板、采集足够数量的图像,并进行一系列的计算和优化。同时,标定结果的准确性也受到实际拍摄环境、标定板的质量等因素的影响。因此,在进行摄像头标定时,建议参考OpenCV官方文档和示例代码,并根据具体的需求和实际情况进行调整和优化。

三、摄像头内外参数标定示例代码和扩展

在这里插入图片描述下面是一个使用OpenCV进行摄像头内外参数标定的示例代码:

import numpy as np
import cv2

# 定义棋盘格的尺寸
pattern_size = (9, 6)  # 棋盘格内角点数量

# 创建棋盘格模板
pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32)
pattern_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2)

# 存储棋盘格图像的角点坐标
obj_points = []  # 三维世界中的坐标系
img_points = []  # 图像坐标系

# 读取棋盘格图像并查找角点
image_files = ['image1.jpg', 'image2.jpg', 'image3.jpg']  # 棋盘格图像文件列表
for file in image_files:
    img = cv2.imread(file)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

    # 如果成功找到角点,则添加到数据中
    if ret:
        obj_points.append(pattern_points)
        img_points.append(corners)

# 进行摄像头内外参数标定
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)

# 打印结果
print("相机内参数矩阵:\n", camera_matrix)
print("畸变系数:\n", dist_coeffs)

在上述示例代码中,首先定义了棋盘格的尺寸,即棋盘格内角点的数量。然后创建了一个棋盘格模板,用于存储棋盘格角点的坐标。

接下来,读取棋盘格图像,并使用cv2.findChessboardCorners()函数查找棋盘格图像中的角点。如果成功找到角点,则将棋盘格的三维坐标(obj_points)和图像坐标(img_points)分别存储起来。

最后,使用cv2.calibrateCamera()函数进行摄像头内外参数标定。该函数接受棋盘格的三维坐标、图像坐标、图像尺寸等作为输入,并返回相机的内参数矩阵(camera_matrix)、畸变系数(dist_coeffs)以及每个图像的旋转向量(rvecs)和平移向量(tvecs)。

通过打印结果,可以查看相机的内参数矩阵和畸变系数。这些参数可以用于后续的图像校正、姿态估计等任务。

需要注意的是,在实际应用中,需要采集足够数量和不同姿态的棋盘格图像,并保证棋盘格在图像中的角点能够被准确检测出来。同时,还可以根据需要进行参数优化和误差分析,以提高标定结果的准确性和稳定性。

希望以上示例能帮助你了解如何使用OpenCV进行摄像头内外参数标定。请注意根据实际情况和需求进行调整和优化。
以下是一个扩展示例代码,使用OpenCV进行摄像头内外参数标定时采集多个棋盘格图像,并进行自动角点检测:

import numpy as np
import cv2

# 定义棋盘格的尺寸
pattern_size = (9, 6)  # 棋盘格内角点数量

# 存储棋盘格图像的角点坐标
obj_points =  # 三维世界中的坐标系
img_points = []  #像坐标系

# 设置摄像头编号
camera_id = 0

# 打开摄像头
cap = cv2.VideoCapture(camera_id)

# 采集多个棋盘格图像并进行自动角点检测
num_images = 10  # 采集图像的数量
image_count = 0  # 当前已采集的图像数量

while image_count < num_images:
    # 读取摄像头图像
    ret, frame = cap.read()

    # 将彩色图像转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

    # 如果成功找到角点,则添加到数据中
    if ret:
        obj_points.append(np.zeros((np.prod(pattern_size), 3), np.float32))
        obj_points[-1][:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
        img_points.append(corners)

        # 绘制角点并显示图像
        cv2.drawChessboardCorners(frame, pattern_size, corners, ret)
        cv2.imshow('Chessboard', frame)

        # 延迟一段时间,以便观察图像
        cv2.waitKey(500)

        # 递增已采集的图像数量
        image_count += 1

# 关闭摄像头
cap.release()
cv2.destroyAllWindows()

# 进行摄像头内外参数标定
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)

# 打印结果
print("相机内参数矩阵:\n", camera_matrix)
print("畸变系数:\n", dist_coeffs)

在上述示例代码中,首先通过cv2.VideoCapture()函数打开摄像头,并设置摄像头的编号。然后进入循环,采集多个棋盘格图像并进行自动角点检测。

在每次循环中,使用cap.read()函数读取摄像头图像,并将彩色图像转换为灰度图像。然后使用cv2.findChessboardCorners()函数进行棋盘格角点的自动检测。如果成功找到角点,则将其添加到数据中,并绘制在图像上显示出来。

在采集足够数量的图像后,关闭摄像头,并使用cv2.calibrateCamera()函数进行摄像头内外参数标定。最后,打印出相机的内参数矩阵和畸变系数。

通过以上扩展示例代码,可以实现采集多个棋盘格图像并进行自动角点检测的功能,以提高摄像头内外参数标定的效率和准确性。在实际应用中,可以根据具体需求进行调整和优化,如调整棋盘格的尺寸、调整采集图像的数量等。

四、立体视觉标定示例代码和扩展

在这里插入图片描述以下是一个使用OpenCV进行立体视觉标定的示例代码:

import numpy as np
import cv2

# 定义棋盘格的尺寸
pattern_size = (9, 6)  # 棋盘格内角点数量

# 存储左右相机图像的角点坐标
left_img_points = []  # 左相机图像坐标系
right_img_points = []  # 右相机图像坐标系

# 设置摄像头编号
left_camera_id = 0
right_camera_id = 1

# 打开左右相机
left_cap = cv2.VideoCapture(left_camera_id)
right_cap = cv2.VideoCapture(right_camera_id)

# 采集多个棋盘格图像并进行角点检测
num_images = 10  # 采集图像的数量
image_count = 0  # 当前已采集的图像数量

while image_count < num_images:
    # 读取左右相机图像
    ret1, left_frame = left_cap.read()
    ret2, right_frame = right_cap.read()

    # 将彩色图像转换为灰度图像
    left_gray = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
    right_gray = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点
    ret1, left_corners = cv2.findChessboardCorners(left_gray, pattern_size, None)
    ret2, right_corners = cv2.findChessboardCorners(right_gray, pattern_size, None)

    # 如果成功找到角点,则添加到数据中
    if ret1 and ret2:
        left_img_points.append(left_corners)
        right_img_points.append(right_corners)

        # 绘制角点并显示图像
        cv2.drawChessboardCorners(left_frame, pattern_size, left_corners, ret1)
        cv2.imshow('Left Chessboard', left_frame)
        cv2.drawChessboardCorners(right_frame, pattern_size, right_corners, ret2)
        cv2.imshow('Right Chessboard', right_frame)

        # 延迟一段时间,以便观察图像
        cv2.waitKey(500)

        # 递增已采集的图像数量
        image_count += 1

# 关闭左右相机
left_cap.release()
right_cap.release()
cv2.destroyAllWindows()

# 进行立体视觉标定
ret, left_camera_matrix, left_dist_coeffs, right_camera_matrix, right_dist_coeffs, R, T, E, F = cv2.stereoCalibrate(
    objectPoints=None,
    imagePoints1=left_img_points,
    imagePoints2=right_img_points,
    imageSize=left_gray.shape[::-1],
    cameraMatrix1=None,
    distCoeffs1=None,
    cameraMatrix2=None,
    distCoeffs2=None
)

# 打印结果
print("左相机内参数矩阵:\n", left_camera_matrix)
print("左相机畸变系数:\n", left_dist_coeffs)
print("右相机内参数矩阵:\n", right_camera_matrix)
print("右相机畸变系数:\n", right_dist_coeffs)
print("旋转矩阵:\n", R)
print("平移向量:\n", T)
print("本征矩阵:\n", E)
print("基础矩阵:\n", F)

在上述示例代码中,首先通过cv2.VideoCapture()函数打开左右相机,并设置相机的编号。然后进入循环,采集多个棋盘格图像并进行角点检测。

在每次循环中,使用cap.read()函数读取左右相机图像,并将彩色图像转换为灰度图像。然后使用cv2.findChessboardCorners()函数进行棋盘格角点的检测。如果成功找到角点,则将其添加到数据中,并绘制在图像上显示出来。

在采集足够数量的图像后,关闭左右相机,并使用cv2.stereoCalibrate()函数进行立体视觉标定。该函数接受左右相机图像的角点坐标、图像尺寸等作为输入,并返回左右相机的内参数矩阵(camera_matrix)、畸变系数(dist_coeffs)、旋转矩阵(R)、平移向量(T)、本征矩阵(E)和基础矩阵(F)。

通过打印结果,可以查看左右相机的内参数矩阵、畸变系数以及立体相机系统的旋转矩阵、平移向量等参数。

希望以上示例能帮助你了解如何使用OpenCV进行立体视觉标定。请注意根据实际情况和需求进行调整和优化。
以下是一个扩展示例代码,使用OpenCV进行立体视觉标定时采集多种姿态的棋盘格图像,并进行亚像素级别的角点检测:

import numpy as np
import cv2

# 定义棋盘格的尺寸
pattern_size = (9, 6)  # 棋盘格内角点数量

# 存储左右相机图像的角点坐标
left_img_points = []  # 左相机图像坐标系
right_img_points = []  # 右相机图像坐标系

# 设置摄像头编号
left_camera_id = 0
right_camera_id = 1

# 打开左右相机
left_cap = cv2.VideoCapture(left_camera_id)
right_cap = cv2.VideoCapture(right_camera_id)

# 采集多种姿态的棋盘格图像并进行角点检测
num_images = 10  # 采集图像的数量
image_count = 0  # 当前已采集的图像数量

while image_count < num_images:
    # 读取左右相机图像
    ret1, left_frame = left_cap.read()
    ret2, right_frame = right_cap.read()

    # 将彩色图像转换为灰度图像
    left_gray = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
    right_gray = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点
    ret1, left_corners = cv2.findChessboardCorners(left_gray, pattern_size, None)
    ret2, right_corners = cv2.findChessboardCorners(right_gray, pattern_size, None)

    # 如果成功找到角点,则添加到数据中
    if ret1 and ret2:
        # 亚像素级别的角点精确定位
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
        cv2.cornerSubPix(left_gray, left_corners, (11, 11), (-1, -1), criteria)
        cv2.cornerSubPix(right_gray, right_corners, (11, 11), (-1, -1), criteria)

        left_img_points.append(left_corners)
        right_img_points.append(right_corners)

        # 绘制角点并显示图像
        cv2.drawChessboardCorners(left_frame, pattern_size, left_corners, ret1)
        cv2.imshow('Left Chessboard', left_frame)
        cv2.drawChessboardCorners(right_frame, pattern_size, right_corners, ret2)
        cv2.imshow('Right Chessboard', right_frame)

        # 延迟一段时间,以便观察图像
        cv2.waitKey(500)

        # 递增已采集的图像数量
        image_count += 1

# 关闭左右相机
left_cap.release()
right_cap.release()
cv2.destroyAllWindows()

# 进行立体视觉标定
ret, left_camera_matrix, left_dist_coeffs, right_camera_matrix, right_dist_coeffs, R, T, E, F = cv2.stereoCalibrate(
    objectPoints=None,
    imagePoints1=left_img_points,
    imagePoints2=right_img_points,
    imageSize=left_gray.shape[::-1],
    cameraMatrix1=None,
    distCoeffs1=None,
    cameraMatrix2=None,
    distCoeffs2=None
)

# 打印结果
print("左相机内参数矩阵:\n", left_camera_matrix)
print("左相机畸变系数:\n", left_dist_coeffs)
print("右相机内参数矩阵:\n", right_camera_matrix)
print("右相机畸变系数:\n", right_dist_coeffs)
print("旋转矩阵:\n", R)
print("平移向量:\n", T)
print("本征矩阵:\n", E)
print("基础矩阵:\n", F)

在上述示例代码中,除了采集多种姿态的棋盘格图像,还使用了cv2.cornerSubPix()函数对粗略检测到的角点进行亚像素级别的精确定位。通过设置适当的参数,可以提高角点位置的精确度。

通过以上扩展示例代码,可以实现采集多种姿态的棋盘格图像并进行亚像素级别的角点检测,以提高立体视觉标定的效果。在实际应用中,可以根据具体需求进行调整和优化,如调整棋盘格的尺寸、调整采集图像的数量、调整亚像素精确度的参数等。

五、归纳总结

在这里插入图片描述OpenCV摄像头标定是指通过采集一系列棋盘格图像,并利用这些图像的角点信息来计算摄像头的内外参数,从而实现图像畸变校正和立体视觉等应用。以下是OpenCV摄像头标定的关键步骤和要点:

  1. 准备标定板:使用一个已知尺寸的棋盘格作为标定板,通常为黑白相间的方格,其中每个方格有固定的边长。

  2. 采集棋盘格图像:在不同位置和姿态下,使用摄像头采集多张包含棋盘格的图像。应该尽量避免图像中的棋盘格被遮挡或失真。

  3. 检测角点:对于每张采集到的图像,使用cv2.findChessboardCorners()函数在灰度图像中检测棋盘格的角点。该函数会返回一个布尔值表示是否成功找到角点,以及检测到的角点坐标。

  4. 亚像素级别的角点精确定位:使用cv2.cornerSubPix()函数对粗略检测到的角点进行亚像素级别的精确定位,提高角点位置的精确度。

  5. 构建角点和世界坐标系的对应关系:将每张图像中检测到的角点坐标与对应的世界坐标系(标定板上的实际坐标)建立对应关系。

  6. 进行摄像头内外参数标定:使用cv2.calibrateCamera()函数计算摄像头的内参数矩阵、畸变系数和旋转平移向量等。该函数需要提供角点和世界坐标系的对应关系,以及图像的尺寸。

  7. 校正图像畸变:根据计算得到的摄像头内外参数,使用cv2.undistort()函数对采集到的图像进行畸变校正,去除由摄像头镜头引起的畸变效果。

  8. 评估标定结果:可以使用重投影误差等指标来评估标定结果的质量和准确性。

在这里插入图片描述通过以上步骤,可以实现对摄像头进行标定,并获得摄像头的内外参数信息,以及校正后的图像。这些参数和图像可以用于后续的立体视觉、目标检测、姿态估计等应用中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率二、使用步骤1、研究背景2、方法提出3、相关方法3.1、FSR网络结构3.2…

【微信小程序】常用的几种轮播图

轮播效果一 wxml: <view classpageBox pageOne><view classlist><swiper indicator-dots"{{true}}" autoplay"{{false}}" previous-margin"{{140rpx}}" next-margin"{{140rpx}}" bindchange"swiperChange"&…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…

算子:详细篇

目录 一、执行环境 1.1 创建执行环境 1.2 执行模式 二、源算子 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从socket读取数据 2.4 从kafka读取数据 三、转换算子 3.1 基本转换算子 &#xff08;1&#xff09;映射(map) &#xff08;2&#xff09;过滤(filter) &#xff08…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

云手机哪一款好用?

随着海外市场的不断发展&#xff0c;云手机市场也呈现蓬勃的态势&#xff0c;众多云设备软件纷纷涌现。企业在选择云手机软件时&#xff0c;如何找到性能卓越的软件成为一项关键任务。在众多选择中&#xff0c;OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

一文详解C++拷贝构造函数

文章目录 引入一、什么是拷贝构造函数&#xff1f;二、什么情况下使用拷贝构造函数&#xff1f;三、使用拷贝构造函数需要注意什么&#xff1f;四、深拷贝和浅拷贝浅拷贝深拷贝 引入 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。 相当…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…

CSC签证费报销的相关规定及要求-主要国家签证费报销凭据

国家留学基金委&#xff08;CSC&#xff09;派出流程很多是在留学服务机构办理&#xff0c;即北京教育部留学服务中心及教育部出国人员上海集训部&#xff0c;其中含签证费报销。本篇知识人网小编以上海集训部为例&#xff0c;详细解读一下签证费报销的相关规定及要求&#xff…

sql 行转列 日周月 图表统计

目录 目录 需求 准备 月 分析 按月分组 行转列 错误版本 正确版本 日 分析 行转列 周 分析 按周分组 行转列 本年 需求 页面有三个按钮 日周月&#xff0c;统计一周中每天(日)&#xff0c;一月中每周(周)&#xff0c;一年中每月(月)&#xff0c;设备台数 点…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文&#xff0c;本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

Leetcode—114. 二叉树展开为链表【中等】

2023每日刷题&#xff08;九十八&#xff09; Leetcode—114. 二叉树展开为链表 Morris-like算法思想 可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题中序遍历的 Morris 算法有些神似&#xff0c;我们需要两步完成这道题。 将左子树插入到右子树的地方将原来的右…

Java - OpenSSL与国密OpenSSL

文章目录 一、定义 OpenSSL&#xff1a;OpenSSL是一个开放源代码的SSL/TLS协议实现&#xff0c;也是一个功能丰富的加密库&#xff0c;提供了各种主要的加密算法、常用的密钥和证书封装管理功能以及SSL协议。它被广泛应用于Web服务器、电子邮件服务器、VPN等网络应用中&#x…

线性表--栈

1.什么是栈&#xff1f; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff…

YOLOv5改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程&#xff1a; 数据预处理&#xff1a;图像数据处理&#xff0c…

Spring 的执行流程以及 Bean 的作用域和生命周期

文章目录 Bean 的作用域更改作用域的方式singletonprototype Spring 执行流程Bean 的生命周期 Bean 的作用域 Spring 容器在初始化⼀个 Bean 的实例时&#xff0c;同时会指定该实例的作用域。Bean 有6种作用域 singleton&#xff1a;单例作用域prototype&#xff1a;原型作用域…

Hadoop-MapReduce-MRAppMaster启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-源码跟读-客户端篇>中已经将到&#xff1a;作业提交到ResourceManager&#xff0c;那…

首发:2024全球DAO组织发展研究

作者&#xff0c;张群&#xff08;专注DAO及区块链应用研究&#xff0c;赛联区块链教育首席讲师&#xff0c;工信部赛迪特邀资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09; DAO&#xff08;去中心化自治组织&am…