当前位置: 首页 > news >正文

OpenCV实战教程 第一部分:基础入门

第一部分:基础入门

1. OpenCV简介

什么是OpenCV及其应用领域

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,于1999年由Intel公司发起,现在由非营利组织OpenCV.org维护。OpenCV旨在提供一个共同的基础设施,加速计算机视觉在商业产品中的应用,并推动计算机视觉研究的发展。

OpenCV的主要特点:

  • 完全开源和跨平台
  • 支持C++、Python、Java等多种编程语言
  • 包含超过2500个优化算法
  • 全球拥有超过1800万下载量

主要应用领域:

  1. 工业自动化:缺陷检测、零件识别、尺寸测量
  2. 医疗影像:病变检测、医学图像分析
  3. 安防监控:人脸识别、行为分析、车牌识别
  4. 增强现实(AR):实时图像处理、特征追踪
  5. 自动驾驶:道路标记识别、障碍物检测
  6. 机器人导航:环境感知、路径规划
  7. 文档分析:OCR(光学字符识别)、文本检测
  8. 人机交互:手势识别、姿态检测
  9. 移动应用:照片处理、实时滤镜

开发环境搭建

Windows系统

安装Python和pip(如果尚未安装)

  1. 访问 Python官网,下载并安装最新版Python(推荐Python 3.7以上版本)
  2. 安装时勾选"Add Python to PATH"选项
  3. 打开命令提示符,输入以下命令确认安装成功:
 

bash

python --version
pip --version

安装OpenCV

  1. 在命令提示符中运行以下命令:
 

bash

pip install opencv-python
pip install opencv-contrib-python  # 包含扩展模块

安装IDE(推荐)

  • 下载并安装Visual Studio Code: Visual Studio Code - Code Editing. Redefined
  • 安装Python扩展
MacOS系统

使用Homebrew安装Python(如果尚未安装)

  1. 安装Homebrew(如果尚未安装):
 

bash

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安装Python:
 

bash

brew install python

安装OpenCV

 

bash

pip3 install opencv-python
pip3 install opencv-contrib-python  # 包含扩展模块

安装IDE(推荐)

  • 下载并安装Visual Studio Code: Visual Studio Code - Code Editing. Redefined
  • 安装Python扩展
Linux系统(Ubuntu示例)

安装Python和pip(如果尚未安装)

 

bash

sudo apt update
sudo apt install python3 python3-pip

安装OpenCV依赖项

 

bash

sudo apt install libgl1-mesa-glx

安装OpenCV

 

bash

pip3 install opencv-python
pip3 install opencv-contrib-python  # 包含扩展模块

安装IDE(推荐)

 

bash

sudo snap install code --classic  # 安装Visual Studio Code

安装配置和第一个程序"Hello OpenCV"

验证安装

创建一个Python文件,例如verify_opencv.py,输入以下代码:

 

python

import cv2# 打印OpenCV版本
print(f"OpenCV 版本: {cv2.__version__}")# 检查是否可以创建窗口
try:cv2.namedWindow("Test", cv2.WINDOW_NORMAL)cv2.destroyAllWindows()print("OpenCV GUI功能正常!")
except Exception as e:print(f"OpenCV GUI功能异常: {e}")

运行此脚本验证OpenCV安装是否成功。

第一个程序:"Hello OpenCV"

我们将创建一个简单的程序,实现以下功能:

  1. 读取一张图片
  2. 在图片上显示"Hello OpenCV"文字
  3. 显示图片
  4. 保存结果

创建一个Python文件,例如hello_opencv.py

 

python

import cv2
import numpy as np# 创建一个纯色背景图像(500x300的蓝色背景)
# OpenCV中颜色顺序是BGR(蓝、绿、红)而不是RGB
image = np.zeros((300, 500, 3), dtype=np.uint8)
image[:] = (255, 127, 0)  # 橙色背景# 添加文字
text = "Hello OpenCV!"
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
font_thickness = 3
text_color = (255, 255, 255)  # 白色文字# 获取文本大小,以便居中
(text_width, text_height), baseline = cv2.getTextSize(text, font, font_scale, font_thickness)
x = (image.shape[1] - text_width) // 2  # 计算文本起始x坐标(居中)
y = (image.shape[0] + text_height) // 2  # 计算文本起始y坐标(居中)# 在图像上绘制文本
cv2.putText(image, text, (x, y), font, font_scale, text_color, font_thickness)# 在窗口中显示图像
window_name = "First OpenCV Program"
cv2.namedWindow(window_name)
cv2.imshow(window_name, image)# 保存图像
cv2.imwrite("hello_opencv.jpg", image)
print("图像已保存为 'hello_opencv.jpg'")# 等待直到按下任意键
print("按任意键关闭窗口...")
cv2.waitKey(0)
cv2.destroyAllWindows()

