pyrealsense2获取保存点云

一、第一种实现代码

Python

import sys
import cv2
import pyrealsense2 as rs
import numpy as np
import keyboard
import open3d as o3d
import os

if __name__ == "__main__":
    output_folder = 'output_data/'
    os.makedirs(output_folder, exist_ok=True)

    pipeline = rs.pipeline()
    config = rs.config()
    config.enable_stream(rs.stream.depth, 848, 480, rs.format.z16, 30)
    config.enable_stream(rs.stream.color, 848, 480, rs.format.bgr8, 30)
    # Start streaming
    pipeline.start(config)
    # 深度图像向彩色对齐
    align_to_color = rs.align(rs.stream.color)
    i = 0
    try:
        while True:
            pc = rs.pointcloud()
            # Wait for a coherent pair of frames: depth and color
            frames = pipeline.wait_for_frames()
            frames = align_to_color.process(frames)

            depth_frame = frames.get_depth_frame()
            color_frame = frames.get_color_frame()
            if not depth_frame or not color_frame:
                print("wrong!")

            cv2.imshow("color_image", np.asanyarray(color_frame.get_data()))
            cv2.waitKey(1)
            if keyboard.is_pressed("a"):
                pc.map_to(color_frame)
                points = pc.calculate(depth_frame)
                vtx = np.asanyarray(points.get_vertices())
                npy_vtx = np.array(vtx).view(np.float32).reshape(-1, 3)

                tex_coords = np.asanyarray(points.get_texture_coordinates())
                tex_coords = np.array(tex_coords).view(np.float32).reshape(-1, 2)
                color_image = np.asanyarray(color_frame.get_data())
                u_pixel_indices = (tex_coords[:, 0] * (color_image.shape[1] - 1)).astype(int)
                v_pixel_indices = (tex_coords[:, 1] * (color_image.shape[0] - 1)).astype(int)
                u_pixel_indices = np.clip(u_pixel_indices, 0, color_image.shape[1] - 1)
                v_pixel_indices = np.clip(v_pixel_indices, 0, color_image.shape[0] - 1)
                colors = color_image[v_pixel_indices, u_pixel_indices, :]
                colors = colors[:, [2, 1, 0]] / 255.0
                print("points", type(points), points)
                print("npy_vtx", npy_vtx.shape, npy_vtx)

                pcd = o3d.geometry.PointCloud()
                pcd.points = o3d.utility.Vector3dVector(npy_vtx)
                pcd.colors = o3d.utility.Vector3dVector(colors)
                # 显示点云
                o3d.io.write_point_cloud(output_folder + str(i) + ".ply",
                                         pcd)
                i += 1
            if keyboard.is_pressed("q"):
                sys.exit()

    finally:
        # Stop streaming
        pipeline.stop()

代码解析:

这段代码是使用Python和Intel RealSense SDK (pyrealsense2) 来捕捉深度相机的数据,并将深度数据与彩色数据结合,形成彩色的点云,然后将点云保存为PLY文件。同时,这里也使用了OpenCV来显示彩色图像和Open3D来处理和保存点云。

代码的执行流程如下:

  1. 首先,设置输出文件夹,如果不存在则创建。

  2. 初始化RealSense流水线(pipeline)和配置(config),分别启用深度和彩色流。

  3. 启动流水线开始捕获数据。

  4. 创建一个rs.align对象,以便将深度帧对齐到彩色帧。

  5. 进入一个无限循环中,不断地从流水线获取帧(即图像数据)。

  6. 使用align_to_color.process(frames)处理帧,使深度帧与彩色帧对齐。

  7. 提取深度帧和彩色帧,如果没有获取到这些帧,打印错误信息。

  8. 使用OpenCV显示彩色图像。

  9. 检查用户是否按下了“A”键。如果按下了,执行以下操作:

    • 使用pc.map_to(color_frame)映射颜色到点云。

    • 使用pc.calculate(depth_frame)计算点云。

    • 将点云的顶点(vtx)转换为NumPy数组,并重塑为三维数据。

    • 获取纹理坐标,重塑并转换为像素索引。

    • 使用像素索引从彩色图像中检索每个点的颜色。

    • 颜色数组的通道顺序可能需要从BGR转换为RGB,并归一化到[0, 1]范围。

    • 创建一个Open3D点云对象,并设置其顶点和颜色。

    • 将点云保存为PLY文件,文件名包含一个递增的编号。

  10. 如果程序被中断(可能是通过Ctrl+C或其他方式),则会执行finally块,停止流水线。

