OpenCV 基础模块 Python 版

OpenCV 基础模块权威指南(Python 版)

一、模块全景图

plaintext

OpenCV 架构 (v4.x+)
├─ 核心层
│  ├─ core:基础数据结构与操作(Mat/Scalar/Point)
│  └─ imgproc:图像处理流水线(滤波→变换→检测)
├─ 交互层
│  ├─ highgui:GUI 与媒体 I/O(显示/捕获/交互)
│  └─ video:视频分析(运动检测/目标跟踪)
├─ 3D 视觉层
│  └─ calib3d:相机校准与 3D 重建
├─ 特征工程层
│  └─ features2d:特征检测/描述/匹配
├─ 应用层
│  ├─ objdetect:传统目标检测(Haar/HOG)
│  ├─ ml:经典机器学习(SVM/K-means)
│  └─ dnn:深度学习推理(YOLO/ResNet)
├─ 工具模块
│  ├─ flann:快速近邻搜索
│  ├─ photo:图像修复(inpaint)
│  └─ stitching:图像拼接

二、核心模块详解

模块 1:核心模块(cv2.core

1.1 数据结构体系
结构维度典型用途内存布局示例
MatN-D图像 / 矩阵(含 ROI 机制)(height, width, channels)
Scalar1-D多通道值(BGR 颜色 / 像素值)(B, G, R) (0-255)
Point2-D坐标点(x, y)(100, 200)
Size2-D尺寸(width, height)(320, 240)
Rect4-D矩形(x, y, width, height)(50, 50, 200, 150)
1.2 核心操作

python

# 图像创建与属性
img = np.zeros((480, 640, 3), dtype=np.uint8)  # 黑色图像(BGR)
print(f"图像尺寸: {img.shape}")  # (480, 640, 3)
print(f"数据类型: {img.dtype}")  # uint8# 区域操作(ROI)
roi = img[100:300, 200:400]  # 裁剪区域
roi[:] = (0, 255, 0)         # 设置为绿色# 绘图函数(抗锯齿优化)
cv2.circle(img, (320, 240), 50, (255, 0, 0), 2, cv2.LINE_AA)  # 抗锯齿圆
cv2.putText(img, "OpenCV", (50, 50), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 255, 255), 1, cv2.LINE_AA)
1.3 内存管理最佳实践
  • 浅拷贝img_view = img[::](共享数据,无内存复制)
  • 深拷贝img_copy = img.copy()(独立数据副本)
  • 类型转换gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)(节省内存的通道转换)

模块 2:图像处理(cv2.imgproc

2.1 处理流水线(典型工作流)

plaintext

输入图像 → 滤波(降噪) → 几何变换 → 颜色空间转换 → 阈值处理 → 特征检测
2.2 核心功能矩阵
功能分类算法类型核心函数典型参数示例
图像滤波线性滤波cv2.GaussianBlur()ksize=(5,5), sigmaX=1.0
非线性滤波cv2.medianBlur()ksize=3
几何变换仿射变换cv2.warpAffine()M=平移/旋转矩阵
透视变换cv2.warpPerspective()M=3x3 透视矩阵
颜色空间色域转换cv2.cvtColor()code=COLOR_BGR2HSV
阈值处理全局阈值cv2.threshold()thresh=127, type=THRESH_BINARY
自适应阈值cv2.adaptiveThreshold()method=ADAPTIVE_THRESH_GAUSSIAN_C
边缘检测梯度法cv2.Sobel()ddepth=CV_64F, dx=1, dy=0
轮廓检测cv2.Canny()threshold1=50, threshold2=150
2.3 实战案例:图像锐化

python

# 定义锐化卷积核(拉普拉斯算子变种)
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]
], dtype=np.float32)sharpened = cv2.filter2D(img, -1, kernel)  # -1 表示保留原数据类型

模块 3:图形用户界面(cv2.highgui

3.1 交互系统架构

plaintext

显示系统:imshow() → 窗口管理(destroyAllWindows())
输入系统:waitKey() → 键盘事件(ASCII 码捕获)
鼠标系统:setMouseCallback() → 事件驱动(点击/拖拽)
3.2 高级应用:实时视频标注

python

# 鼠标回调函数(标注矩形)
drawing = False
ix, iy = -1, -1def draw_rectangle(event, x, y, flags, param):global ix, iy, drawingif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing:cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)elif event == cv2.EVENT_LBUTTONUP:drawing = False# 主循环
cv2.namedWindow("Annotation")
cv2.setMouseCallback("Annotation", draw_rectangle)while True:cv2.imshow("Annotation", img)if cv2.waitKey(1) & 0xFF == ord('s'):  # 保存标注cv2.imwrite("annotated.jpg", img)elif cv2.waitKey(1) & 0xFF == 27:  # ESC 退出break