代码讲解:

  1. import cv2:导入OpenCV库。
  2. import numpy as np:导入NumPy库,用于图像矩阵操作。
  3. image = np.zeros((300, 500, 3), dtype=np.uint8):创建一个黑色图像,大小为300x500像素,3个颜色通道。
  4. image[:] = (255, 127, 0):将图像背景设为橙色。注意OpenCV中颜色顺序是BGR(蓝、绿、红)。
  5. cv2.putText():在图像上绘制文字。
  6. cv2.namedWindow():创建一个命名窗口。
  7. cv2.imshow():在窗口中显示图像。
  8. cv2.imwrite():保存图像到文件。
  9. cv2.waitKey(0):等待按键输入,参数0表示无限等待。
  10. cv2.destroyAllWindows():关闭所有窗口。

运行结果:

  • 一个带有"Hello OpenCV!"文字的橙色窗口
  • 生成的图像将保存为hello_opencv.jpg

这是你的第一个OpenCV程序!恭喜!现在我们已经完成了OpenCV的安装和基本配置,接下来将深入学习图像基础知识。

2. 图像基础

图像的数字表示方式

在计算机中,图像以二维或三维矩阵(数组)的形式存储:

灰度图像:

  • 二维矩阵,每个元素代表一个像素
  • 像素值范围通常为0-255(8位),0表示黑色,255表示白色
  • 例如:100×100的灰度图像是一个100×100的二维矩阵

彩色图像:

  • 三维矩阵,其中第三个维度表示颜色通道
  • 常见的RGB图像有3个通道:红、绿、蓝
  • 在OpenCV中,颜色通道顺序为BGR(蓝、绿、红)
  • 像素值范围通常为每通道0-255(8位)
  • 例如:100×100的彩色RGB图像是一个100×100×3的三维矩阵

图像数据类型: 在OpenCV中,图像通常使用NumPy数组表示,常见的数据类型有:

  • uint8:无符号8位整数(0-255),最常用
  • float32:32位浮点数,用于高精度计算
  • float64:64位浮点数

让我们创建一个程序来理解图像的数字表示:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 创建一个简单的灰度渐变图像
gradient = np.linspace(0, 255, 256, dtype=np.uint8)
gradient = np.tile(gradient, (100, 1))# 创建一个简单的彩色图像
color_channels = np.zeros((100, 256, 3), dtype=np.uint8)
color_channels[:, :, 0] = np.linspace(0, 255, 256, dtype=np.uint8)  # 蓝色通道
color_channels[:, :, 1] = np.linspace(0, 255, 256, dtype=np.uint8)  # 绿色通道
color_channels[:, :, 2] = np.linspace(0, 255, 256, dtype=np.uint8)  # 红色通道# 显示图像
plt.figure(figsize=(10, 6))plt.subplot(2, 1, 1)
plt.title('灰度渐变图像')
plt.imshow(gradient, cmap='gray')
plt.axis('off')plt.subplot(2, 1, 2)
plt.title('RGB渐变图像')
plt.imshow(cv2.cvtColor(color_channels, cv2.COLOR_BGR2RGB))  # 转换BGR为RGB用于正确显示
plt.axis('off')plt.tight_layout()
plt.savefig('gradients.png')
plt.show()# 打印图像形状和数据类型
print(f"灰度图像形状: {gradient.shape}, 数据类型: {gradient.dtype}")
print(f"彩色图像形状: {color_channels.shape}, 数据类型: {color_channels.dtype}")# 查看特定位置的像素值
position = (50, 150)  # 第50行,第150列
print(f"灰度图像在位置{position}的像素值: {gradient[position]}")
print(f"彩色图像在位置{position}的像素值: {color_channels[position]}")

代码讲解:

  1. 创建了一个灰度渐变图像(从黑到白)
  2. 创建了一个RGB渐变图像(从黑到白)
  3. 使用matplotlib显示这些图像
  4. 打印图像的形状和数据类型
  5. 查看特定位置的像素值

注意:我们使用cv2.cvtColor()函数将BGR转换为RGB,因为OpenCV使用BGR顺序,而matplotlib使用RGB顺序。

色彩空间(RGB、HSV、灰度图)

颜色空间是表示颜色的不同方法。最常见的色彩空间包括:

RGB(红-绿-蓝):

  • 最常见的色彩空间,使用红、绿、蓝三个通道的组合表示颜色
  • 每个通道值范围为0-255(8位)
  • 在OpenCV中,默认颜色顺序是BGR而不是RGB

HSV(色调-饱和度-明度):

  • 色调(H):颜色种类,范围0-179(在OpenCV中,对应0-360度)
  • 饱和度(S):颜色的纯度/鲜艳程度,范围0-255
  • 明度(V):颜色的亮度,范围0-255
  • 比RGB更接近人类感知颜色的方式
  • 常用于颜色追踪和分割