此代码还包含了一些关键函数和方法:

  • pipeline.wait_for_frames():从流水线等待并获取一组一致的帧。

  • pipeline.stop():停止流水线。

  • cv2.imshow("color_image", image):用于显示图片的OpenCV函数。

  • cv2.waitKey(1):用于OpenCV图像显示的键盘事件监听。

  • o3d.geometry.PointCloud():创建一个空的Open3D点云对象。

  • o3d.io.write_point_cloud():用于保存点云到文件的Open3D函数。

  • keyboard.is_pressed("a")和keyboard.is_pressed("q"):检查是否按下了特定的按键。

结果:

本人用的是一个放在白纸上的小方块,用cloudcompare软件查看点云

二、第一种实现代码 

Python

import sys
import cv2
import pyrealsense2 as rs
import numpy as np
import keyboard
import open3d as o3d
import os

if __name__ == "__main__":
    output_folder = 'output_data/'
    os.makedirs(output_folder, exist_ok=True)
    pipeline = rs.pipeline()
    config = rs.config()
    config.enable_stream(rs.stream.depth, 848, 480, rs.format.z16, 30)
    config.enable_stream(rs.stream.color, 848, 480, rs.format.bgr8, 30)
    i = 0
    pipeline.start(config)
    align_to_color = rs.align(rs.stream.color)
    try:
        while True:

            # Wait for a coherent pair of frames: depth and color
            frames = pipeline.wait_for_frames()
            frames = align_to_color.process(frames)

            depth_frame = frames.get_depth_frame()

            color_frame = frames.get_color_frame()

            depth_intrinsics = depth_frame.profile.as_video_stream_profile().intrinsics
            profile = frames.get_profile()
            if not depth_frame or not color_frame:
                continue

            # Convert images to numpy arrays
            depth_image = np.asanyarray(depth_frame.get_data())
            color_image = np.asanyarray(color_frame.get_data())

            cv2.imshow("color_image", color_image)
            cv2.waitKey(1)
            color_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)
            depth_image = cv2.cvtColor(depth_image, cv2.COLOR_BGR2RGB)
            if keyboard.is_pressed("a"):
                print("type of depth_image:", type(depth_image))
                print("shape of depth_image:", depth_image.shape)

                o3d_color = o3d.geometry.Image(color_image)
                o3d_depth = o3d.geometry.Image(depth_image)
                rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(o3d_color, o3d_depth,
                                                                                depth_scale=1000.0,
                                                                                depth_trunc=3.0,
                                                                                convert_rgb_to_intensity=False)

                intrinsics = profile.as_video_stream_profile().get_intrinsics()
                # 转换为open3d中的相机参数
                pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(
                    intrinsics.width, intrinsics.height,
                    intrinsics.fx, intrinsics.fy,
                    intrinsics.ppx, intrinsics.ppy
                )
                o3d_result = o3d.geometry.PointCloud.create_from_rgbd_image(
                    rgbd_image,
                    pinhole_camera_intrinsic
                )
                o3d.io.write_point_cloud(output_folder + str(i) + ".ply",
                                         o3d_result)
                i += 1
            if keyboard.is_pressed("q"):
                sys.exit()

    finally:
        pipeline.stop()

代码解析:

这段代码使用Intel RealSense SDK (pyrealsense2) 与 Open3D 库结合来捕获深度和彩色图像数据,并生成彩色点云,最后将点云保存为PLY文件格式。同时,该代码也使用了OpenCV来显示彩色图像,并使用keyboard库来监听键盘事件。下面是对代码的详细解析:

  1. output_folder = 'output_data/':定义输出文件夹的路径。

  2. os.makedirs(output_folder, exist_ok=True):创建输出文件夹,如果该文件夹已经存在,则不会引发错误。

  3. 创建一个RealSense流水线(pipeline)和配置(config)对象,配置深度流和彩色流。

  4. 使用配置启动流水线(pipeline.start(config))。

  5. 定义一个rs.align对象align_to_color,以便将深度数据对齐到彩色数据。

  6. 进入一个无限循环,等待获取一对深度和彩色帧。

  7. 使用align_to_color.process(frames)将获取的帧对齐,以确保深度和彩色图像匹配。

  8. 转换深度帧和彩色帧到NumPy数组,并使用OpenCV显示彩色图像。

  9. 将彩色图像从BGR格式转换为RGB格式,因为Open3D使用的是RGB格式。

  10. 如果用户按下了“A”键,则执行以下步骤:

    • 打印深度图像的类型和形状。

    • 将NumPy中的图像数组转换为Open3D图像对象。

    • 使用Open3D创建RGBD图像对象。

    • 从帧的配置文件中获取相机内参。

    • 将相机内参转换成Open3D格式。

    • 使用RGBD图像和相机内参生成Open3D点云。

    • 将点云保存为PLY格式的文件。

  11. 如果用户按下了“Q”键,则退出程序。

  12. 如果程序被中断,无论是正常退出还是异常终止,finally块确保流水线被停止,释放相关资源。