模块 4:视频分析(cv2.video

4.1 运动分析流水线

plaintext

视频流 → 背景建模(MOG2/KNN) → 前景提取 → 目标跟踪(KCF/MOSSE) → 轨迹绘制
4.2 背景减除实战

python

# 初始化 MOG2 背景减除器
back_sub = cv2.createBackgroundSubtractorMOG2(history=200,        # 历史帧数detectShadows=False # 关闭阴影检测
)cap = cv2.VideoCapture("traffic.mp4")while cap.isOpened():ret, frame = cap.read()if not ret: break# 前景掩码fg_mask = back_sub.apply(frame)# 形态学后处理(降噪)fg_mask = cv2.morphologyEx(fg_mask, cv2.MORPH_CLOSE, np.ones((5,5), np.uint8))# 轮廓检测contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CARACTER_APPROX_SIMPLE)# 绘制运动区域for cnt in contours:if cv2.contourArea(cnt) > 1000:  # 过滤小区域x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(frame, (x,y), (x+w,y+h), (0, 255, 0), 2)cv2.imshow("Motion Detection", frame)if cv2.waitKey(30) & 0xFF == ord('q'):break

模块 5:相机校准(cv2.calib3d

5.1 校准参数体系
参数名称物理意义典型值范围
内参矩阵 (K)焦距 / 主点 / 畸变[[f_x, 0, c_x], [0, f_y, c_y], [0, 0, 1]]
畸变系数 (D)径向 / 切向畸变[k1, k2, p1, p2, k3]
外参矩阵 (R/T)相机姿态(旋转 / 平移)3x3 旋转矩阵 + 平移向量
5.2 完整校准流程
  1. 采集棋盘格图像(≥10 张)

    python

    # 生成棋盘格角点(世界坐标系)
    objp = np.zeros((7*5, 3), np.float32)
    objp[:,:2] = np.mgrid[0:7, 0:5].T.reshape(-1, 2)  # 7x5 内角点
    
  2. 检测角点并优化

    python

    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    imgpoints = []  # 存储图像角点for img_path in calibration_images:img = cv2.imread(img_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, corners = cv2.findChessboardCorners(gray, (7,5), None)if ret:corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)imgpoints.append(corners)cv2.drawChessboardCorners(img, (7,5), corners, ret)
    
  3. 计算校准参数

    python

    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None
    )
    
  4. 去畸变应用

    python

    h, w = img.shape[:2]
    newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
    undistorted = cv2.undistort(img, mtx, dist, None, newcameramtx)
    

模块 6:特征工程(cv2.features2d

6.1 特征检测对比
算法专利状态尺度不变旋转不变计算速度描述子维度
SIFT已过期128
SURF专利64/128
ORB开源是(FAST + 金字塔)是(BRIEF + 旋转)32
6.2 ORB 特征匹配实战

python

# 初始化 ORB
orb = cv2.ORB_create(nfeatures=500,    # 最大特征数scaleFactor=1.2,  # 金字塔缩放系数patchSize=31      # 描述子区域大小
)# 提取特征
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)# 匹配特征(汉明距离)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)  # 按距离排序# 绘制匹配
matched_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:30], None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS
)

模块 7:目标检测(cv2.objdetect

7.1 Haar 级联检测优化

python

# 加载优化后的分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml"
)# 多尺度检测(GPU 加速)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.1,   # 尺度步长minNeighbors=5,    # 检测框最小邻域minSize=(30, 30),  # 最小检测尺寸flags=cv2.CASCADE_SCALE_IMAGE
)# 绘制结果(带置信度)
for (x,y,w,h) in faces:cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)cv2.putText(img, "Face", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255,0,0), 2)