灰度(Grayscale):

  • 单通道,只有亮度信息,没有颜色信息
  • 值范围通常为0-255,0表示黑色,255表示白色
  • 计算量小,常用于不需要颜色信息的任务

让我们编写一个程序来实现不同色彩空间的转换和比较:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 创建一个彩色测试图像(彩虹渐变)
def create_rainbow():# 创建一个大小为200x300的彩虹图像rainbow = np.zeros((200, 300, 3), dtype=np.uint8)# 为了简化,我们创建一个水平的彩虹渐变for i in range(300):# 将位置映射到0-360的色调值(对应OpenCV中的0-179)hue = int(i / 300 * 180)# 创建一个满饱和度、满亮度的HSV颜色rainbow_hsv = np.ones((200, 1, 3), dtype=np.uint8) * np.array([hue, 255, 255], dtype=np.uint8)# 转换为BGRrainbow[:, i:i+1] = cv2.cvtColor(rainbow_hsv, cv2.COLOR_HSV2BGR)return rainbow# 创建彩虹图像
rainbow = create_rainbow()# 转换为不同的色彩空间
rainbow_rgb = cv2.cvtColor(rainbow, cv2.COLOR_BGR2RGB)  # BGR到RGB
rainbow_hsv = cv2.cvtColor(rainbow, cv2.COLOR_BGR2HSV)  # BGR到HSV
rainbow_gray = cv2.cvtColor(rainbow, cv2.COLOR_BGR2GRAY)  # BGR到灰度# 显示不同色彩空间的图像
plt.figure(figsize=(12, 10))plt.subplot(4, 1, 1)
plt.title('原始图像 (BGR转RGB显示)')
plt.imshow(rainbow_rgb)
plt.axis('off')plt.subplot(4, 1, 2)
plt.title('HSV色彩空间 - 色调(H)通道')
plt.imshow(rainbow_hsv[:, :, 0], cmap='hsv')
plt.axis('off')plt.subplot(4, 1, 3)
plt.title('HSV色彩空间 - 饱和度(S)和亮度(V)通道')
plt.imshow(np.dstack([np.zeros_like(rainbow_hsv[:, :, 1]), rainbow_hsv[:, :, 1], rainbow_hsv[:, :, 2]]), cmap='gray')
plt.axis('off')plt.subplot(4, 1, 4)
plt.title('灰度图像')
plt.imshow(rainbow_gray, cmap='gray')
plt.axis('off')plt.tight_layout()
plt.savefig('color_spaces.png')
plt.show()# 展示H、S、V三个独立通道
plt.figure(figsize=(12, 8))plt.subplot(3, 1, 1)
plt.title('HSV - 色调(H)通道')
plt.imshow(rainbow_hsv[:, :, 0], cmap='hsv')
plt.axis('off')plt.subplot(3, 1, 2)
plt.title('HSV - 饱和度(S)通道')
plt.imshow(rainbow_hsv[:, :, 1], cmap='gray')
plt.axis('off')plt.subplot(3, 1, 3)
plt.title('HSV - 亮度(V)通道')
plt.imshow(rainbow_hsv[:, :, 2], cmap='gray')
plt.axis('off')plt.tight_layout()
plt.savefig('hsv_channels.png')
plt.show()

代码讲解:

  1. create_rainbow()函数创建了一个彩虹渐变图像,展示从红到紫的完整色彩范围
  2. 使用cv2.cvtColor()函数将图像从BGR转换到其他色彩空间
  3. 使用matplotlib显示不同色彩空间的图像和HSV的各个通道
  4. cv2.COLOR_BGR2RGBcv2.COLOR_BGR2HSVcv2.COLOR_BGR2GRAY是OpenCV中的色彩空间转换常量

OpenCV中常用的色彩空间转换常量:

  • cv2.COLOR_BGR2RGB:BGR→RGB
  • cv2.COLOR_RGB2BGR:RGB→BGR
  • cv2.COLOR_BGR2GRAY:BGR→灰度
  • cv2.COLOR_GRAY2BGR:灰度→BGR
  • cv2.COLOR_BGR2HSV:BGR→HSV
  • cv2.COLOR_HSV2BGR:HSV→BGR
  • cv2.COLOR_BGR2Lab:BGR→Lab
  • cv2.COLOR_Lab2BGR:Lab→BGR

图像读取、显示与保存

现在,让我们学习如何使用OpenCV读取、显示和保存图像,这是计算机视觉应用的基本操作。

图像读取

OpenCV提供了cv2.imread()函数来读取图像:

 

python

image = cv2.imread('path/to/image.jpg')

imread()有两个参数:

  1. 文件路径
  2. 读取标志(可选),常用的有:
    • cv2.IMREAD_COLOR:以彩色模式读取图像(默认)
    • cv2.IMREAD_GRAYSCALE:以灰度模式读取图像
    • cv2.IMREAD_UNCHANGED:读取图像,包括alpha通道(如果有)
图像显示