代码中的depth_scaledepth_trunc参数在创建RGBD图像时使用,分别用于定义深度图像的单位转换(毫米到米)和深度截断阈值(超过此值的深度将被忽略)。convert_rgb_to_intensity参数设置为False,意味着在生成RGBD图像时不需要将彩色图像转换为灰度图像的强度值。

结果:

三、提取感兴趣区域点云的第一种实现代码 

Python

import sys
import cv2
import pyrealsense2 as rs
import numpy as np
import keyboard
import open3d as o3d
import os

if __name__ == "__main__":
    output_folder = 'output_data/'
    os.makedirs(output_folder, exist_ok=True)
    width = 848
    height = 480
    pipeline = rs.pipeline()
    config = rs.config()
    config.enable_stream(rs.stream.depth, width, height, rs.format.z16, 30)
    config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, 30)
    pipeline.start(config)
    align_to_color = rs.align(rs.stream.color)
    i = 0

    try:
        while True:
            pc = rs.pointcloud()
            frames = pipeline.wait_for_frames()
            frames = align_to_color.process(frames)
            depth_frame = frames.get_depth_frame()
            color_frame = frames.get_color_frame()
            if not depth_frame or not color_frame:
                continue
            cv2.imshow("color_image", np.asanyarray(color_frame.get_data()))
            cv2.waitKey(1)
            if keyboard.is_pressed("a"):
                pc.map_to(color_frame)
                points = pc.calculate(depth_frame)

                # 获取点云的顶点
                vtx = np.asarray(points.get_vertices())

                # 获取点云的纹理坐标
                tex_coords = np.asarray(points.get_texture_coordinates())

                # 获取彩色图像的数据,用于提取颜色
                color_image = np.asanyarray(color_frame.get_data())

                # (定义ROI边界 (x_min, y_min, x_max, y_max))
                x_min, y_min, x_max, y_max = 100, 100, 540, 380
                # 过滤ROI内的点和纹理坐标
                roi_vtx = []
                roi_tex_coords = []
                for y in range(y_min, y_max):
                    for x in range(x_min, x_max):
                        index = y * width + x
                        if vtx[index][2]:  # 如果深度值非零
                            roi_vtx.append(vtx[index])
                            roi_tex_coords.append(tex_coords[index])

                roi_vtx = np.array(roi_vtx).view(np.float32).reshape(-1, 3)
                roi_tex_coords = np.array(roi_tex_coords).view(np.float32).reshape(-1, 2)

                # 转换纹理坐标为像素坐标
                u_pixel_indices = (roi_tex_coords[:, 0] * (color_image.shape[1] - 1)).astype(int)
                v_pixel_indices = (roi_tex_coords[:, 1] * (color_image.shape[0] - 1)).astype(int)

                # 获取点云颜色
                roi_colors = color_image[v_pixel_indices, u_pixel_indices, :]

                # 创建Open3D点云
                pcd = o3d.geometry.PointCloud()
                pcd.points = o3d.utility.Vector3dVector(roi_vtx)
                pcd.colors = o3d.utility.Vector3dVector(roi_colors[:, [2, 1, 0]] / 255.0)  # 归一化颜色值

                # 保存点云
                o3d.io.write_point_cloud(output_folder + str(i) + ".ply", pcd)
                i += 1
            if keyboard.is_pressed("q"):
                sys.exit()

    finally:
        pipeline.stop()

代码解析:

x_min, y_min, x_max, y_max = 100, 100, 540, 380
# 过滤ROI内的点和纹理坐标
roi_vtx = []
roi_tex_coords = []
for y in range(y_min, y_max):
for x in range(x_min, x_max):
index = y * width + x
if vtx[index][2]:  # 如果深度值非零
roi_vtx.append(vtx[index])
roi_tex_coords.append(tex_coords[index])
  1. x_min, y_min, x_max, y_max = 100, 100, 540, 380:这一行定义了ROI的边界,在此示例中,ROI是矩形框,其左上角坐标为 (100, 100),右下角坐标为 (540, 380)

  2. width = 848 和 height = 480:这两行定义了深度图像的宽度和高度。在此示例中,深度图像的分辨率是 848x480。

  3. roi_vtx = [] 和 roi_tex_coords = []:这两行初始化两个空列表,用于存储ROI内的顶点(vtx)和纹理坐标(tex_coords)。

  4. 接下来的嵌套循环遍历定义的ROI中的每个像素坐标 (x, y)

    • for y in range(y_min, y_max): 遍历ROI垂直方向上的每一行。

    • for x in range(x_min, x_max): 遍历ROI水平方向上的每一列。

  5. index = y * width + x:这一行计算当前 (x, y) 坐标在深度图像一维数组中的索引。深度图像的数据以一维数组形式存储,计算索引时需要将二维坐标 (x, y) 转换为一维索引。转换方法是:y 行乘以每行的像素数(width),然后加上当前行的列坐标 x

  6. if vtx[index][2]::这一行检查当前点的深度值是否非零(索引 [2] 表示 Z 轴,即深度)。如果深度值为零,表示该点没有有效的深度信息,因此不包含在ROI内的点云中。

  7. roi_vtx.append(vtx[index]) 和 roi_tex_coords.append(tex_coords[index]):如果当前点具有有效的深度信息,则将点的顶点和纹理坐标追加到 roi_vtx 和 roi_tex_coords 列表中。

结果:

四、提取感兴趣区域点云的第二种实现代码

Python

import sys
import cv2
import pyrealsense2 as rs
import numpy as np
import keyboard
import open3d as o3d
import os

if __name__ == "__main__":
    output_folder = 'output_data3/'
    os.makedirs(output_folder, exist_ok=True)
    pipeline = rs.pipeline()
    config = rs.config()
    # 定义感兴趣区域(ROI)的边界
    x_min, y_min, x_max, y_max = 100, 100, 540, 380
    config.enable_stream(rs.stream.depth, 848, 480, rs.format.z16, 30)
    config.enable_stream(rs.stream.color, 848, 480, rs.format.bgr8, 30)
    i = 0
    pipeline.start(config)
    align_to_color = rs.align(rs.stream.color)
    try:
        while True:
            # Wait for a coherent pair of frames: depth and color
            frames = pipeline.wait_for_frames()
            frames = align_to_color.process(frames)
            depth_frame = frames.get_depth_frame()
            color_frame = frames.get_color_frame()
            if not depth_frame or not color_frame:
                continue

            # Convert images to numpy arrays
            depth_image = np.asanyarray(depth_frame.get_data())
            color_image = np.asanyarray(color_frame.get_data())

            # Defining ROI on color image
            color_image_roi = color_image[y_min:y_max, x_min:x_max]
            # Defining ROI on depth image
            depth_image_roi = depth_image[y_min:y_max, x_min:x_max]

            cv2.imshow("color_image", color_image)
            cv2.imshow("color_image_roi", color_image_roi)  # 显示ROI的彩色图像
            cv2.waitKey(1)
            color_image = cv2.cvtColor(color_image_roi, cv2.COLOR_BGR2RGB)
            depth_image = cv2.cvtColor(depth_image_roi, cv2.COLOR_BGR2RGB)
            if keyboard.is_pressed("a"):
                o3d_color = o3d.geometry.Image(color_image)
                o3d_depth = o3d.geometry.Image(depth_image)
                rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
                    o3d_color,
                    o3d_depth,
                    depth_scale=1000.0,
                    depth_trunc=3.0,
                    convert_rgb_to_intensity=False
                )

                profile = frames.get_profile()
                intrinsics = profile.as_video_stream_profile().get_intrinsics()
                # 转换为open3d中的相机参数
                pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(
                    intrinsics.width, intrinsics.height,
                    intrinsics.fx, intrinsics.fy,
                    intrinsics.ppx, intrinsics.ppy
                )
                o3d_result = o3d.geometry.PointCloud.create_from_rgbd_image(
                    rgbd_image,
                    pinhole_camera_intrinsic
                )
                # Transform the point cloud to the original coordinate system
                o3d_result.transform([[1, 0, 0, -x_min], [0, 1, 0, -y_min], [0, 0, 1, 0], [0, 0, 0, 1]])
                o3d.io.write_point_cloud(output_folder + str(i) + ".ply", o3d_result)
                i += 1
            if keyboard.is_pressed("q"):
                sys.exit()
    finally:
        pipeline.stop()