模块 8:深度学习(cv2.dnn

8.1 YOLOv8 目标检测实战

python

# 加载模型(需下载 yolov8n.onnx)
net = cv2.dnn.readNetFromONNX("yolov8n.onnx")# 预处理
blob = cv2.dnn.blobFromImage(img, 1/255.0, (640, 640), swapRB=True, crop=False
)# 前向传播
net.setInput(blob)
outputs = net.forward(net.getUnconnectedOutLayersNames())# 解析输出
for output in outputs:for detection in output:scores = detection[4:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:# 边界框解码x, y, w, h = detection[:4] * np.array([img.shape[1], img.shape[0], img.shape[1], img.shape[0]])cx, cy = int(x), int(y)w, h = int(w), int(h)cv2.rectangle(img, (cx-w//2, cy-h//2), (cx+w//2, cy+h//2), (0, 255, 0), 2)cv2.putText(img, f"{class_names[class_id]} {confidence:.2f}", (cx-w//2, cy-h//2-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

三、模块对比与选型指南

任务类型传统方案(CPU)深度学习方案(GPU)性能对比
人脸检测Haar + objdetectMTCNN + dnn★★★☆ vs ★★★★★
图像分类SVM + mlResNet + dnn★★☆ vs ★★★★★
目标跟踪KCF + videoByteTrack + dnn★★★ vs ★★★★★
图像拼接stitching 模块DeepStitch + dnn★★★★ vs ★★★★★

四、开发最佳实践

4.1 性能优化技巧

  1. 数据类型优化

    • 使用 uint8 存储图像(节省内存)
    • 浮点运算使用 float32(比 float64 快 2 倍)
  2. ROI 操作

    python

    # 高效 ROI 赋值(避免循环)
    img[100:200, 300:400] = (0, 255, 0)  # 整区域赋值
    
  3. 向量化操作

    python

    # 替代循环的向量化操作
    img[:, :, 0] = 0  # 批量设置蓝色通道为 0
    
  4. GPU 加速

    python

    # 启用 GPU(需 OpenCV 编译时支持)
    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
    net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
    

4.2 内存管理

操作类型内存开销推荐方法
图像复制★★★★★使用 ROI 或 numpy 视图
大矩阵运算★★★★☆预先分配内存(np.zeros()
视频帧处理★★★☆☆释放无用帧(del frame

五、安装与环境配置

5.1 安装命令

bash

# 基础安装(主模块)
pip install opencv-python==4.8.0.76  # 稳定版# 完整安装(含 contrib 模块)
pip install opencv-contrib-python==4.8.0.76# 验证安装
python -c "import cv2; print(cv2.__version__)"  # 输出版本号

5.2 环境配置(Windows)

  1. 添加系统环境变量

    • OPENCV_DIRC:\PythonXX\Lib\site-packages\cv2
    • PATH 追加:%OPENCV_DIR%\python-XX(如 python-3.11
  2. GPU 支持

    • 安装 CUDA 工具包(匹配显卡架构)
    • 编译 OpenCV 时启用 WITH_CUDA=ON(需从源码构建)

六、学习资源图谱

6.1 官方资源

  • OpenCV Python 教程(官方权威)
  • OpenCV 示例库(含 C++/Python 示例)

6.2 实战项目

  1. 基础项目

    • 人脸检测考勤系统(objdetect + highgui
    • 图像风格迁移(imgproc + 卷积核)
  2. 进阶项目

    • 实时目标跟踪器(video + dnn
    • 3D 物体重建(calib3d + 多视角图像)
  3. 工业级项目

    • 缺陷检测(imgproc + ml
    • 自动驾驶感知(dnn + 多传感器融合)

七、常见问题解决方案

问题现象解决方案
图像显示乱码(中文)使用 matplotlib 替代 highgui(支持中文标题):
plt.title("中文标题", fontproperties="SimHei")
视频播放卡顿1. 降低分辨率:resize(frame, (640, 480))
2. 减少 waitKey() 延迟:waitKey(1)
特征检测内存溢出限制特征数量:ORB_create(nfeatures=1000)
使用轻量级算法(ORB 替代 SIFT)
GPU 加速失败1. 确认显卡支持 CUDA
2. 安装匹配的 OpenCV 版本(含 CUDA 支持)

八、模块扩展(高级方向)

  1. 生物识别

    • 指纹识别:imgproc(图像增强)+ features2d(细节点匹配)
    • 虹膜识别:calib3d(眼球建模)+ dnn(特征提取)
  2. 医学影像

    • 病灶检测:dnn(U-Net 语义分割)
    • 3D 重建:calib3d(多切片配准)+ stitching(体积渲染)
  3. 无人机视觉

    • 目标跟踪:video(光流法)+ dnn(实时检测)
    • 地形测绘:calib3d(多视几何)+ stitching(全景拼接)

九、总结与学习路径

plaintext

新手入门 → 掌握 core/imgproc/highgui(图像基础操作)
↓
中级进阶 → 学习 video/calib3d/features2d(视频分析与 3D 视觉)
↓
高级实战 → 精通 dnn/ml/objdetect(深度学习与目标识别)
↓
工程落地 → 结合 flann/photo/stitching(性能优化与完整方案)

推荐学习周期

  • 基础阶段(1-2 周):完成图像读写、滤波、几何变换
  • 进阶阶段(2-4 周):实现目标检测、特征匹配、相机校准
  • 实战阶段(4-8 周):开发完整项目(如智能监控、AR 应用)

通过此指南,开发者可快速构建 OpenCV 知识体系,从模块原理到工程实践实现全栈能力提升。建议结合 OpenCV 官方教程(每周 10 小时)与实战项目(每月 1 个完整项目)持续精进。

附录:模块速查表

模块名核心功能典型函数示例内存复杂度
core数据结构与基础操作Matline()copyTo()★★☆
imgproc图像处理流水线GaussianBlur()warpAffine()Canny()★★★★
highgui交互界面imshow()VideoCapture()setMouseCallback()★★☆
video视频分析createBackgroundSubtractorMOG2()TrackerKCF_create()★★★★
calib3d3D 视觉calibrateCamera()solvePnP()★★★★★
features2d特征工程SIFT_create()BFMatcher()★★★★☆
dnn深度学习推理readNetFromONNX()forward()★★★★★

(注:内存复杂度 ★ 表示相对 CPU 内存占用,★★★★★ 为高内存需求)

此总结融合了模块原理、代码实现、性能优化与工程实践,适合从初学者到资深开发者的全阶段学习。建议配合官方文档与实战项目(如人脸检测、视频跟踪)进行巩固,逐步构建计算机视觉工程能力。

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

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

相关文章

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2024年我国省市县三级逐月归一化植被指数&#xff08;NDVI&#xff09;数据&#xff0c;该数据是基于NASA定期发布的MOD13A3数据集中的月度NDVI栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;计算得出。很多小伙伴拿到数据后反馈是否可以处理出…

背包问题——动态规划的经典问题包括01背包问题和完全背包问题

01背包问题&#xff1a;给你多个物品每个物品只能选一次&#xff0c;要你在不超过背包容积&#xff08;或者恰好等于&#xff09;的情况下选择装价值最大的组合。如果没有动态规划的基础其实是很难理解这个问题的&#xff0c;所以看这篇文章之前先去学习一下动态规划的基本思想…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…

Docker搭建Testlink教程

1.拉取镜像 打开终端输入命令&#xff1a; #拉取mariadb镜像 docker pull bitnami/mariadb #拉取testlink镜像 docker pull bitnami/testlink-archived 执行结果&#xff1a; 2.运行容器 打开终端输入命令&#xff1a; #创建容器网络 docker network create testlink #查…

考研c语言复习之栈

栈一般出选择题&#xff0c;队列选择题和大题都有 栈&#xff1a;只允许在一端 进行插入或删除操作的线性表即栈顶&#xff08;top) s.top-1时栈为空 向栈中插入元素 s.tops.top1;s.data[s.top]value; 这段代码可以用一行代码代替&#xff1a; s.data[s.top]value; 不懂i和…

C#里使用libxl来合并单元格的例子

操作EXCEL的文件格式是常用的功能&#xff0c; 通过不同的单元格的合并&#xff0c;可以生成不同的表格。 如下图所示&#xff1a; 采用libxl来创建上面的EXCEL&#xff0c;使用下面的代码来实现&#xff1a; private void button8_Click(object sender, EventArgs e) {var …

大屏技术汇集【目录】

Cesium 自从首次发布以来&#xff0c;经历了多个版本的迭代和更新&#xff0c;每个版本都带来了性能改进、新功能添加以及对现有功能的优化。以下是 Cesium 一些重要版本及其主要特点&#xff1a; 主要版本概述 Cesium 1.0 (2012年) 初始版本发布&#xff0c;确立了Cesium作为…

《深度学习》——YOLOv3详解

文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一种先进的实时目标检测算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色&#xff0c;具有速度快、精…

websocket中spring注入失效

一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1&#xff1a;问题2&#xff1a; 反思解决方案一&#xff1a;方案二&#xff1a;方案三&#xff1a;方案四&#xff1a; 场景 首页有个webso…

QT开发(4)--各种方式实现HelloWorld

目录 1. 编辑框实现 2. 按钮实现 前面已经写过通过标签实现的了&#xff0c;所以这里就不写了&#xff0c;通过这两个例子&#xff0c;其他的也是同理 1. 编辑框实现 编辑框分为单行编辑框&#xff08;QLineEdit&#xff09;双行编辑框&#xff08;QTextEdit&#xff09;&am…

自由学习记录(45)

顶点片元着色器&#xff08;important&#xff09; 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多&#xff0c;灵活性较强&#xff0c;性能消耗更可控&#xff0c;可以实现更多渲染细节 4.适用于光照处理较少&#xf…

内存管理(C++篇)

前言 我们在C语言阶段学习过内存管理的相关操作和知识&#xff0c;比如说malloc&#xff0c;calloc等内存开辟函数&#xff0c;但我们在学的时候会发现&#xff0c;使用这些函数还是相对来说比较冗杂的&#xff0c;那么今天我们来学习C语言中相关的内存管理操作&#xff0c;相信…

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

一、关于科木电商 “小鹿豆豆”&#xff0c;一个年轻的品牌&#xff0c;近期在无论是淘宝、拼多多还是抖音电商平台&#xff0c;都成了亮眼的爆品。这个由绵阳科木电子商务有限公司推出的新品牌&#xff0c;以其高品质的保湿云柔巾迅速赢得了母婴护理市场的青睐&#xff0c;特别…

图数据库Neo4j和JDK安装与配置教程(超详细)

目录 前言 一、Java环境配置 &#xff08;一&#xff09;JDK的下载与安装 &#xff08;二&#xff09;JDK环境配置 &#xff08;三&#xff09;检测JDK17是否配置成功 二、Neo4j的安装与配置 &#xff08;一&#xff09;Neo4j的下载与安装 &#xff08;二&#xff09;N…

git原理与常用命令及其使用

认识工作区、暂存区、版本库 ⼯作区&#xff1a;是在电脑上你要写代码或⽂件的⽬录。 暂存区&#xff1a;英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件&#xff08;.git/index&#xff09;中&#xff0c;我们 把暂存区有时也叫作索引&#xff08;index&#xf…

Web-Machine-N7靶机通关攻略

获取靶机ip arp-scan -l 端口扫描 nmap xxxx 访问80端口发现没用 扫描目录 gobuster dir -u http:/192.168.117.160 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium,txt -x php,html,txt ,zip 打开exploit.html 点击F12&#xff0c;修改localhost为靶机ip&#…

2025-03-21 Unity 网络基础3——TCP网络通信准备知识

文章目录 1 IP/端口类1.1 IPAddress1.2 IPEndPoint 2 域名解析2.1 IPHostEntry2.2 Dns 3 序列化与反序列化3.1 序列化3.1.1 内置类型 -> 字节数组3.1.2 字符串 -> 字节数组3.1.3 类对象 -> 字节数组 3.2 反序列化3.2.1 字节数组 -> 内置类型3.2.2 字节数组 -> 字…

Java-servlet(七)详细讲解Servlet注解

Java-servlet&#xff08;七&#xff09;详细讲解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用与优势2.2 示例代码 三、Target 注解3.1 定义与用途3.2 示例代码 四、WebServlet 注解4.1 作用4.2 示例代码 五、反射与注解5.1 反射的概念5.2 注解与反射的结合使…

nginx 反向代理 ubuntu

关键字 Nginx&#xff0c;正向代理&#xff0c;方向代理&#xff0c;博客建站 背景环境 我在搭建个人博客的过程中遇到一个问题&#xff0c;我的博客服务的端口是1313&#xff0c;我的域名是qinyangx.top。我希望能够通过qinyangx.top直接访问到服务器上1313端口的博客服务。…