OpenCV使用cv2.imshow()函数显示图像:

 

python

cv2.imshow('Window Name', image)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 关闭所有窗口
图像保存

OpenCV使用cv2.imwrite()函数保存图像:

 

python

cv2.imwrite('output.jpg', image)

让我们编写一个完整的程序来演示这些操作:

 

python

import cv2
import os
import sysdef process_image(image_path):"""读取、显示和保存图像的基本演示"""# 检查文件是否存在if not os.path.isfile(image_path):print(f"错误: 文件 '{image_path}' 不存在")return# 读取图像(以彩色模式)color_image = cv2.imread(image_path, cv2.IMREAD_COLOR)if color_image is None:print(f"错误: 无法读取图像 '{image_path}'")return# 读取图像(以灰度模式)gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)# 获取图像信息height, width = color_image.shape[:2]channels = 1 if len(color_image.shape) == 2 else color_image.shape[2]# 打印图像信息print(f"图像信息:")print(f"- 路径: {image_path}")print(f"- 宽度 x 高度: {width} x {height} 像素")print(f"- 通道数: {channels}")print(f"- 数据类型: {color_image.dtype}")print(f"- 文件大小: {os.path.getsize(image_path) / 1024:.2f} KB")# 创建输出文件夹output_dir = "output"if not os.path.exists(output_dir):os.makedirs(output_dir)# 保存灰度图像gray_output_path = os.path.join(output_dir, "gray_" + os.path.basename(image_path))cv2.imwrite(gray_output_path, gray_image)print(f"灰度图像已保存到: {gray_output_path}")# 显示图像cv2.namedWindow("彩色图像", cv2.WINDOW_NORMAL)cv2.namedWindow("灰度图像", cv2.WINDOW_NORMAL)cv2.imshow("彩色图像", color_image)cv2.imshow("灰度图像", gray_image)print("按 'Esc' 键关闭窗口...")while True:key = cv2.waitKey(0) & 0xFFif key == 27:  # Esc键breakcv2.destroyAllWindows()if __name__ == "__main__":# 如果提供了命令行参数,使用它作为图像路径# 否则,使用默认图像if len(sys.argv) > 1:image_path = sys.argv[1]else:# 使用内置的示例图像或当前目录中的示例图像# 如果没有图像,将提示用户sample_images = ["sample.jpg", "test.jpg", "image.jpg"]found = Falsefor img in sample_images:if os.path.isfile(img):image_path = imgfound = Truebreakif not found:print("请提供图像路径作为命令行参数,或确保当前目录有示例图像。")print("用法: python image_io.py <图像路径>")sys.exit(1)process_image(image_path)

代码讲解:

  1. cv2.imread() 函数读取图像,可以选择彩色或灰度模式
  2. 我们获取并打印图像的基本信息(尺寸、通道数、数据类型等)
  3. cv2.imwrite() 函数将灰度图像保存到输出目录
  4. cv2.namedWindow() 创建窗口,指定 cv2.WINDOW_NORMAL 允许调整窗口大小
  5. cv2.imshow() 在各自的窗口中显示彩色和灰度图像
  6. cv2.waitKey(0) 等待按键,& 0xFF 确保在不同平台上正确工作
  7. cv2.destroyAllWindows() 关闭所有OpenCV窗口

运行程序:

  1. 将代码保存为 image_io.py
  2. 运行命令 python image_io.py path/to/your/image.jpg
  3. 如果没有提供图像路径,程序将尝试在当前目录中查找示例图像
实用技巧:使用matplotlib显示图像

OpenCV的imshow()函数很强大,但有时使用matplotlib可能更方便,特别是当你想比较多个图像时:

 

python

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('path/to/image.jpg')# 将BGR转换为RGB(matplotlib使用RGB顺序)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 使用matplotlib显示图像
plt.figure(figsize=(10, 8))
plt.imshow(image_rgb)
plt.title('使用Matplotlib显示图像')
plt.axis('off')  # 隐藏坐标轴
plt.show()

3. 基本图像操作

像素访问与修改

在OpenCV中,图像被表示为NumPy数组,因此可以直接使用NumPy的索引操作来访问和修改像素值。

访问像素值
 

python

# 访问(y, x)位置的像素值(注意:先是y行,再是x列)
pixel = image[y, x]# 对于灰度图像,pixel是一个标量
# 对于彩色图像,pixel是一个含有B,G,R值的数组
修改像素值
 

python

# 修改(y, x)位置的像素值
image[y, x] = new_value# 对于灰度图像,new_value是一个标量
# 对于彩色图像,new_value是[B, G, R]