代码解析: 

color_image_roi = color_image[y_min:y_max, x_min:x_max]
depth_image_roi = depth_image[y_min:y_max, x_min:x_max]
color_image = cv2.cvtColor(color_image_roi, cv2.COLOR_BGR2RGB)
depth_image = cv2.cvtColor(depth_image_roi, cv2.COLOR_BGR2RGB)
o3d_result.transform([[1, 0, 0, -x_min], [0, 1, 0, -y_min], [0, 0, 1, 0], [0, 0, 0, 1]])
  1. color_image_roi = color_image[y_min:y_max, x_min:x_max]: 这行代码定义了彩色图像的一个区域兴趣(ROI),通过在原始彩色图像数组上使用数组切片功能。color_image 是一个NumPy数组,而 [y_min:y_max, x_min:x_max] 是一个切片操作,它从图像中提取从 y_min 到 y_max 行和从 x_min 到 x_max 列的像素。结果是一个新的图像数组,只包含原始彩色图像中指定矩形区域的像素。

  2. depth_image_roi = depth_image[y_min:y_max, x_min:x_max]: 这行代码与上面的类似,它定义了深度图像的一个ROI。这意味着只有深度图像中的指定区域将被用于后续处理。在捕获彩色图像的同时,同样的区域也从深度图像中取出,以确保彩色和深度图像的对应关系。

  3. color_image = cv2.cvtColor(color_image_roi, cv2.COLOR_BGR2RGB): 这行代码使用OpenCV库的 cvtColor 函数将ROI中的彩色图像从BGR颜色空间转换到RGB颜色空间。这通常是必要的,因为OpenCV默认使用BGR颜色顺序,而Open3D和其他许多图像处理库则预期图像为RGB颜色顺序。

  4. depth_image = cv2.cvtColor(depth_image_roi, cv2.COLOR_BGR2RGB): 这行代码似乎不正确,因为深度图像通常是单通道的(灰度图),它只包含深度信息而没有颜色。因此,深度图像不需要从BGR转换到RGB,而应该保留原始格式。这可能是一个编码错误,应该将该行代码删除或替换为正确处理单通道深度图像的代码。

  5. o3d_result.transform([[1, 0, 0, -x_min], [0, 1, 0, -y_min], [0, 0, 1, 0], [0, 0, 0, 1]]): 这行代码应用了一个4x4的仿射变换矩阵,以调整点云的坐标。在这个变换中,仅在x和y方向上应用了平移(-x_min 和 -y_min),目的是将点云对齐回其在原始图像中的相对位置。这是因为创建点云时仅使用了原始图像的一个小区域(ROI),而不是整个图像。

结果:

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

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

相关文章

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

【面试题】ES文档写入和读取流程详解

前言:在回答这个问题之前我们先要搞清楚一个问题那就是什么是文档,避免不知所云! 一、什么是文档? 在Elasticsearch中,文档(Document)是最基本的信息单元,用于表示和存储数据。文…

数据采集用,集成了主流工业通讯协议

IoTClient 是一个物联网设备通讯协议实现客户端,集成了主流工业通讯协议,包括主流PLC通信读取、ModBus协议、Bacnet协议等。该组件基于.NET Standard 2.0,适用于.NET的跨平台开发,可在Windows、Linux等系统上运行,甚至…

LinkedIn账号为什么被封?被封后如何解决?

近期会有一些小伙伴说自己遇到了帐号无法登录的情况,其实出现领英帐号被封号(被限制登录)主要会有两类情况,今天就给大家分享一下如果被封该如何解决,强烈建议收藏。 在电脑领英官网或者手机领英APP上,输入领英帐号密码点击登录后…

数据结构(五)单链表专题

在开始之前,我先来给大家讲一下顺序表与链表的区别: 它们在堆上存储的差异: 我们可以很容易的知道,循序表是连续的有序的,但链表是杂乱的,它们通过地址彼此联系起来。 1. 链表的概念及结构 概念&#xff1…

【光伏科普】光伏投融资计算的意义

光伏产业,作为清洁能源的重要组成部分,近年来在全球范围内得到了广泛的关注与发展。而在光伏项目的实施过程中,投融资计算显得尤为重要。本文旨在探讨光伏投融资计算的意义,以及它如何影响光伏产业的可持续发展。 首先&#xff0c…

