Image Stitching using OpenCV
文章目录
- 简介
- 图像拼接管道
- 特征检测和提取
- 特征检测
- 特征提取
- 特征匹配
- 强力匹配
- FLANN(近似最近邻快速库)匹配
- 单应性估计
- 扭曲和混合
- 结论
使用opencv进行图像拼接
原为url:
https://medium.com/@paulsonpremsingh7/image-stitching-using-opencv-a-step-by-step-tutorial-9214aa4255ec
概述:在本文中,我们将介绍如何使用 OpenCV 将图像拼接在一起。为了创建更大的合成图像(例如全景图),图像拼接需要连接多张重叠的照片。我们将介绍图像拼接过程的每个阶段,包括特征匹配、单应性估计和混合。在本教程结束时,您将能够使用 OpenCV 将大量图像组合成壮观的全景图。
目录:
简介
- 图像拼接管道
- 特征检测和提取
- 特征匹配
- 单应性估计
- 扭曲和混合
- 结论
简介
图像拼接是一种从多张重叠照片创建合成图像(包括全景图)的方法。与仅使用一张图像相比,它可以捕获更多信息并创建更大的视野。许多行业(包括摄影、虚拟现实和机器人技术)都使用图像拼接。
通过使用图像拼接,可以制作全景图,为观众提供广阔景观或建筑奇迹的无缝视角。它们提供了一种保存和捕捉场景之美的方法,而这种美无法在单个帧中正确传达。摄影师可以使用图像拼接来展示山脉的壮丽、开阔田野的大小或建筑奇观的细微细节。
大比例尺地图、3D 场景重建,甚至医学成像(重叠的扫描切片被拼接在一起)都可以使用图像拼接进行。图像拼接可以帮助机器人专家创建全景地图以进行导航或视觉定位。
我们可以探索这项技术的各种用途,并通过理解图像拼接过程和使用 OpenCV 的功能来释放制作壮丽全景照片的潜力。无论您是从事机器人或测绘项目的工程师、计算机视觉研究人员还是摄影爱好者,了解使用 OpenCV 进行图片拼接都可以拓宽您的创意选择并打开通往迷人机会的大门。
图像拼接管道
通过将图像拼接过程分解为多个步骤,可以形成将多张单独的照片转换为无缝合成图的管道。要实现精确的对齐和混合,每个阶段都是必不可少的。在本节中,我们将概述分步图像拼接管道中使用的基本思想和方法。
图像拼接涉及的关键概念和技术包括:
- 关键点检测:识别图像中的独特特征。
- 描述符:用数字描述符表示关键点以进行匹配。
- 特征匹配:查找图像间关键点之间的对应关系。
- 单应性:描述图像之间几何关系的变换矩阵。
- RANSAC:一种稳健估计单应性矩阵的算法。
- 图像扭曲:根据估计的单应性变换图像。
- 混合:平滑地合并图像以创建无缝合成图。
为了成功进行图像拼接,理解这些思想和方法至关重要。我们将在接下来的章节中深入研究每个阶段,并提供真实示例和 OpenCV 代码示例。您可以使用此流程和适当的程序制作引人注目的全景照片并掌握图像拼接的技巧。
特征检测和提取
特征提取和检测是图像拼接流程中的第一个也是最重要的阶段。此阶段需要在每幅图像中定位不同的关键点并计算它们的描述。描述符给出了这些关键点的数值表示,以便在多张照片之间进行匹配,而关键点则反映了图像中独特的特征或兴趣点。我们可以使用 OpenCV 的几种特征检测技术(包括 SIFT、SURF 和 ORB)从图像中提取关键点和描述符。
特征检测
- 特征识别算法的目标是在图像中定位有趣且可识别的焦点区域。
- 这些关键点可以代表具有大量纹理差异、角落或边缘的位置。
- 为了检测特征,经常使用诸如 SIFT(尺度不变特征变换)、SURF(加速稳健特征)和 ORB(定向 FAST 和旋转 BRIEF)之类的算法。
- 这些算法考虑了关键点的比例和方向,使其能够抵抗比例和旋转的变化。
特征提取
- 使用已识别的关键点描述符计算每个关键点周围的局部图片数据。
- 关键点周围的补丁以数字形式表示为描述符,这些描述符对其外观或纹理进行编码。
- 描述符包括邻域纹理、颜色和梯度特征的详细信息。
- SIFT、SURF 和 ORB 算法中还包括特征描述符提取技术。
让我们练习使用 SIFT 进行特征检测和提取。
import cv2# Load the images
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')# Initialize the SIFT feature detector and extractor
sift = cv2.SIFT_create()# Detect keypoints and compute descriptors for both images
keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)# Draw keypoints on the images
image1_keypoints = cv2.drawKeypoints(image1, keypoints1, None)
image2_keypoints = cv2.drawKeypoints(image2, keypoints2, None)# Display the images with keypoints
cv2.imshow('Image 1 with Keypoints', image1_keypoints)
cv2.imshow('Image 2 with Keypoints', image2_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
此代码片段首先加载图像 image1 和 image2。然后,使用 cv2.SIFT_create() 初始化 SIFT 特征检测器和提取器。
接下来,我们使用 SIFT 对象的 detectAndCompute 方法计算两张图片的描述符以识别关键点。描述符保存在 descriptors1 和 descriptors2 变量中,而关键点保存在 keypoints1 和 keypoints2 变量中。
drawKeypoints 函数用于在图像上绘制关键点以便查看它们。变量 image1_keypoints 和 image2_keypoints 包含最终图像的关键点。
这段代码演示了 SIFT 算法的特征检测和提取过程。只需将“筛选”对象替换为适当的检测器和提取器对象(例如,将 cv2.SURF_create() 替换为 SURF 或将 cv2.ORB_create() 替换为 ORB)并相应地修改代码,您就可以尝试其他特征检测技术,例如 SURF 或 ORB。
为了获得最佳结果,请记住尝试几种算法并根据您的独特用例修改其参数。
特征匹配
图像拼接中的一个关键阶段是特征匹配,它在各种图像中的关键点之间建立对应关系。为了确保图像的准确对齐和配准,它试图根据其描述符识别匹配的关键点。OpenCV 提供了许多特征匹配方法,包括基于 FLANN(近似最近邻快速库)的匹配和强力匹配,每种方法都具有独特的属性和优势。
强力匹配
- 特征匹配的一种简单直接的方法是强力匹配。
- 将一个图像中的每个描述符与第二个图像中的每个描述符进行比较。
- 计算描述符之间的距离或相似度(如欧几里得距离或余弦相似度)是匹配过程的一个步骤。
- OpenCV BFMatcher 类允许使用强力匹配。
- 尽管它很简单,但计算成本可能很高,尤其是对于大型特征集。
FLANN(近似最近邻快速库)匹配
- FLANN 匹配是一种实用的最近邻搜索算法,可用于有效特征匹配。
- 为了加快搜索速度,它采用基于树的索引结构,如 KD 树或随机树。
- 特别是对于大型特征集,FLANN 比强力匹配更快。
- 它提供了选择搜索算法和配置搜索条件的选项。
- OpenCV 中的 FlannBasedMatcher 类可用于进行 FLANN 匹配。
此代码片段演示了如何在 OpenCV 中使用强力匹配和 FLANN 匹配算法执行特征匹配
import cv2# Load the images
image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)# Initialize the feature detector and extractor (e.g., SIFT)
sift = cv2.SIFT_create()# Detect keypoints and compute descriptors for both images
keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)# Initialize the feature matcher using brute-force matching
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)# Match the descriptors using brute-force matching
matches_bf = bf.match(descriptors1, descriptors2)# Sort the matches by distance (lower is better)
matches_bf = sorted(matches_bf, key=lambda x: x.distance)# Draw the top N matches
num_matches = 50
image_matches_bf = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches_bf[:num_matches], None)# Initialize the feature matcher using FLANN matching
index_params = dict(algorithm=0, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)# Match the descriptors using FLANN matching
matches_flann = flann.match(descriptors1, descriptors2)# Sort the matches by distance (lower is better)
matches_flann = sorted(matches_flann, key=lambda x: x.distance)# Draw the top N matches
image_matches_flann = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches_flann[:num_matches], None)# Display the images with matches
cv2.imshow('Brute-Force Matching', image_matches_bf)
cv2.imshow('FLANN Matching', image_matches_flann)
cv2.waitKey(0)
cv2.destroyAllWindows()
从 L2 范数和 crossCheck=True 开始进行特征匹配,我们使用 cv2.BFMatcher() 初始化强力匹配器。然后使用 match() 函数查找两个图像描述之间的相似性。根据距离排列匹配项。
与此类似,我们使用 cv2.FlannBasedMatcher() 设置 FLANN 匹配器的索引设置和搜索参数。使用 FLANN 算法,我们调用 match() 方法来查找描述符之间的匹配项。再次根据距离排列匹配项。
我们使用 drawMatches() 函数在图像上绘制匹配项以可视化匹配项。为清晰起见,我们仅显示前 N 个匹配项(由 num_matches 确定)。
单应性估计
在将多张照片拼接在一起的过程中,单应性估计的基本步骤对于对齐和整合图像至关重要。为了将相似的点从一张图像转移到另一张图像,使用单应性矩阵来表示两个图像平面之间的变换。借助从特征匹配中获得的匹配关键点,OpenCV 提供了估计单应性矩阵的技术。
了解单应性及其在图像拼接中的作用
- 单应性描绘了两幅图像之间的平面映射,是一个 3x3 变换矩阵。
- 它显示了两幅图像对应点像素坐标之间的对应关系。
- 使用单应性可以进行包括平移、旋转、缩放和透视扭曲在内的几何变化。
- 单应性是图像拼接中使用的一种技术,用于将图像对齐并转换为单个坐标系。
使用匹配的关键点估计单应性矩阵
- OpenCV 中的 findHomography() 函数可用于计算单应性矩阵。
- 估计的单应性矩阵由 findHomography() 方法返回,该方法接受匹配的关键点作为输入。
- RANSAC(随机样本共识)是一种可靠的估计程序,用于处理异常值并提供准确的单应性矩阵。
- RANSAC 通过迭代选择匹配的关键点子集来估计单应性矩阵。在评估适合预测模型的内点数量后,选择具有最多内点的最佳单应性矩阵。
以下是使用匹配的关键点演示单应性估计的代码片段:
import cv2
import numpy as np# Load the images
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')# Convert the images to grayscale
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# Initialize the feature detector and extractor (e.g., SIFT)
sift = cv2.SIFT_create()# Detect keypoints and compute descriptors for both images
keypoints1, descriptors1 = sift.detectAndCompute(gray1, None)
keypoints2, descriptors2 = sift.detectAndCompute(gray2, None)# Initialize the feature matcher using brute-force matching
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)# Match the descriptors using brute-force matching
matches = bf.match(descriptors1, descriptors2)# Extract the matched keypoints
src_points = np.float32([keypoints1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
dst_points = np.float32([keypoints2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)# Estimate the homography matrix using RANSAC
homography, mask = cv2.findHomography(src_points, dst_points, cv2.RANSAC, 5.0)# Print the estimated homography matrix
print("Estimated Homography Matrix:")
print(homography)
扭曲和混合
以下步骤需要根据单应性扭曲图像,并在上一步估算单应性矩阵后将它们组合起来以生成无缝合成图像。通过此过程,拼接的照片将正确对齐,并且它们之间可以无缝过渡。
使用估计的单应性扭曲图像
- 估算单应性矩阵后,我们可以使用它来将一个图像的坐标系转换为另一个图像的坐标系。
- OpenCV 中的 cv2.warpPerspective() 函数允许您通过应用单应性变换来扭曲图像。
- 估计的单应性矩阵、输出图片的大小和输入图像都是该函数的输入参数。
- 输出图像的大小将与参考图像(或目标图像)的大小相匹配。
混合扭曲的图像以创建无缝合成
- 要生成平滑的合成图像,我们必须将扭曲的图像混合在一起。
- 简单的图片连接可能会在图像中产生明显的接缝或不和谐的变化。
- 可以使用多种混合方法来产生更平滑的混合效果,包括 alpha 混合、羽化和多波段混合。
- 为了实现无缝逼真的效果,这些策略尝试逐步转换图像之间的像素强度。
- 要拼接的照片的个性化需求和质量决定了要使用的最佳混合技术。
以下是使用估计的单应性对图像进行扭曲和混合的代码片段:
import cv2
import numpy as np# Load the images
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')# Convert images to grayscale
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# Initialize the feature detector and extractor (e.g., SIFT)
sift = cv2.SIFT_create()# Detect keypoints and compute descriptors for both images
keypoints1, descriptors1 = sift.detectAndCompute(gray1, None)
keypoints2, descriptors2 = sift.detectAndCompute(gray2, None)# Initialize the feature matcher using brute-force matching
bf = cv2.BFMatcher()# Match the descriptors using brute-force matching
matches = bf.match(descriptors1, descriptors2)# Select the top N matches
num_matches = 50
matches = sorted(matches, key=lambda x: x.distance)[:num_matches]# Extract matching keypoints
src_points = np.float32([keypoints1[match.queryIdx].pt for match in matches]).reshape(-1, 1, 2)
dst_points = np.float32([keypoints2[match.trainIdx].pt for match in matches]).reshape(-1, 1, 2)# Estimate the homography matrix
homography, _ = cv2.findHomography(src_points, dst_points, cv2.RANSAC, 5.0)# Warp the first image using the homography
result = cv2.warpPerspective(image1, homography, (image2.shape[1], image2.shape[0]))# Blending the warped image with the second image using alpha blending
alpha = 0.5 # blending factor
blended_image = cv2.addWeighted(result, alpha, image2, 1 - alpha, 0)# Display the blended image
cv2.imshow('Blended Image', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论
在本教程中,我们探索了使用 OpenCV 进行图像拼接的过程。以下是所涉及步骤的摘要:
- 图像加载:加载要组合的单个图像。
- 特征提取和匹配:要查找关键点并生成描述符,请使用特征检测和提取方法(例如 SIFT 或 SURF)。要发现不同照片中关键点之间的对应关系,请使用特征匹配。
- 单应性估计:使用匹配的关键点,估计单应性矩阵。图像之间的几何变换由单应性矩阵表示。
- 扭曲和混合:要将一张图像与另一张图像对齐,请使用近似的单应性对其进行扭曲。要生成平滑的合成图像,请将扭曲的图像与第二张图像混合。
在整个教程中,我们介绍了图像拼接中涉及的关键概念和技术,包括特征匹配、单应性估计和图像扭曲。我们还提供了代码片段来说明使用 OpenCV 的实现。
进一步探索和潜在改进:
- 为了检验各种特征提取和检测技术对图像拼接的有效性,请进行实验。
- 为了获得更可靠的单应性估计,请研究 RANSAC(随机样本一致性)等尖端技术。
- 为了在照片之间实现更无缝的过渡,请考虑使用混合技术,如多波段混合和基于梯度的混合。
- 利用复杂的算法和技术,处理图像拼接困难,如视差、透视失真和遮挡。
- 为了提高特征匹配的准确性,请研究自动图片对齐方法,如尺度不变特征变换 (SIFT) 或稳健匹配算法。
虚拟现实、图片马赛克和全景摄影只是图像拼接的一些令人兴奋的用途。您可以通过额外的研究和开发来提高拼接图像的精度和质量,从而提供无缝和身临其境的视觉体验。
请随意尝试并探索使用 OpenCV 和其他相关库进行图像拼接的广泛可能性。祝您拼接愉快!
关于作者:
我是 Paulson Premsingh,新加坡国立大学人工智能研究生。我对视觉系统、3D 传感、机器人和移动性有着强烈的热情。我专注于这些领域,渴望探索人工智能和计算机视觉的交集,为机器人感知、物体识别和自主导航开发创新解决方案。我很高兴成为人工智能社区的一员,并为这些迷人领域的进步做出贡献。
相关文章:
Image Stitching using OpenCV
文章目录 简介图像拼接管道特征检测和提取特征检测特征提取 特征匹配强力匹配FLANN(近似最近邻快速库)匹配 单应性估计扭曲和混合结论 使用opencv进行图像拼接 原为url: https://medium.com/paulsonpremsingh7/image-stitching-using-opencv-a-step-by-s…...
如何将CSDN的文章保存为PDF?
目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车(Enter)如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…...
设计模式之工厂模式:从汽车工厂到代码工厂
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客,你不需要知道汽车是如何被制造出来的,你只需要告诉销售顾问&a…...
在 Ubuntu 20.04 上离线安装和配置 Redis
下面是从零开始配置 Redis 的完整步骤,包括从安装 Redis 到离线安装 Redis 包的步骤。本文将覆盖如何从下载 Redis 安装包、手动安装 Redis、创建所需目录、配置 Redis、以及如何配置 Redis 为系统服务,确保服务可以在启动时自动运行。 步骤 1: 准备环境…...
Redis的哨兵机制
目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵(基于docker)3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...
服务器数据恢复—热备盘上线过程中硬盘离线导致raid5阵列崩溃的数据恢复案例
服务器数据恢复环境: 两组分别由4块SAS接口硬盘组建的raid5阵列,两组raid5阵列划分LUN并由LVM管理,格式化为EXT3文件系统。 服务器故障: RAID5阵列中一块硬盘未知原因离线,热备盘自动激活上线替换离线硬盘。在热备盘上…...
Android12 设置无home属性的apk为launcher
目标apk的包类名 QSSI.12/device/qcom/qssi/system.prop// add start target_app_package_name=com.mangechargespot.app target_app_class_name=com.mangechargespot.app.ui.activity.SplashActivity // add end...
STM32F407+LAN8720A +LWIP +FreeRTOS ping通
使用STM32CUBEIDE自带的 LWIP和FreeROTS 版本说明STM32CUBEIDE 操作如下1. 配置RCC/SYS2. 配置ETH/USART3. 配置EHT_RESET/LED4. 配置FreeRTOS5. 配置LWIP6. 配置时钟7. 生成单独的源文件和头文件,并生成代码8. printf重定义9. ethernetif.c添加lan8720a复位10. MY_LWIP_Init …...
构建虚幻引擎中的HUD与UI
在游戏开发中,用户界面(UI)和头部显示(HUD)是玩家体验的重要组成部分。它们提供了关键信息,并增强了游戏的互动性。虚幻引擎(Unreal Engine, UE)以其强大的可视化脚本系统Blueprint和C++ API支持,为开发者提供了一个灵活且功能丰富的环境来创建复杂的UI和HUD元素。 本…...
EXCEL数据清洗的几个功能总结备忘
目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值: 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析,中国,李宗璋用EXCEL学统计学,日EXCEL统计分析与决策&#x…...
【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
深入源码解析:Spring Boot 如何加载 Servlet 、Filter 与 Listener
我们知道,Spring Boot 是在 Spring MVC 的基础上进行了封装,以简化开发者的工作量。尽管如此,Spring Boot 的底层架构依然离不开 Spring MVC 的核心组件,如 Servlet、Filter、Listener,以及RequestMappingHandlerMappi…...
Vue 让视图区域滑到指定位置、回到顶部
滑倒指定位置:获取指定的dom,然后用scrollIntoView使dom出现在视图区域 回到顶部:操作父级dom的scrollTop 0,让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...
C# 属性(Property)
C# 属性(Property) C# 中的属性(Property)是一种用于访问和设置类或结构成员的值的特殊类型的方法。属性允许开发者以字段的形式访问方法,提供了更为安全和灵活的数据封装。在本文中,我们将深入探讨 C# 属性的概念、用途、以及如何有效地使用它们。 属性的定义 属性由…...
Ubuntu20.04调整swap分区大小笔记
Ubuntu20.04调整swap分区大小笔记 参考:https://blog.csdn.net/sunyuhua_keyboard/article/details/142485764 第一步 禁用swap $ cat /etc/fstab # /etc/fstab: static file system information. # # Use blkid to print the universally unique identifier fo…...
【 JAVA中常见的集合操作】
JAVA中常见的集合操作 Java 提供了丰富的集合框架(Java Collections Framework),包括多种集合接口和实现类。集合操作可以分为基本操作和高级操作。下面介绍一些常见的集合操作,并给出相应的代码示例。 基本集合操作 创建集合 …...
Kudu 源码编译-aarch架构 1.17.1版本
跟着官方文档编译 第一个问题:在make阶段时会报的问题: kudu/src/kudu/util/block_bloom_filter.cc:210:3: error: ‘vst1q_u32_x2’ was not declared in this scope kudu/src/kudu/util/block_bloom_filter.cc:436:5: error: ‘vst1q_u8_x2’ was no…...
JavaEE多线程案例之阻塞队列
上文我们了解了多线程案例中的单例模式,此文我们来探讨多线程案例之阻塞队列吧 1. 阻塞队列是什么? 阻塞队列是⼀种特殊的队列.也遵守"先进先出"的原则. 阻塞队列是⼀种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续⼊队列就会…...
Java Web 开发学习中:过滤器与 Ajax 异步请求
一、过滤器 Filter: 过滤器的概念与用途 在一个庞大的 Web 应用中,有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫,站在资源的入口处,根据预先设定的规则,决定哪些请求可以顺利访问资源&…...
git SSL certificate problem: unable to get local issuer certificate
Git 客户端将会验证服务器端提供的SSL证书是否由受信任的证书颁发机构(Certification Authority,CA)签发。如果Git客户端无法找到或验证本地签发者证书,就会出现 unable to get local issuer certificate 或类似的错误。 该问题一…...
Vue.js 响应接口
Vue.js 响应接口 Vue.js,作为一个流行的前端JavaScript框架,以其响应式数据绑定和组件化开发而闻名。响应式系统是Vue.js的核心特性之一,它允许开发者创建高度动态和交互式的用户界面。本文将深入探讨Vue.js的响应接口,包括其工作原理、使用方法和最佳实践。 响应式原理 …...
vue2-代理打包问题;CORS针对AJAX 请求,而不适用于资源请求
打包后请求被转发出现问题(如返回 405 Method Not Allowed),通常是由以下原因导致的: 1. 代理配置未生效 原因分析 在开发环境中,Vue CLI 的 devServer.proxy 仅在本地开发服务器(npm run serveÿ…...
websocket 服务 pinia 全局配置
websocket 方法类 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 实例callbacks: ((message: string) > void)[]; // 消息回调函数列表connected: boolean; // 连接状态…...
YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53
系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传系列(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 背景 随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚&#x…...
可视化建模与UML《部署图实验报告》
一、实验目的: 1、熟悉部署图的基本功能和使用方法。 2、掌握使用建模工具软件绘制部署图的方法 二、实验环境: window11 EA15 三、实验内容: 根据以下的描述,绘制部署图。 网上选课系统在服务器端使用了两台主机,一…...
详解RabbitMQ在Ubuntu上的安装
目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…...
SQL 快速参考
SQL 快速参考 引言 SQL(Structured Query Language)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。它被广泛用于数据查询、数据更新、数据库维护以及访问控制。本快速参考指南旨在提供SQL的基本概念和常用命令的概览…...
数据结构--树和二叉树
树和二叉树的定义 树的定义 树是一种非线性的数据结构,它模拟了具有层次关系的数据的集合。在树结构中,存在以下基本概念: 节点(Node):树的每个元素被称为节点。根节点(Root Node)…...
R语言的数据结构-向量
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中,数据结构是非常关键的部分,它提…...
MetaGPT源码 (ContextMixin 类)
目录 理解 ContextMixin什么是 ContextMixin?主要组件实现细节 测试 ContextMixin示例:ModelX1. 配置优先级2. 多继承3. 多继承重写4. 配置优先级 在本文中,我们将探索 ContextMixin 类,它在多重继承场景中的集成及其在 Python 配…...
linux中top命令详解
top 命令是 Linux 系统中常用的实时系统监控工具,它可以显示系统的实时进程和资源占用情况。以下是 top 命令的一些基本用法和参数详解: 基本用法 • top:运行 top 命令,显示系统实时监控信息。 • top -h:显示帮助信…...
Scrapy与MongoDB
Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件,都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候,就需要使用数据库来保存数据了。 MongoDB由于其出色的性能,已经成为爬虫的首…...
【Linux-ubuntu通过USB传输程序点亮LED灯】
Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二,程序编译三,USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号,用于决定时钟信号是否能够有效的传递或者被使用,就像一个…...
onlyoffice 容器配置修改后制作镜像导出以及上传到 dockerhub
1.将容器制作成新的镜像 docker commit -p -a "xxx" -m "zh-cn-20-100" onlyoffice ooffice:7.1.1.23docker commit: 这是 Docker 中用于创建新镜像的命令。 -p: 这个选项用于在提交之前暂停容器的运行。这可以确保数据的完整性,因为容器在提交…...
开发者如何使用GCC提升开发效率 Windows下Cmake + NDK 交叉编译 Libyuv
最近在导入其他项目的libyuv库,编译时发现如下问题,刚好想做一期libyuv编译与安装到AS中的文章,故记录集成的全过程 报错如下 error: no member named ABGRToNV21 in namespace libyuv; did you mean ARGBToNV21? error: no member named …...
前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码
技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址: git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…...
华为HCIP H12-821考试中心原题题库更新完成 展示如下
全题库506题,后期有更新会及时更新维护,确保答案正确率和原题覆盖率。 附上最新通过成绩单一张 今天新鲜出炉 ...
SQL Server:只有MDF文件,如何附加数据库
第一步:先新建一个同名数据库,然后停止sql服务,删除新建数据库.ldf文件。 第二步:将要附加的数据库的.mdf文件覆盖刚新建的.mdf文件,并重启sql服务。 第三步:这时数据库DATA目录下只有一个.mdf文件…...
nginx反向代理(负载均衡)和tomcat介绍
nginx的代理 负载均衡 负载均衡的算法 负载均衡的架构 基于ip的七层代理 upstream模块要写在http模块中 七层代理的调用要写在location模块中 轮询 加权轮询 最小连接数 ip_Hash URL_HASH 基于域名的七层代理 配置主机 给其余客户机配置域名 给所有机器做域名映射 四层代理…...
【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】
目录 前端文件操作与文件上传前端接受后端传输文件指南前端excel、word操作指南 excelword 前端文件操作与文件上传 一、前端文件上传有两种思路: 二进制blob传输:典型案例是formData传输,相当于用formData搭载二进制的blob传给后端base…...
Android IO 性能优化:全面解析与实践
文章目录 前言1、文件系统与 I/O 流程原理1.1 文件系统架构1.2 文件 I/O 流程 2、优化策略与场景适用2.1 异步 I/O2.2 合并文件操作2.3 页缓存优化2.4 内存映射文件 3. 性能监控与验证总结 前言 在现代 Android 应用中,I/O 性能直接影响用户体验。流畅的响应速度和…...
利用Docker分层构建优化镜像大小
合适docker镜像文件大小不仅影响容器启动效率,也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像,采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…...
【代码pycharm】动手学深度学习v2-09 Softmax 回归 + 损失函数 + 图片分类数据集
课程链接 1.读取图像分类数据集 import matplotlib.pyplot as plt import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l d2l.use_svg_display() #读取数据集 transtransforms.ToTensor() mnist_…...
docker开启远程访问
1、编辑docker.server文件 vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2…...
Maven插件打包发布远程Docker镜像
dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟,它集成了Maven和Docker,该插件的官方文档地址如下: 地址:https://github.com/spotify/dockerfile-maven 其他说明: dockerfile是用…...
基于STM32的太阳跟踪系统设计
目录 引言系统设计 硬件设计软件设计系统功能模块 太阳位置检测模块伺服驱动控制模块反馈调整模块电源管理模块控制算法 太阳位置估算算法跟踪调整算法代码实现 太阳位置检测与估算伺服电机控制系统反馈与调整系统调试与优化结论与展望 1. 引言 太阳能是一种清洁、可再生的能…...
004-Redis 持久化
Redis 持久化 一、RDB 持久化1.优点:2.缺点:3.实现方式: 二、AOF 持久化1.优点:2.缺点:3.实现方式:4.重写机制5.重写流程: Redis 提供了两种主要的持久化方式:RDB 和 AOF 一、RDB 持…...
类OCSP靶场-Kioptrix系列-Kioptrix Level 1
一、前情提要 Kioptrix Level是免费靶场,可以自己百度下载。 开始前要先将靶机设置和kali同一个网络模式,我这里设置的是NAT。 接下来的靶机用kali进行演示。 二、打靶演示 这个靶机练习,相当于内网渗透。 1. 信息收集 1.1. 主机发现 …...
短视频矩阵系统功能介绍与独立部署流程
一、短视频矩阵系统功能介绍 短视频矩阵系统,作为当前短视频运营的重要工具,凭借其强大的功能,为内容创作者和企业提供了高效、便捷的短视频管理与运营方案。以下是对该系统核心功能的详细介绍: 多平台账号管理ÿ…...
【AI知识】人工智能、机器学习、深度学习的概念与联系
下图来自博客 机器学习和深度学习概念入门 ,图中可明显看到人工智能、机器学习、深度学习三个概念的包含关系,下面简单介绍一下这三个概念已经它们之间的联系。 1. 人工智能(Artificial Intelligence,AI) 概念&#x…...