让我们编写一个程序来演示像素访问和修改:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 创建一个简单的图像
def create_test_image():# 创建白色背景image = np.ones((300, 400, 3), dtype=np.uint8) * 255# 绘制一个蓝色矩形cv2.rectangle(image, (50, 50), (200, 150), (255, 0, 0), thickness=-1)# 绘制一个绿色圆形cv2.circle(image, (300, 150), 80, (0, 255, 0), thickness=-1)# 绘制红色文字font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(image, "OpenCV", (100, 250), font, 2, (0, 0, 255), 3)return image# 创建测试图像
original_image = create_test_image()# 复制原始图像以便修改
modified_image = original_image.copy()# 1. 单个像素修改 - 创建一个小点
for i in range(-3, 4):for j in range(-3, 4):if i*i + j*j <= 9:  # 创建一个小圆点y, x = 150 + i, 250 + jmodified_image[y, x] = [0, 0, 0]  # 黑色点# 2. 区域修改 - 反转一个矩形区域内的颜色
x1, y1, x2, y2 = 100, 50, 150, 100
roi = modified_image[y1:y2, x1:x2]
modified_image[y1:y2, x1:x2] = 255 - roi# 3. 像素值分析
# 获取某一点的像素值
pixel_point = (300, 150)  # x=300, y=150
pixel_value = original_image[pixel_point[1], pixel_point[0]]
print(f"点 {pixel_point} 处的像素值 (BGR): {pixel_value}")# 获取某一区域的像素值统计
roi = original_image[50:100, 150:200]
mean_value = np.mean(roi, axis=(0, 1))
min_value = np.min(roi, axis=(0, 1))
max_value = np.max(roi, axis=(0, 1))print(f"选定区域的平均像素值 (BGR): {mean_value}")
print(f"选定区域的最小像素值 (BGR): {min_value}")
print(f"选定区域的最大像素值 (BGR): {max_value}")# 在图像上标记分析的位置
analysis_image = original_image.copy()
cv2.circle(analysis_image, pixel_point, 5, (0, 0, 0), -1)
cv2.rectangle(analysis_image, (150, 50), (200, 100), (0, 0, 0), 2)# 显示结果
plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
plt.title('原始图像')
plt.axis('off')plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(modified_image,

相关文章:

OpenCV实战教程 第一部分:基础入门

第一部分&#xff1a;基础入门 1. OpenCV简介 什么是OpenCV及其应用领域 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;于1999年由Intel公司发起&#xff0c;现在由非营利组织OpenCV.org维护。Ope…...

OpenCV 图像处理核心技术 (第二部分)

欢迎来到 OpenCV 图像处理的第二部分&#xff01;在第一部分&#xff0c;我们学习了如何加载、显示、保存图像以及访问像素等基础知识。现在&#xff0c;我们将深入探索如何利用 OpenCV 提供的强大工具来修改和分析图像。 图像处理是计算机视觉领域的基石。通过对图像进行各种…...

Git从入门到精通-第二章-工具配置

目录 命令行 安装Git 初次运行Git前的配置​ git config基本概念 常用命令 配置用户信息 配置文本编辑器 查看配置 配置别名&#xff08;简化命令&#xff09; 高级配置 换行符处理&#xff08;方便跨平台协作&#xff09; 忽略文件权限变更&#xff08;常用于团队协…...

树状结构转换工具类

项目中使用了很多树状结构&#xff0c;为了方便使用开发一个通用的工具类。 使用工具类的时候写一个类基础BaseNode&#xff0c;如果有个性化字段添加到类里面&#xff0c;然后就可以套用工具类。 工具类会将id和pid做关联返回一个树状结构的集合。 使用了hutool的工具包判空…...

C#基础简述

C#基础详解 一、C#语言概述 C#&#xff08;读作"C Sharp"&#xff09;是微软开发的面向对象的编程语言&#xff0c;运行在.NET平台上。它结合了C的强大功能和Visual Basic的简单性&#xff0c;具有以下特点&#xff1a; ​​面向对象​​&#xff1a;支持封装、继…...

AI赋能烟草工艺革命:虫情监测步入智能化时代

在当今竞争激烈且品质至上的烟草行业中&#xff0c;生产流程的每一个细微环节都关乎着企业的生死存亡与品牌的兴衰荣辱。烟草工艺部门与制丝、卷包车间作为生产链条的核心驱动&#xff0c;犹如精密仪器中的关键齿轮&#xff0c;彼此紧密咬合、协同运转&#xff0c;任何一处的小…...

小刚说C语言刷题—1462小明的游泳时间

1.题目描述 伦敦奥运会要到了&#xff0c;小明在拼命练习游泳准备参加游泳比赛。 这一天&#xff0c;小明给自己的游泳时间做了精确的计时&#xff08;本题中的计时都按 24 小时制计算&#xff09;&#xff0c;它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分。 请你帮小…...

StarRocks Lakehouse 如何重构大数据架构?

随着数据分析需求的不断演进&#xff0c;企业对数据处理架构的期望也在不断提升。在这一背景下&#xff0c;StarRocks 凭借其高性能的实时分析能力&#xff0c;正引领数据分析进入湖仓一体的新时代。 4 月 18 日&#xff0c;镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…...

用TCP实现服务器与客户端的交互

引言&#xff1a; 这篇文章主要是用TCP构造的回显服务器&#xff0c;也就是客户端发什么&#xff0c;就返回什么。用实现这个过程方式来学会TCP套接字的使用。 一、TCP的特点 TCP是可靠的&#xff1a;这个需要去了解TCP的机制&#xff0c;这是一个大工程&#xff0c;博主后面写…...

用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering

用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering 文章目录 用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering摘要Abstract1. 预备知识1.1 三维的几何表示1.2 计算机中的集合…...

Vue3 Echarts 3D立方体柱状图实现教程

文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 实现一个立方体柱状图&#xff08;1&#xff09;首先实现一个基础柱状图&#xff08;2&#xff09;添加立方体棱线&#x…...

Soildworks怎样在装配体中建立局部剖视图

1思路&#xff1a;建立拉伸切除 2步骤 1-打开点线面显示按钮 2-在装配体中依据某个基准面&#xff08;例如前视基准面&#xff09;建立一个待切除的草图 3-点击顶部工具栏的装配体--->装嫩配体特征---->拉伸切除---Ok 3具体图示 1-点击&#xff0c;使其变成灰色 即…...

基于C++的IOT网关和平台5:github项目ctGateway开发指南

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...

虚拟机centos7安装docker

虚拟机CentOS 7上安装 Docker流程 1. 更新系统软件包 需要确保系统软件包是最新的 sudo yum -y update sudo&#xff1a;以超级用户权限执行命令。 yum&#xff1a;CentOS的包管理器工具。 -y&#xff1a;自动确认所有提示&#xff0c;直接执行。 2. 安装 Docker 依赖 在安装 …...

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文档 1. 项目结构 假设项目名为 springboot-openapi-demo&#xff0c;以下是项目的基本结构&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…...

pytorch对应gpu版本是否可用判断逻辑

# gpu_is_ok.py import torchdef check_torch_gpu():# 打印PyTorch版本print(f"PyTorch version: {torch.__version__}")# 检查CUDA是否可用cuda_available torch.cuda.is_available()print(f"CUDA available: {cuda_available}")if cuda_available:# 打印…...

Kubernetes 集群概念详解

Kubernetes 集群概念详解 Kubernetes 集群是由多个计算节点组成的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用。以下是 Kubernetes 集群的核心概念和架构解析&#xff1a; 一、集群基础架构 1. 集群组成要素 graph TBMaster[控制平面] --> Node1[工作…...

BT137-ASEMI机器人功率器件专用BT137

编辑&#xff1a;LL BT137-ASEMI机器人功率器件专用BT137 型号&#xff1a;BT137 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 引脚数量&#xff1a;3 封装尺寸&#xff1a;如图 特性&#xff1a;双向可控硅 工作结温&#xff1a;-40℃~150℃…...

ArcGIS+GPT:多领域地理分析与决策新方案

技术点目录 AI大模型应用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力数据读取AI助力数据编辑与处理AI助力空间分析AI助力遥感分析AI助力二次开发AI助力科研绘图ArcGISAI综合应用了解更多 ——————————————————————————————————…...

鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile

需要权限&#xff1a;ohos.permission.INTERNET 1.nodejs自定义书写上传后端接口 传输过来的数据放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上传图片保存的地址(目录必须存在)fo…...

【DBeaver】如何连接MongoDB

MongoDB驱动 在 DBeaver 社区版是没有的&#xff0c;得自己下载 一、下载mongo-jdbc-standalone.jar 二、在工具栏找到数据库&#xff0c;选择驱动管理器 三、在驱动管理器点击新建 四、选择库&#xff0c;添加mongo-jdbc-standalone.jar;然后点击找到类 五、选择设置&#x…...

Unity 粒子同步,FishNet

Github的工程 同步画面 使用FishNet插件同步&#xff0c;可使用这个选项来克隆第二个项目进行测试...

自然语言处理之命名实体识别:Bi-LSTM-CRF模型的评估与性能分析

命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)的核心任务之一,旨在从文本中识别出具有特定意义的实体(如人名、地名、机构名等),并为其分类。随着深度学习的发展,**Bi-LSTM-CRF**(双向长短期记忆网络结合条件随机场)模型因其强大的序列建模能力成…...