无法找到filesystem头文件

无法找到filesystem头文件 一、前言 这段时间接老板命令,做目标识别模型的嵌入式部署。需要将模型运行环境编译后打包到瑞芯微开发板上运行,在此之前我对原C文件做过修改,为了能实现与厂商提供的数据接口对接。 我在用CMake打包过程中&…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中,JMeter是一款非常强大和流行的自动化测试工具,它可以测试各种类型的应用程序,并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程,指导你如何使用JMe…

腾讯VS网易:一场不见终局的游戏未来之战

国内游戏霸主腾讯最近赚足了眼球。 总体上看,腾讯手握“游戏社交”两大王牌,最近发布的财报十分亮眼,其2023年总营收和净利润分别同比增长10%和36%,展现了互联网巨头的强劲活力。 然而巨头亦有焦虑,增值服务营收同比…

数学算法(算法竞赛、蓝桥杯)--分解质因数、唯一分解定理

1、B站视频链接&#xff1a;G07 分解质因数 唯一分解定理 试除法_哔哩哔哩_bilibili 题目链接&#xff1a;质因子分解 - 洛谷 #include <bits/stdc.h> using namespace std;int n; int a[100010];//质因子的个数void decompose(int x){for(int i2;i*i<x;i){//i增加&a…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…

Linux Tomcat的服务器如何查看接口请求方式?

问题描述 最近在和安卓开发对接接口&#xff0c;遇到一个接口总是报405错误&#xff0c;有对接经验的开发应该都知道是请求方式不对&#xff0c;假如接口定义为POST请求的&#xff0c;但是客户端却用GET请求&#xff0c;这时候就会报这个错误。Android客户端那边使用xUtils框架…

扫雷大师:用C语言揭秘自动展开盘面与智能扫雷策略

目录 扫雷自动展开盘面智能扫雷更优策略完整代码 扫雷 扫雷游戏是一款经典的单人电脑游戏&#xff0c;其主要规则如下&#xff1a; 游戏目标&#xff1a;游戏的目标是在不触发任何地雷的情况下&#xff0c;找出所有非雷区域。玩家需要根据格子周围的数字来推断哪些格子含有地雷…

MFC(二)集成基础控件

目录 OnCreateCStatic【标签&#xff0c;图片】CEdit【文本框&#xff0c;密码框&#xff0c;数值框&#xff0c;文本区】CButton【按钮&#xff0c;单选按钮&#xff0c;多选按钮】CComboBox【下拉列表&#xff0c;列表】CSliderCtrl【滑动条】CListCtrl【表格】CAnimateCtrl【…

第十二届蓝桥杯JavaB组省赛真题 - ASC

解题思路&#xff1a; 这是目前为止做到过最简单的了 public class Main {public static void main(String[] args) {int res L-A 65;System.out.print(res);} }

东联直播音效助手

东方联盟创始人郭盛华为广大主播免费开发的一款专用的音效场控工具&#xff0c;通过这款软件&#xff0c;主播使用各种精彩的音效&#xff0c;避免直播间过于低沉和尴尬&#xff0c;从而更好的拉近观众的距离。音效有掌声、爆笑声、尖叫声、关注点赞、任务等各种音效. 【东方联…

【win10 win11添加右键】git bash

打开注册表编辑器。 按下Win键 R&#xff0c;然后输入”regedit”并按下回车键来打开注册表编辑器。计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\git_bash\command2. 导航到注册表路径&#xff1a;依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。右键…

电商系列之仓储发货

疫情3年&#xff0c;大多数人都将购买需求转移到了线上。同时由于暴涨的订单数量、还在恢复中的物流运输等因素&#xff0c;导致用户的收货时间缓慢甚至是发货时间、收货时间延后。那么笔者就从订单的仓库作业流程入手&#xff0c;分析了用户订单发货延后的原因。 受到最近疫情…

2024年软件测试,“我“从初级到高级进阶,不再走弯路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 现在2024年&#…

【git分支管理策略】如何高效的管理好代码版本

目录 1.分支管理策略 2.我用的分支管理策略 3.一些常见问题 1.分支管理策略 分支管理策略就是一些经过实践后总结出来的可靠的分支管理的办法&#xff0c;让分支之间能科学合理、高效的进行协作&#xff0c;帮助我们在整个开发流程中合理的管理好代码版本。 目前有两套Git…
最新文章