opencv图像处理技术(形态学操作)
形态学(Morphology)是数学中研究形状、结构和变换的分支,而在图像处理中,形态学主要用于描述和分析图像中的形状和结构。形态学操作通常涉及基本的集合运算,如腐蚀、膨胀、开运算、闭运算等,以及与结构元素(structuring element)的结合使用。
以下是形态学中一些重要的定义和知识点:
1. 结构元素(Structuring Element):
结构元素是形态学操作的基本组成部分,它定义了形态学操作的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操作中,结构元素在图像上滑动并与图像进行匹配,用来确定操作的范围。
2. 腐蚀(Erosion):
腐蚀操作可以使图像中的边缘“腐蚀”掉,使其变得更加平滑。腐蚀操作的基本思想是使用结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。
3. 膨胀(Dilation):
膨胀操作与腐蚀相反,它可以增加图像中对象的大小并填充对象之间的空隙。膨胀操作也使用结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足条件。如果结构元素与任何一个像素相交,则中心像素值被膨胀为1。
4. 开运算(Opening)与闭运算(Closing):
开运算是先进行腐蚀再进行膨胀的操作,可以用来消除小型噪声、分离接触对象等;闭运算是先进行膨胀再进行腐蚀的操作,可以用来填充物体间的空隙、连接断裂的物体等。
5. 形态学梯度(Morphological Gradient):
形态学梯度是膨胀图像与腐蚀图像的差异,用来确定图像中物体的边缘。
6. 顶帽运算(Top Hat)与底帽运算(Black Hat):
顶帽运算是原始图像与开运算之间的差异,用来提取比原始图像更亮的区域;底帽运算是闭运算与原始图像之间的差异,用来提取比原始图像更暗的区域。
形态学操作在图像处理中有着广泛的应用,对于图像分割、特征提取、物体检测等任务都具有重要作用。
知识点1 腐蚀与膨胀
1腐蚀操作
腐蚀操作可以将图像中的边缘“腐蚀”掉,使其变得更加平滑。它的原理是使用一个称为结构元素(Structuring Element)的小型矩阵,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件(通常是“与”操作)。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。这一过程可以用来消除小型噪声、分离接触对象、以及缩小物体等。
在 OpenCV 中,腐蚀操作的函数是 cv2.erode()
。下面是它的语法格式和含义:
代码:
dst = cv2.erode(src, kernel, iterations = 1, anchor = (-1, -1), borderType = cv2.BORDER_CONSTANT, borderValue = 0)
-
src
:表示输入图像,即待腐蚀的图像,应为灰度图像或者单通道二值图像。 -
kernel
:表示结构元素,即定义腐蚀操作的形状和大小的矩阵。通常是一个正方形或矩形的小矩阵。你可以使用np.ones()
函数来创建一个全为1的矩阵作为结构元素。例如,kernel = np.ones((5,5), np.uint8)
创建了一个5x5的全为1的矩阵作为结构元素。 -
iterations
:表示腐蚀操作的迭代次数,即在图像上应用腐蚀操作的次数。默认为1。 -
anchor
:表示结构元素的锚点位置,默认为(-1, -1),即结构元素的中心点。你也可以设置为其他值,通常情况下保持默认值即可。 -
borderType
:表示边界处理方式,默认为cv2.BORDER_CONSTANT
,即在边界外的像素值使用常数填充,常数值由borderValue
参数指定。 -
borderValue
:当borderType
设置为cv2.BORDER_CONSTANT
时,表示边界外像素的值,默认为0。
这个函数会返回一个腐蚀后的图像 dst
。
腐蚀操作的基本思想是,对于给定的结构元素,在图像上滑动并检查像素与结构元素的对应位置是否满足某种条件。如果像素值全部满足条件,则中心像素值保持不变,否则被腐蚀为0。
具体实现:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png")# 创建一个5x5的全为1的矩阵作为结构元素
kernel = np.ones((5,5), np.uint8)# 对图像进行腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)# 显示原始图像和腐蚀后的图像
cv2.imshow('img', img)
cv2.imshow('Erosion', erosion)# 等待用户按下任意键,并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如图:
2膨胀操作
- 膨胀操作(Dilation):
膨胀操作是图像形态学处理中的一种基本操作,通常用于增加或扩展图像中的白色区域(前景对象)。它的原理是在图像上滑动一个结构元素(通常是一个小的矩形或圆形内核),将内核下方的像素值替换为内核下方区域内的最大像素值。因此,它会使图像中的白色区域变得更大。膨胀操作常用于填充图像中的空洞、连接相邻的对象以及消除图像中的噪声。
在OpenCV中,膨胀操作可以通过cv2.dilate()
函数实现。该函数需要传入待处理的图像、结构元素(通常是一个矩形或圆形内核)以及迭代次数作为参数。迭代次数表示膨胀操作的次数,通常设置为1即可。
代码:
dilation = cv2.dilate(img, kernel, iterations=1)
img
是待处理的图像,即输入图像。kernel
是结构元素,用于定义膨胀操作的形状和大小iterations
表示膨胀操作的迭代次数,即要对图像应用膨胀操作的次数
具体实现:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png")# 创建一个5x5的全为1的矩阵作为结构元素
kernel = np.ones((5,5), np.uint8)# 对图像进行膨胀操作
dilation = cv2.dilate(img, kernel, iterations=1)# 显示原始图像和膨胀后的图像
cv2.imshow('Original Image', img) # 显示原始图像窗口,窗口标题为"Original Image"
cv2.imshow('Dilation', dilation) # 显示膨胀后的图像窗口,窗口标题为"Dilation"# 等待用户按下任意键,并关闭窗口
cv2.waitKey(0) # 等待用户按下任意键
cv2.destroyAllWindows() # 关闭所有窗口
结果如图:
知识点2通用形态学函数
在OpenCV中,常用的通用形态学函数是cv2.morphologyEx()
函数。该函数可以接受不同的形态学操作类型作为参数,并且可以自定义结构元素。
result = cv2.morphologyEx(img, op, kernel)
img
是待处理的图像,即输入图像。op
是形态学操作的类型,可以是如下之一:cv2.MORPH_ERODE
:腐蚀操作。cv2.MORPH_DILATE
:膨胀操作。cv2.MORPH_OPEN
:开运算,先进行腐蚀操作再进行膨胀操作。cv2.MORPH_CLOSE
:闭运算,先进行膨胀操作再进行腐蚀操作。- 其他形态学操作类型,如梯度运算、顶帽运算等。
-
-
顶帽运算:
top_hat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
这里,
cv2.MORPH_TOPHAT
表示顶帽运算的操作类型,kernel
是定义操作的结构元素。通过该行代码,将对输入图像img
进行顶帽运算,并将结果保存在top_hat
中。 -
黑帽运算:
black_hat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
在这行代码中,
cv2.MORPH_BLACKHAT
表示黑帽运算的操作类型,kernel
是结构元素。执行该行代码将对输入图像img
进行黑帽运算,并将结果保存在black_hat
中。 -
梯度运算:
-
内梯度:
internal_gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
这里,
cv2.MORPH_GRADIENT
表示梯度运算的操作类型,对于内梯度,该函数将执行图像的膨胀操作,然后从原始图像中减去膨胀后的结果。结果将保存在internal_gradient
中。 -
外梯度:
external_gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
-
-
kernel
是结构元素,用于定义形态学操作的形状和大小。
具体实现:
1cv2.MORPH_OPEN
:进行开运算
代码:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 执行开运算操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 显示原始图像
cv2.imshow('img', img)# 显示开运算后的图像
cv2.imshow('opening', opening)# 等待用户按下任意键退出
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()
结果如图:
2 cv2.MORPH_CLOSE
:闭运算
具体实现:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 执行闭运算操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 显示原始图像
cv2.imshow('img', img)# 显示闭运算后的图像
cv2.imshow('closing', closing)# 等待用户按下任意键退出
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()
结果如图:
3 cv2.MORPH_GRADIENT进行形态学梯度运算
代码:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2.png")# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 执行梯度运算操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 显示原始图像
cv2.imshow('img', img)# 显示梯度运算后的图像
cv2.imshow('gradient', gradient)# 等待用户按下任意键退出
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()
结果如图:
4 cv2.MORPH_BLACKHAT进行黑帽操作
代码:
import cv2
import numpy as np# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai5/cv2z.png", 0)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 执行黑帽运算操作
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 显示原始图像
cv2.imshow('img', img)# 显示黑帽运算后的图像
cv2.imshow('blackhat', blackhat)# 等待用户按下任意键退出
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()
结果如图:
5 cv2.MORPH_TOPHAT 进行顶帽操作
代码:
import cv2
import numpy as np
img=cv2.imread("C:/Users/computer/opencv/sucai5/cv2z.png",0)
kernel=np.ones((5,5),np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('img',img)
cv2.imshow('tophat',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如图:
知识点3:形态学结构元
形态学结构元素是形态学图像处理中的一个重要概念。它是一个二值图像,通常是一个小的二值图像,用于定义形态学操作的形状和大小。
在形态学操作中,结构元素被用来改变图像的形状、大小、或提取图像中的特定特征。常见的形态学操作包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算等。
结构元素通常是一个矩形或圆形的二值图像,由一组相邻的像素点组成。在执行形态学操作时,结构元素在图像上滑动,并与图像中的像素进行匹配,根据匹配的规则来改变像素的值或者提取特征。
结构元素的大小和形状对形态学操作的效果具有重要影响。通常情况下,较小的结构元素会导致较细的特征被保留或强调,而较大的结构元素则会使特征更加模糊或平滑。
在 OpenCV 中,结构元素通常通过 cv2.getStructuringElement()
函数创建,其语法格式如下:
element = cv2.getStructuringElement(shape, ksize[, anchor])
其中:
shape
表示结构元素的形状,可以是cv2.MORPH_RECT
(矩形)、cv2.MORPH_CROSS
(十字形)或cv2.MORPH_ELLIPSE
(椭圆形)之一。ksize
表示结构元素的大小,通常是一个元组,指定了结构元素的高度和宽度。anchor
是可选参数,表示锚点的位置,默认值为 (-1, -1),即结构元素的中心点
常见的结构元类型主要包括以下几种:
-
矩形结构元素 (
cv2.MORPH_RECT
):矩形结构元素是最常用的类型之一。它可以用来执行基本的形态学操作,如腐蚀和膨胀。矩形结构元素的大小由指定的高度和宽度决定,可以用来模拟图像中的线性特征。 -
十字形结构元素 (
cv2.MORPH_CROSS
):十字形结构元素通常用于梯度运算。它类似于矩形结构元素,但在中间有一条十字交叉的空隙,使得该结构元素在边缘检测和特定区域提取方面更具有效性。 -
椭圆形结构元素 (
cv2.MORPH_ELLIPSE
):椭圆形结构元素适用于某些特定形状的目标提取或者对图像进行平滑操作。椭圆形结构元素相对于矩形结构元素更加圆滑,可以更好地适应某些曲线和形状。
具体实现:生成不同形状的结构元
代码:
import cv2# 创建矩形结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 创建一个 5x5 的矩形结构元素
# 创建十字形结构元素
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 创建一个 5x5 的十字形结构元素
# 创建椭圆形结构元素
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 创建一个 5x5 的椭圆形结构元素
# kernel3=cv2.getStructuringElement(cv2.MORPH_ELLTPSE,(5,5)) # 如果拼写错误,会报错# 输出结构元素
print("kernel1=\n", kernel1) # 输出矩形结构元素
print("kernel2=\n", kernel2) # 输出十字形结构元素
print("kernel3=\n", kernel3) # 输出椭圆形结构元素
结果如图:
不同形状的结构体元形态学运算对比
代码:
import cv2# 读取图像
src = cv2.imread("C:/Users/win11/opencv/sucai5/cv2.png")# 创建矩形结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (55, 55)) # 创建一个 55x55 的矩形结构元素
# 创建十字形结构元素
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (55, 55)) # 创建一个 55x55 的十字形结构元素# 使用形态学膨胀操作
dst1 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel1) # 使用矩形结构元素进行膨胀操作
dst2 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel2) # 使用十字形结构元素进行膨胀操作
dst3 = cv2.morphologyEx(src, cv2.MORPH_DILATE, kernel2) # 使用十字形结构元素进行膨胀操作(此处可能应为 kernel3)# 显示图像
cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3) # 此处可能应修改窗口标题为 '十字形结构元素膨胀'# 等待键盘输入,并释放窗口资源
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如图:
相关文章:

opencv图像处理技术(形态学操作)
形态学(Morphology)是数学中研究形状、结构和变换的分支,而在图像处理中,形态学主要用于描述和分析图像中的形状和结构。形态学操作通常涉及基本的集合运算,如腐蚀、膨胀、开运算、闭运算等,以及与结构元素…...
如何构建数据指标体系
构建一套科学、完备且实用的数据分析指标体系是一项系统性的工程,其核心在于将业务理解、目标设定、度量标准选择、数据采集与整理、数据分析、指标体系构建、持续优化与改进等多个环节有机融合,以实现对业务状况的精准刻画、趋势预测及决策支持。以下是…...

python统计分析——一般线性回归模型
参考资料:python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候,我们可以用线性回归的方法。 例如,当我们寻找给定数据集的最佳拟合线的时候,我们是在寻找让下式的残差平方和最小的参数(k,d): 其…...

【cocos creator】【TS】贝塞尔曲线,地图之间显示曲线
参考: https://blog.csdn.net/Ctrls_/article/details/108731313 https://blog.csdn.net/qq_28299311/article/details/104009804 const { ccclass, property } cc._decorator;ccclass export default class creatPoint extends cc.Component {property(cc.Node)bu…...
COMFYUI换脸ReActor报错Value not in list: face_restore_model: ‘codeformer.pth‘解决
Value not in list: face_restore_model: codeformer.pth not in [none, GFPGANv1.3.pth] 搜了下没找到答案,最后看github官方的指引: You can download models here: https://huggingface.co/datasets/Gourieff/ReActor/tree/main/models/facerestore…...
深入理解Java中的字段与属性的区别
1、Java中的属性和字段有什么区别? 答:Java中的属性(property),通常可以理解为get和set方法。 而字段(field),通常叫做“类成员”,或 "类成员变量”,有时也叫“域”,理解为“数据成员”&…...