【SpringBoot】基于mybatisPlus的博客系统

1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻&#xff0c;现在又拾了起来。 这里讲应用&#xff1a;令牌也就用于身份标识&a…...

[Android]任务列表中有两个相机图标

现象&#xff1a; 修改AndroidManifest.xml <activityandroid:name"com.android.camera.PermissionsActivity"android:label"string/app_name"android:launchMode"singleTop"android:configChanges"orientation|screenSize|keyboardH…...

VINS-FUSION:配置参数说明与配置自己的参数

文章目录 📚简介📍配置文件说明📷相机配置参数🔧设备参数🎯配置自己的参数📷相机参数🔧设备参数📚简介 VINS-Fusion 是一个基于优化的多传感器状态估计器,实现了视觉惯性里程计(VIO)和视觉惯性全球导航卫星系统(VI-GNSS)融合。 📍配置文件说明 VINS-Fus…...

Polars: 新一代高性能数据处理库

<------最重要的是订阅“鲁班模锤”------> 在数据科学和数据分析领域&#xff0c;性能和效率一直是从业者关注的焦点。随着数据量的爆炸式增长&#xff0c;传统的数据处理工具如pandas在处理大规模数据时逐渐显露出其局限性。在这样的背景下&#xff0c;一个名为Polars…...

