OpenCv高阶(4.0)——案例:海报的透视变换
文章目录
- 前言
- 一、工具函数模块
- 1.1 图像显示函数
- 1.2 保持宽高比的缩放函数
- 1.3 坐标点排序函数
- 二、透视变换核心模块
- 2.1 四点透视变换实现
- 三、主流程技术分解
- 3.1 图像预处理
- 3.2 轮廓检测流程
- 3.3 最大轮廓处理
- 四、后处理技术
- 4.1 透视变换
- 4.2 形态学处理
- 五、完整代码
- 总结
前言
构建智能文档视觉矫正体系:通过 AI 图像识别技术自动分析文档倾斜特征,结合自适应透视校正模型动态调整校正参数,不仅消除物理歪斜(如扫描歪斜、拍摄俯仰角偏差),还能修复因纸张褶皱、扫描设备误差导致的 “隐性扭曲”,最终呈现视觉上完全平整、几何上严格对齐的标准文档版面,为专业打印奠定基础。
一、工具函数模块
1.1 图像显示函数
def cv_show(name, value):cv2.imshow(name, value) # 创建命名窗口显示图像cv2.waitKey(0) # 等待任意键输入(单位:毫秒,0表示无限等待)cv2.destroyAllWindows() # 关闭所有OpenCV窗口(实际代码中未显式调用,需注意内存释放)
cv2.waitKey(0) 的返回值为按键ASCII码,可用于交互控制
调试建议:添加 cv2.destroyWindow(name) 关闭指定窗口,避免内存泄漏
1.2 保持宽高比的缩放函数
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):dim=None(h, w) = image.shape[:2] # 获取原始高度和宽度(兼容灰度/彩色图)# 尺寸计算逻辑if width is None and height is None:return image # 无缩放直接返回if width is None:r = height / float(h) # 计算高度缩放比例dim = (int(w * r), height) # 新尺寸元组(宽度, 高度)else:r = width / float(w) # 计算宽度缩放比例dim = (width, int(h * r))# 执行缩放操作resized = cv2.resize(image, dim, interpolation=inter)return resized
插值算法选择:
cv2.INTER_AREA:基于像素区域关系重采样,适合缩小图像
cv2.INTER_CUBIC:4x4像素邻域的双三次插值,适合放大图像
cv2.INTER_LINEAR:双线性插值(默认)
1.3 坐标点排序函数
def order_points(pts):rect = np.zeros((4, 2), dtype="float32") # 初始化4x2矩阵#按顺序找到对应的坐标0123,分别是左上右上右下、左下# 计算坐标点x+y的和s = pts.sum(axis=1) # 形状:(4,) ,对矩阵的每一行进行求和操作rect[0] = pts[np.argmin(s)] # 左上角:x+y最小rect[2] = pts[np.argmax(s)] # 右下角:x+y最大# 计算坐标点x-y的差diff = np.diff(pts, axis=1) # 形状:(4,1)rect[1] = pts[np.argmin(diff)] # 右上角:x-y最小(即y相对较大)rect[3] = pts[np.argmax(diff)] # 左下角:x-y最大(即y相对较小)return rect # 返回有序坐标:[左上, 右上, 右下, 左下]
二、透视变换核心模块
2.1 四点透视变换实现
def four_point_transform(image, pts):# 坐标排序(关键步骤!)rect = order_points(pts)(tl, tr, br, bl) = rect # 解构赋值四个顶点# 计算输出图像的宽度(取两组对边最大值)widthA = np.sqrt(((br[0] - bl[0]) ** 2) + (br[1] - bl[1]) ** 2)widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + (tr[1] - tl[1]) ** 2)maxWidth = max(int(widthA), int(widthB))# 计算输出图像的高度(同理)heightA = np.sqrt(((tr[0] - br[0]) ** 2) + (tr[1] - br[1]) ** 2)heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + (tl[1] - bl[1]) ** 2)maxHeight = max(int(heightA), int(heightB))# 定义目标点坐标(规范坐标系)dst = np.array([[0, 0],[maxWidth - 1, 0], # 宽度方向预留1像素边界[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype="float32")# 计算透视变换矩阵(核心数学操作)M = cv2.getPerspectiveTransform(rect, dst)# 执行透视变换warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))return warped
1.尺寸计算
公式推导:基于欧氏距离公式计算对边长度
distance = sqrt((x2-x1)^2 + (y2-y1)^2)取最大值的原因:确保输出图像能完整包含原始四边形区域
2.cv2.getPerspectiveTransform
输入:源四边形(rect)和目标四边形(dst)的4个点输出:3x3透视变换矩阵数学原理:求解投影变换方程
透视变换矩阵公式
通过4对点建立8个方程,求解8个未知参数
3.cv2.warpPerspective
参数 M:3x3变换矩阵参数 (maxWidth, maxHeight):输出图像尺寸插值方式:默认双线性插值(可指定cv2.INTER_LINEAR等)
三、主流程技术分解
3.1 图像预处理
# 读取原始图像
img = cv2.imread('../data/hb.png') # 默认BGR格式# 计算缩放比例(基于原始高度)
ratio = img.shape[0] / 500.0 # 假设将高度缩放到500px
orig = img.copy() # 深拷贝保留原始图像
img = resize(orig, height=500) # 执行缩放
缩放目的:加速后续轮廓处理(复杂度与图像尺寸成平方关系)
ratio的作用:后续将检测到的坐标还原到原始尺寸
3.2 轮廓检测流程
# 灰度化处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #获取灰度图
# 自适应阈值化
edged = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]# 查找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[-2]
img_contours=cv2.drawContours(img.copy(),cnts,-1,(0,0,255),1)
cv_show('img_contours',img_contours)
cv2.findContours参数解析:
edged.copy():避免修改原始边缘图像
cv2.RETR_LIST:检索所有轮廓,不建立层级关系
cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角方向的冗余点
[-2]:兼容不同OpenCV版本(返回格式可能为 [contours, hierarchy] 或 [image, contours, hierarchy])
3.3 最大轮廓处理
# 按轮廓面积排序(降序)
screenCnt = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
#获取面积最大的轮廓
# 计算轮廓周长
peri = cv2.arcLength(screenCnt, True) # True表示轮廓闭合# 多边形近似(Douglas-Peucker算法)
screenCnt = cv2.approxPolyDP(screenCnt, 0.01 * peri, True)
print(screenCnt.shape)
img_contours=cv2.drawContours(img.copy(),[screenCnt],-1,(0,255,0),2)cv_show('img_contours1',img_contours)
1、cv2.contourArea
计算方式:格林公式积分对非闭合轮廓可能返回错误值
2、cv2.approxPolyDP
参数 0.01*peri:近似精度阈值(周长比例)原理:迭代拟合多边形,删除偏离当前线段超过阈值的点效果:将曲线近似为折线,减少顶点数量
四、后处理技术
4.1 透视变换
# 执行变换(注意坐标还原)
warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)# 保存结果
cv2.imwrite('../data/invoice_new.jpg', warped)
screenCnt.reshape(4,2):将轮廓点从 (N,1,2) 转换为 (4,2)
ratio:将缩放后的坐标还原到原始图像尺寸
4.2 形态学处理
# 转换为灰度图
warped_gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)# 二值化处理
_, warped_binary = cv2.threshold(warped_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 逆时针旋转90度,在对自己的文档进行识别时,可以根据需求调整转动角度
warped_rotated = cv2.rotate(warped_binary, cv2.ROTATE_90_COUNTERCLOCKWISE)# 定义形态学核
kernel = np.ones((11,11),np.uint8)
#做一个闭运算,先膨胀再腐蚀
warped_rotated_closed=cv2.morphologyEx(warped_rotated,cv2.MORPH_CLOSE,kernel)
cv2.namedWindow('warped_rotated_closed',cv2.WINDOW_NORMAL)
cv_show("warped_rotated_closed",warped_rotated)
腐蚀(Erode):用核的最小值替换锚点像素,消除小物体
膨胀(Dilate):用核的最大值替换锚点像素,填充空洞
开运算 = 先腐蚀后膨胀,用于去噪
核大小选择:3x3平衡去噪效果与细节保留
目的是为了使海报上的图案和文字显示的更清晰,字迹不会很模糊。
最终效果展示:
将歪歪扭扭的图片扶正,并将图片上的文字变得更清晰,上边的效果仍没有达到预计的效果,可以通过图像形态学的处理来达到更好的效果。
五、完整代码
import numpy as np
import cv2
def cv_show(name,value):cv2.imshow(name,value)cv2.waitKey(0)def resize(image,width=None,height=None,inter=cv2.INTER_AREA):dim=None(h,w)=image.shape[:2]if width is None and height is None:return imageif width is None:r=height/float(h)dim=(int(w*r),height)else:r=width/float(w)dim=(width,int(h*r))resized=cv2.resize(image,dim,interpolation=inter)return resizeddef order_points(pts):#一共四个坐标点rect=np.zeros((4,2),dtype='float32')#按顺序找到对应的坐标0123,分别是左上右上右下、左下s=pts.sum(axis=1) #对矩阵的每一行进行求和操作rect[0]=pts[np.argmin(s)]rect[2]=pts[np.argmax(s)]diff=np.diff(pts,axis=1)rect[1]=pts[np.argmin(diff)]rect[3]=pts[np.argmax(diff)]return rectdef four_point_transform(image,pts):#获取输入的坐标点rect=order_points(pts)(tl,tr,br,bl)=rect#计算输入的w和h值widthA=np.sqrt(((br[0]-bl[0])**2) +( br[1] - bl[1])**2)widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + (tr[1] - tl[1]) ** 2)maxwidth=max(int(widthA),int(widthB))heightA=np.sqrt(((tr[0]-br[0])**2) +( tr[1] - br[1])**2)heightB=np.sqrt(((tl[0]-bl[0])**2) +( tl[1] - bl[1])**2)maxheight=max(int(heightA),int(heightB))dst=np.array([[0,0],[maxwidth,0],[maxwidth,maxheight],[0,maxheight]],dtype='float32')M=cv2.getPerspectiveTransform(rect,dst)warped=cv2.warpPerspective(image,M,(maxwidth,maxheight))return warpedimg=cv2.imread('../data/hb.png')
cv_show('fp',img)# 图片多大调整大小
ratio=img.shape[0]/500.0 #计算缩小比例
orig=img.copy()
img=resize(orig,height=500)
# cv_show('1',img)#轮廓检测
print("STEP 1:轮廓检测")
gray=cv2.cvtColor(img,cv2.COLOR_BGRA2GRAY) #获取灰度图edged=cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cnts=cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[-2]
img_contours=cv2.drawContours(img.copy(),cnts,-1,(0,0,255),1)
cv_show('img_contours',img_contours)print("STEP 2:获取最大轮廓")
screenCnt=sorted(cnts,key=cv2.contourArea,reverse=True)[0] #获取面积最大的轮廓peri=cv2.arcLength(screenCnt,True)screenCnt=cv2.approxPolyDP(screenCnt,0.01*peri,True)
print(screenCnt.shape)
img_contours=cv2.drawContours(img.copy(),[screenCnt],-1,(0,255,0),2)cv_show('img_contours1',img_contours)# 透视变换
warped=four_point_transform(orig,screenCnt.reshape(4,2)*ratio)
cv2.imwrite('../data/invoice_new.jpg',warped)
cv2.namedWindow('xx',cv2.WINDOW_NORMAL) #设置这个参数可以使imshow()显示出来的窗口被拉大缩小
cv2.imshow('xx',warped)
cv2.waitKey(0)warped_gray=cv2.cvtColor(warped,cv2.COLOR_BGR2GRAY)
warped_binary=cv2.threshold(warped_gray.copy(),0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv2.namedWindow('warped_binary',cv2.WINDOW_NORMAL)
cv_show("warped_binary",warped_binary)warped_rotated=cv2.rotate(warped_binary,cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.namedWindow('warped_rotated',cv2.WINDOW_NORMAL)
cv_show("warped_rotated",warped_rotated)#做一个闭运算,先膨胀再腐蚀
kernel = np.ones((3,3),np.uint8)
warped_rotated_closed=cv2.morphologyEx(warped_rotated,cv2.MORPH_OPEN,kernel)
cv2.namedWindow('warped_rotated_closed',cv2.WINDOW_NORMAL)
cv_show("warped_rotated_closed",warped_rotated)
总结
通过对计算机视觉技术的综合使用,可以实现很多种对文档的处理任务,还可以将将功能与摄像头结合实现实时处理任务。
相关文章:
OpenCv高阶(4.0)——案例:海报的透视变换
文章目录 前言一、工具函数模块1.1 图像显示函数1.2 保持宽高比的缩放函数1.3 坐标点排序函数 二、透视变换核心模块2.1 四点透视变换实现 三、主流程技术分解3.1 图像预处理3.2 轮廓检测流程3.3 最大轮廓处理 四、后处理技术4.1 透视变换4.2 形态学处理 五、完整代码总结 前言…...
JavaScriptWeb API (DOM和BOM操作)
Web API (基础部分) 作用: 使用 JS 去操作 html 和浏览器 分类: DOM 和 BOM DOM: 操作 HTML 文档的 APIBOM: 操作浏览器的 API DOM(文档对象模型) 是用来呈现以及与任意 HTML 或 XML 文档进行交互的 API 作用: 开发网页内容特效和实现用户交互 动态创建 HTML 元素改变 HTML…...
AM-Thinking-v1论文解读:以32B规模推进推理前沿
《AM-Thinking-v1: Advancing the Frontier of Reasoning at 32B Scale》论文解读 一、引言 过去半年,大型语言模型(LLMs)在推理领域(如数学问题求解和代码生成)取得了显著进展,扩大了其在现实场景中的应…...
Spark--RDD中的转换算子
1、算子的简单介绍 Transformation(转换)算子:根据数据集创建一个新的数据集,计算后返回一个新RDD,例如一个rdd进行map操作后生了一个新的rdd。 Action(动作)算子:对rdd结果计算后返回一个数值value给驱动程序(driver),例如collect算子将数据集的所有元素收集完成返回给驱动程…...
【文件上传漏洞】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文件上传漏洞 定义客户端js检测 服务器检测后缀黑名单白名单 检测内容其他 定义 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服…...
electron进程通信
electron进程通信 模式 1:渲染器进程到主进程(单向) send和on 1.渲染器进程调用方法 click setTitle2.预加载进程暴露setTile方法 setTitle: (title) > ipcRenderer.send(set-title, title),3.主进程监听到方法 ipcMain.on(set-title…...
[C++面试] lambda面试点
一、入门 1、什么是 C lambda 表达式?它的基本语法是什么? Lambda 是 C11 引入的匿名函数对象,用于创建轻量级的可调用对象。 [捕获列表] (参数列表) mutable(可选) 异常声明(可选) -> 返回…...
【愚公系列】《Manus极简入门》040-科技与组织升级顾问:“项目掌舵人”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
2505C++,py和go调用雅兰亭库的协程工具
原文 神算调用C 一般调用pybind11封装的C库实现神算调用C库,pybind11封装c的接口很简单. 创建一个py_example.cpp文件 #include <pybind11/pybind11.h> #include <string> namespace py pybind11; PYBIND11_MODULE(py_example, m) {m.def("hello", …...
题解:P12207 [蓝桥杯 2023 国 Python B] 划分
链接 题目描述 给定 40 个数,请将其任意划分成两组,每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数,划分的权值最大为多少。 5160 9191 6410 4657 7492 1531 8854 1253 4520 9231126…...
英迈国际Ingram Micro EDI需求分析
Ingram Micro(英迈国际)成立于1979年,是全球领先的技术和供应链服务提供商,总部位于美国加州尔湾。公司致力于连接全球的技术制造商与渠道合作伙伴,业务涵盖IT分销、云服务、物流和供应链优化等多个领域。Ingram Micro…...
【Linux】网络基础与socket编程基础
一.网络发展 计算机的出现是在网络之前的。而网络产生之初就是为了解决局部计算机无法交互的问题。所以,网络在诞生之初,最先出现的就是我们的局域网LAN,用来结局局部多台计算机的通信问题。 而随着时间的推移,局域网已经不能满…...
漂亮的收款打赏要饭网HTML页面源码
这是一款专为个人收款及接受打赏设计的HTML页面,其设计简洁且美观。 下载地址:漂亮的收款打赏要饭网HTML页面源码 备用地址:漂亮的收款打赏要饭网HTML页面源码...
【图书推荐】几本人工智能实用性图书
《OpenCV计算机视觉开发实践:基于Python》 《OpenCV计算机视觉开发实践:基于Python》【摘要 书评 试读】- 京东图书 《PyTorch深度学习与计算机视觉实践》 《PyTorch深度学习与计算机视觉实践(人工智能技术丛书)》(王晓华)【摘要 书评 试读…...
uniapp+vite+cli模板引入tailwindcss
目前vitecli方式用的都是官方提供的模板,vite版本还是4.14版本,较旧,而tailwindcss已经有了4版本,实际发现引入最新版会报错,因而继续使用3.3.5版本 pnpm install tailwindcss3.3.5 uni-helper/vite-plugin-uni-tail…...
【使用 C# 获取 USB 设备信息及进行通信】
文章目录 使用 C\# 获取 USB 设备信息及进行通信为什么需要获取 USB 设备信息?方法一:使用 C\# 库 (推荐)1. HidSharp2. LibUsbDotNet 方法二:直接调用 Windows API (P/Invoke)理解设备通信协议 (用于数据交换)总结 使用 C# 获取 USB 设备信息…...
Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)
引言 大家好!近期,我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始,逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果…...
四维时空数据安全传输新框架:压缩感知与几何驱动跳频
四维时空数据安全传输新框架:压缩感知与几何驱动跳频 1. 引言 1.1 研究背景 随着三维感知技术(如激光雷达、超宽带定位)与动态数据流(如无人机集群、工业物联网)的快速发展,四维时空数据(三维…...
CSS相关知识补充
:root伪类 css自定义变量和var()引用自定义变量 https://developer.mozilla.org/zh-CN/docs/Web/CSS/var 在 SCSS 中,变量的声明和使用是用 $ 符号,比如: $primary-color: #ff5722;.button {color: $primary-color; }SCSS 里没有 var() 这…...
DeepSeek 赋能物联网:从连接到智能的跨越之路
目录 一、引言:物联网新时代的开启二、DeepSeek 技术揭秘2.1 DeepSeek 是什么2.2 DeepSeek 技术优势 三、DeepSeek 与物联网的融合之基3.1 物联网发展现状与挑战3.2 DeepSeek 带来的变革性突破 四、DeepSeek 在物联网的多元应用场景4.1 智慧电力:开启能源…...
谷歌量子计算机:开启计算新纪元
量子计算的黎明 原始尺寸更换图片 在科技迅猛发展的时代,量子计算作为前沿领域,正逐渐崭露头角,吸引着全球无数科研人员与科技巨头的目光。它宛如一把开启未来科技大门的钥匙,为解决诸多复杂难题提供了前所未有的可…...
桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题
目录 环境 现象 原理及解决办法 环境 PC:windows11 安卓:Android14 例程使用的是HID Keyboard,板子使用的是91870CQ的开发板,DB870CC1A 现象 连接安卓手机时并不会出现该现象,两个开发板都可以当做键盘给手机发按…...
AMC8 -- 2009年真题解析(中文解析)
Problem 1 Answer: E 中文解析: Bridget最后有4个,给了Cassie3个, 则给Cassie之前有7个。在此之前给了一半的苹果给Ann, 那么在给Anna之前,他有7*214个苹果。 因此答案是E。 Problem 2 Answer: D 中文解析࿱…...
深入解析CountDownLatch的设计原理与实现机制
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、概述 CountDownLatch是Java并发包(java.util.concurrent)中用于协调多线程同步的核心工具类,其设计目标是允许一个或…...
缓存的相关内容
缓存是一种介于数据永久存储介质与数据应用之间数据临时的存储介质 实用化保存可以有效地减少低俗数据读取的次数 (例如磁盘IO), 提高系统性能 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间 spring boot中提供了缓存技术, 方便…...
JVM方法区核心技术解析:从方法区到执行引擎
方法区 方法区的内部结构 在经典方法区设计中,主要存储以下核心数据内容: 一、类型信息 方法区维护的类型信息包含以下要素: 类全称标识 类名称(含完整包路径)直接父类的完全限定名(包含完整包路径&am…...
AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端
2025年,AI领域迎来了一项重要的技术进展——MCP(Model Context Protocol,模型上下文协议)的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生,为AI开发者提供了一站式的MCP服务器和客户端整合…...
Python训练打卡Day22
复习日: 1.标准化数据(聚类前通常需要标准化) scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() :这部分代码调用了 StandardScaler 类的构造函数。在Python中,当你在类名后面加上括号…...
【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计
本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读,我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部,欢迎大家在评论区友好互动。 在上篇…...
【数据结构入门训练DAY-35】棋盘问题
本次训练聚焦于使用深度优先搜索(DFS)算法解决棋盘上的棋子摆放问题。题目要求在一个可能不规则的nn棋盘上摆放k个棋子,且任意两个棋子不能位于同一行或同一列。输入包括棋盘大小n和棋子数k,以及棋盘的形状(用#表示可放…...
张 提示词优化(相似计算模式)深度学习中的损失函数优化技巧
失函数的解释 损失函数代码解析 loss = -F.log_softmax(logits[...
Elasticsearch 常用语法手册
🧰 Elasticsearch 常用语法手册 📚 目录 索引操作文档操作查询操作聚合查询健康与状态查看常见问题与注意事项 🔹 索引操作 查询全部索引 GET _search创建索引 PUT /es_db创建索引并设置分片数和副本数 PUT /es_db {"settings&quo…...
华宇TAS应用中间件与亿信华辰多款软件产品完成兼容互认证
近日,华宇TAS应用中间件与亿信华辰多款产品成功通过兼容互认证测试,双方产品在功能协同、性能优化及高可用性等维度实现全面适配,将为用户提供更加稳定、高效、安全的国产化解决方案。 此次认证也标志着华宇在国产化生态适配领域再添重要里程…...
AI大模型从0到1记录学习numpy pandas day24
第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址:https://www.anaconda.com/ 简单来说,Anaconda Python 包和环境管理器(Conda) 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...
开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 一、开篇:AI芯片架构演变的三重挑战 (引述TPUv4采用RISC-V的行业案…...
VirtualiSurg使用SenseGlove触觉手套开发XR手术培训体验
虚拟现实和虚拟现实触觉 作为一个领先的培训平台,VirtualiSurg自2017年以来一直利用扩展现实(XR)和触觉技术,为全球医疗保健行业提供个性化的数据驱动学习解决方案。它们使医疗专业人员能够协作学习和培训,提高他们的技能,让他们…...
AbstractErrorController简介-笔记
1. AbstractErrorController简介 org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController 是 Spring Boot 提供的一个用于处理 HTTP 错误(如 404、500 等)的抽象类,用于自定义错误响应的逻辑。它是 Spring Boot…...
next.js实现项目搭建
一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目: 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...
使用GoLang版MySQLDiff对比表结构
概述 下载地址: https://github.com/camry/mysqldiff/ 编译安装 git clone https://github.com/camry/mysqldiff.git go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPRIVATE*.corp.example.com go build .\mysqldiff.go执行对比 ./mysqldiff --sourc…...
git工具使用详细教程-------命令行和图形化工具
下载 git下载地址:https://git-scm.com/downloads TortoiseGit(图形化工具)下载地址:https://tortoisegit.org/download/ 认识git结构 工作区:存放代码的地方 暂存区:临时存储,将工作区的代码…...
失控的产品
大部分程序员很难有机会做一个新的产品,绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会,从2023年开始做,中间经历了许多磕磕碰碰。 有的小伙伴从中离开,偶尔又加入1~2个人,但…...
区块链blog1__合作与信任
🍂我们的世界 🌿不是孤立的,而是网络化的 如果是单独孤立的系统,无需共识,而我们的社会是网络结构,即结点间不是孤立的 🌿网络化的原因 而目前并未发现这样的理想孤立系统,即现实中…...
ES常识9:如何实现同义词映射(搜索)
在 Elasticsearch(ES)中实现同义词映射(如“美丽”和“漂亮”),核心是通过 同义词过滤器(Synonym Token Filter) 在分词阶段将同义词扩展或替换为统一词项,从而让搜索时输入任意一个…...
aws 实践创建policy + Role
今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:...
兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力
在B端产品市场,独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计,通过融合多元风格,为企业点亮品牌魅力,助力品牌价值提升。 兰亭妙微主创团队源自清华,历经多年沉淀,积累了丰富的设计经验。…...
高项-逻辑数据模型
逻辑数据模型的核心理解 1. 定义与特点 逻辑数据模型(Logical Data Model, LDM): 是一种抽象的数据结构设计,用于描述业务实体(如客户、订单)及其关系(如“客户下单”),…...
Aquatone安装与使用
前言:aquatone工具获取网页截图,在资产收集的时候,对于网站可以起到快速浏览 michenriksen/aquatone: A Tool for Domain Flyovershttps://github.com/michenriksen/aquatone 任务一 安装chromium sudo apt install chromiumchromium -h 任务二 下载aquatone Relea…...
解读RTOS 第八篇 · 内核源码解读:以 FreeRTOS 为例
1. 引言 FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版…...
6、登录功能后端开发
6、登录功能后端开发 https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html 1、新建用户表SQL脚本 -- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表 drop table if exi…...
「彻底卸载 Quay 容器仓库」:干净移除服务、镜像与配置的全流程指南
文章目录 🧹 第一步:停止并禁用 systemd 服务🚮 第二步:移除 Podman 容器与相关资源1. 删除 quay-app 容器2. 删除镜像(如果你想彻底清理)3. 删除挂载卷(比如 SQLite 存储) …...