【Locust分布式压力测试】
Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...
富格林:出金异常警惕黑幕陷阱受骗
富格林悉知,在做单出金时落入黑幕陷阱亏损后,需尽快发现和总结错误,用心筹维权谋安全出金盈利方法并追回亏损。因为黄金市场优势众多,众多的投资者进入市场投资,但因为经验不足,在面对黑幕陷阱是获取无法及…...
Docker - Nginx
博文目录 文章目录 说明命令 说明 Docker Hub Nginx 数据卷数据卷印射在容器内的路径nginx.conf/etc/nginxnginx.html/usr/share/nginx/htmlnginx.log/var/log/nginx 容器内的路径说明/etc/nginx/nginx.conf配置文件/etc/nginx/conf.d配置目录/usr/share/nginx/html静态目录/…...

免费搭建幻兽帕鲁服务器(Palworld免费开服教程)
随着互联网技术的不断发展和普及,网络游戏已经成为了人们休闲娱乐的重要方式之一。而在众多网络游戏中,幻兽帕鲁以其独特的游戏设定和玩法,吸引了大量玩家的关注。为了满足广大玩家的需求,本文将介绍如何免费搭建幻兽帕鲁服务器&a…...

作业习题
实验代码: import java.util.Scanner;class chazhao {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入你要的数组");String line sc.nextLine();String[] lineArrline.split(" ");int[…...

解决unbuntu更新到23.10 mantic firefox无法使用的问题
产看历史版本号: 升级到最新版本后查看: roottesthost01:/home/test/Desktop# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 23.10 Release: 23.10 Codename: mantic 打开firefox发现图标找…...
idea常用配置——注释快捷键
1、单行注释:使用 Ctrl / 可以添加或删除当前行的注释。如果你想要给某一行添加注释,只需要将光标放在那一行,然后按下 Ctrl / 即可。如果你想要删除那一行的注释,同样只需要将光标放在那一行,然后再次按下 Ctrl /。…...

Hidl 学习总结 2
1、Android apk 调用Hidl处理 app添加对应的hidl jar包 2、MainActivity 添加如下代码 package com.example.test2;import androidx.appcompat.app.AppCompatActivity; import vendor.hardware.test.V1_0.ITest; import vendor.hardware.test.V1_0.ITestCmdCallback; import …...

深度学习学习日记4.7
1.梯度下降 w 新 w旧 - 学习率梯度 训练的目的就是让 loss 减小 2.前向传播进行预测, 反向传播进行训练(每一个参数通过梯度下降进行更新参数),(1前向传播 2求 loss 3反向传播 4梯度更新) 能够让损失下降的参数,就是更好的参数。 损失…...

五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建
一、行业背景 经文化和旅游部数据中心测算,今年清明节假期3天全国国内旅游出游1.19亿人次,按可比口径较2019年同期增长11.5%;国内游客出游花费539.5亿元,较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…...

自动驾驶中的交通标志识别原理及应用
自动驾驶中的交通标志识别原理及应用 附赠自动驾驶学习资料和量产经验:链接 概述 道路交通标志和标线时引导道路使用者有秩序使用道路,以促进道路行车安全,而在驾驶辅助系统中对交通标志的识别则可以不间断的为整车控制提供相应的帮助。比如…...

数据挖掘入门项目二手交易车价格预测之建模调参
文章目录 目标步骤1. 调整数据类型,减少数据在内存中占用的空间2. 使用线性回归来简单建模3. 五折交叉验证4. 模拟真实业务情况5. 绘制学习率曲线与验证曲线6. 嵌入式特征选择6. 非线性模型7. 模型调参(1) 贪心调参(2)…...

【Java】Java使用Swing实现一个模拟计算器(有源码)
📝个人主页:哈__ 期待您的关注 今天翻了翻之前写的代码,发现自己之前还写了一个计算器,今天把我之前写的代码分享出来。 我记得那会儿刚学不会写,写的乱七八糟,但拿来当期末作业还是不错的哈哈。 直接上…...
MC9S12DJ64微控制器
这份文件是关于Freescale的MC9S12DJ64微控制器的用户指南,包含了关于该设备的详细信息和使用说明。以下是核心内容的整理: 产品信息: 产品信息详细描述如下: 1. **产品名称**:- MC9S12DJ64微控制器单元(MCU)2. **核心…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...