大屏/门户页面兼容各种分辨率或电脑缩放

需求要求: 需要支持缩放功能(缩放后 页面各元素模块正常展示)、 需要适配各种分辨率(初始加载不应出现横向滚动条) 选择的实现方案 利用 zoom 或者 transform 来缩放兼容页面样式&#xff0c;不动业务模块代码 const isMobile /iPhone|iPad|iPod|Android|Harmony/i.test(navi…...

自定义项目中导入文件import顺序

项目中import 顺序 分类顺序 可以根据模块或文件的功能、类型等进行分类&#xff0c;比如将所有的组件放在一起、工具函数放在一起等。这样的组织方式更有利于对项目结构和代码逻辑的理解&#xff0c;当需要查找某一类功能的代码时&#xff0c;可以快速定位到相应的 import 区…...

Git 本地提交撤销

引言 在 Git 版本控制系统中&#xff0c;偶尔会遇到需要撤销本地提交的情况。本文将详细介绍如何优雅地处理这种情况&#xff0c;帮助您在不慌乱的情况下恢复错误提交。 撤销本地提交的主要方法 当您意外提交了错误文件到 Git 仓库&#xff0c;但尚未推送到远程服务器时&…...

k8s术语之Replication Controller

Replication Controller 在kubernetes中简称RC,它其实是定义了一个期望的场景&#xff0c;即声明某种Pod的副本数量在任意时刻都符合某个预期值&#xff0c;包括一下几个值&#xff1a; 1.Pod期待的副本数&#xff08;replicas) 2.用于筛选目标Pod的Lable Selector 3.当…...

AI驱动视频批量智能混剪软件生产技术实践

一、引言&#xff1a;短视频工业化生产的技术革新 在电商带货、知识分享等领域&#xff0c;高效产出差异化视频内容成为核心竞争力。本文结合AI技术与工程实践&#xff0c;解析如何通过智能素材处理、参数化合成引擎、多维度质量控制构建全自动视频生产流水线&#xff0c;实现…...

SPL 量化 回测

回测是一种评估交易策略的通用方法。它通过计算策略在历史数据上的表现来评估交易策略的可行性。如果回测结果良好&#xff0c;交易者和分析师可能会有信心在未来继续使用该策略。 1. 回测脚本 首先要编写回测脚本&#xff0c;将回测脚本保存为 backtest.splx。 脚本代码如下…...

2025年“深圳杯”数学建模挑战赛A题-芯片热弹性物理参数估计

芯片热弹性物理参数估计 小驴数模 当今时代&#xff0c;芯片无疑是现代社会发展的 “核心引擎”。它深度嵌入智能手机&#xff0c;实现全球即时通讯&#xff1b;助力汽车智能驾驶&#xff0c;精准导航、自动操控&#xff1b;赋能工业自动化生产线&#xff0c;高效运转。但随着…...

前端笔记-Element-Plus

结束了vue的基础学习&#xff0c;现在进一步学习组件 Element-Plus部分学习目标&#xff1a; Element Plus1、查阅官方文档指南2、学习常用组件的使用方法3、Table、Pagination、Form4、Input、Input Number、Switch、Select、Date Picker、Button5、Message、MessageBox、N…...

vue3封装全局方法

场景&#xff1a;各个模块详情中存在附件列表数据&#xff0c;需要再每个中添加一个预览附件的方法&#xff0c;是后期提出的需求&#xff0c;所以要在每个模块中进行添加&#xff0c;就去将预览方法封装一下。 将公共方法封装在utils下 utils/filePreview.ts import router…...

Django 学习指南:从入门到精通(大体流程)

想要快速掌握 Django 开发技能吗&#xff1f;按照以下学习流程&#xff0c;带你从零基础成长为独立开发 Web 应用的高手。 一、准备工作&#xff1a;打下坚实基础 在开启 Django 之旅前&#xff0c;先确保你已掌握以下 Python 基础知识&#xff1a; 数据类型&#xff1a;熟悉数…...

Java对集合进行操作,赋值新字段

1、方法一&#xff1a;增强for循环 List<Refund> list refundService.selectRefundList(queryParam); for (Refund refund : list) {refund.setPayWay(refund.getPaymentMethod()); // 将支付方式赋值给付款方式 }在 Java 中&#xff0c;当你使用 for 循环遍历 List<…...

【网工第6版】第6章 网络安全③

目录 ■ 虚拟专用网VPN ◆虚拟专用网基础 ◆VPN分类 ▲根据应用场景不同分类 ▲根据VPN技术实现的网络层次分类 ◎ 二层隧道协议&#xff1a;L2TP和PPTP ◎ 网络层隧道协议&#xff1a;IPSec和GRE ※ IPSec IPSec基础 IPSec原理 IPSec两种封装模式 ※ GRE ■ 应用…...

20250430在ubuntu14.04.6系统上查看系统实时网速

rootrootubuntu:~$ sudo apt-get install iftop 【不需要root权限】 rootrootubuntu:~$ sudo apt-get install nload rootrootubuntu:~$ sudo apt-get install vnstat 【失败】 rootrootubuntu:~$ sudo apt-get install speedtest-cli rootrootubuntu:~$ sudo apt-get install …...

远程 Debugger 多用户环境下的用户隔离实践

远程 Debugger 多用户环境下的用户隔离实践 在现代分布式开发和云原生环境下&#xff0c;远程 Debugger 的应用愈发普遍。然而&#xff0c;随着多人协作和多租户场景的出现&#xff0c;**远程 Debugger 的“用户隔离”**变得至关重要。只有实现了良好的用户隔离&#xff0c;才…...

Neo4j多关系或多路径

目录 一、双向关系 1.创建2个节点间的双向关系 2.创建多个路径的节点&#xff0c;双向关系 3.查询带有方向性的关系 4.查询路径上的多个关系 5.查询出a到b的最短距离 6.查询特定长度的路径 二、将之前的关系清空下&#xff0c;如图所示&#xff0c;在操作一次 1.查询出…...

Locate 3D:Meta出品自监督学习3D定位方法

标题&#xff1a; Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要&#xff1a; 我们提出了 Locate 3D&#xff0c;这是一种可根据指代表达&#xff08;如“沙发和灯之间的小咖啡桌”&#xff09;在三维场景中定位物体的模型。Locate 3…...

Copilot for Excel 一键词云分析与情绪分析

在Excel中使用copilot对数据进行高级分析&#xff0c;我们已经领略过copilot的强悍能力&#xff1a; 零代码、超越DeepSeek&#xff1a;Excel高级数据分析&#xff0c;copilot加持、Python助力 Python in Excel高级分析&#xff1a;一键RFM分析 然而&#xff0c;很多时候我们…...

【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解

【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解 前言1、安装2、常用命令3、命令使用详解 前言 本篇文章主要介绍Linux下网络工具ifconfig/iproute(iproute2)的安装、使用示例和场景。操作系统Ubuntu 18.04。 1、安装 使用apt-get install 命令安装ifconfig和ipr…...

硬盘分区丢失≠末日!3步逻辑恢复法+物理修复全流程图解

引言&#xff1a;硬盘分区丢失——数据安全的“隐形杀手” 在数字化时代&#xff0c;硬盘作为数据存储的核心载体&#xff0c;承载着个人、企业乃至社会的关键信息。然而&#xff0c;硬盘分区丢失这一突发状况&#xff0c;往往让用户措手不及&#xff1a;文件系统突然报错、盘…...

数据接收全流程图(物理网卡 → 应用层)

以下是 DPDK VPP 在 Linux 系统中从网卡收包到应用层的完整数据流程图及分步解析&#xff0c;结合了内核旁路和用户态协议栈的协同工作&#xff1a; 数据接收全流程图&#xff08;物理网卡 → 应用层&#xff09; plaintext 复制 下载 ----------------------------------…...

【AI】DeepSeek 流程图 / 时序图制作,Word 排版错乱问题,文字转直观图形

一&#xff1a;动态流程图 / 时序图制作&#xff08;DeepSeek Draw.IO&#xff09; 工具准备 DeepSeek&#xff08;AI 生成代码&#xff09;&#xff1a;官网&#xff08;免费&#xff09;Draw.IO&#xff08;可视化渲染&#xff09;&#xff1a;官网&#xff08;免费&#…...

C++继承(上)

目录 一、继承的概念及定义 1. 继承的概念 2. 继承的定义 2.1 定义格式 2.2 继承关系和访问限定符 2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 一、继承的概念及定义 1. 继承的概念 继承是面向对象编…...

分布式-redisson

分布式锁redisson 加锁流程缓存相关问题 加锁流程 redisson底层通过lua脚本实现加锁的原子性lock动作包含&#xff1a;加锁、设置超时时间、锁续命未获取到锁的线程通过获取信号量许可等待&#xff0c;所释放后释放信号量通知等待线程 缓存相关问题 缓存失效&#xff08;击穿…...