图像后处理记录
图像后处理记录
ocr后处理记录
opencv裁剪
编译命令
cmake -S . -B build-x64 -DBUILD_LIST="core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBS=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_js=OFF -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_PACKAGE=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_OBJC=OFF -DBUILD_KOTLIN_EXTENSIONS=OFF -DINSTALL_CREATE_DISTRIB=OFF -DINSTALL_BIN_EXAMPLES=OFF -DINSTALL_C_EXAMPLES=OFF -DINSTALL_PYTHON_EXAMPLES=OFF -DINSTALL_ANDROID_EXAMPLES=OFF -DINSTALL_TESTS=OFF -DWITH_1394=OFF -DWITH_AVFOUNDATION=OFF -DWITH_AVIF=OFF -DWITH_CAP_IOS=OFF -DWITH_CAROTENE=OFF -DWITH_KLEIDICV=OFF -DWITH_NDSRVP=OFF -DWITH_HAL_RVV=OFF -DWITH_FASTCV=OFF -DWITH_CPUFEATURES=OFF -DWITH_VTK=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_CUBLAS=OFF -DWITH_CUDNN=OFF -DWITH_NVCUVID=OFF -DWITH_NVCUVENC=OFF -DWITH_EIGEN=OFF -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_GTK=OFF -DWITH_GTK_2_X=OFF -DWITH_FRAMEBUFFER=OFF -DWITH_FRAMEBUFFER_XVFB=OFF -DWITH_WAYLAND=OFF -DWITH_IPP=OFF -DWITH_HALIDE=OFF -DWITH_VULKAN=OFF -DWITH_OPENVINO=OFF -DWITH_WEBNN=OFF -DWITH_JASPER=OFF -DWITH_OPENJPEG=OFF -DWITH_JPEG=ON -DWITH_JPEGXL=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DWITH_OPENGL=OFF -DWITH_OPENVX=OFF -DWITH_OPENNI=OFF -DWITH_OPENNI2=OFF -DWITH_PNG=ON -DWITH_SPNG=OFF -DWITH_GDCM=OFF -DWITH_PVAPI=OFF -DWITH_ARAVIS=OFF -DWITH_QT=OFF -DWITH_WIN32UI=ON -DWITH_TBB=OFF -DWITH_HPX=OFF -DWITH_OPENMP=OFF -DWITH_PTHREADS_PF=OFF -DWITH_TIFF=ON -DWITH_V4L=OFF -DWITH_DSHOW=OFF -DWITH_MSMF=OFF -DWITH_MSMF_DXVA=OFF -DWITH_XIMEA=OFF -DWITH_UEYE=OFF -DWITH_XINE=OFF -DWITH_CLP=OFF -DWITH_OPENCL=OFF -DWITH_OPENCL_SVM=OFF -DWITH_OPENCLAMDFFT=OFF -DWITH_OPENCLAMDBLAS=OFF -DWITH_DIRECTX=OFF -DWITH_DIRECTML=OFF -DWITH_OPENCL_D3D11_NV=OFF -DWITH_LIBREALSENSE=OFF -DWITH_VA=OFF -DWITH_VA_INTEL=OFF -DWITH_MFX=OFF -DWITH_GDAL=OFF -DWITH_GPHOTO2=OFF -DWITH_LAPACK=OFF -DWITH_ITT=OFF -DWITH_PROTOBUF=OFF -DWITH_IMGCODEC_GIF=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_PFM=OFF -DWITH_QUIRC=OFF -DWITH_ANDROID_MEDIANDK=OFF -DWITH_ANDROID_NATIVE_CAMERA=OFF -DWITH_ONNX=OFF -DWITH_TIMVX=OFF -DWITH_OBSENSOR=OFF -DWITH_CANN=OFF -DWITH_FLATBUFFERS=OFF -DWITH_ZLIB_NG=OFF -DBUILD_ZLIB=ON -DBUILD_TIFF=ON -DBUILD_JPEG=ON -DBUILD_PNG=ON -DBUILD_WITH_STATIC_CRT=ON
64位
cmake -S . -B build-x64 -G "Visual Studio 17 2022" -A x64 -D CMAKE_INSTALL_PREFIX="D:/3rd/installed" -DBUILD_LIST="core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBS=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_js=OFF -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_PACKAGE=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_OBJC=OFF -DBUILD_KOTLIN_EXTENSIONS=OFF -DINSTALL_CREATE_DISTRIB=OFF -DINSTALL_BIN_EXAMPLES=OFF -DINSTALL_C_EXAMPLES=OFF -DINSTALL_PYTHON_EXAMPLES=OFF -DINSTALL_ANDROID_EXAMPLES=OFF -DINSTALL_TESTS=OFF -DWITH_1394=OFF -DWITH_AVFOUNDATION=OFF -DWITH_AVIF=OFF -DWITH_CAP_IOS=OFF -DWITH_CAROTENE=OFF -DWITH_KLEIDICV=OFF -DWITH_NDSRVP=OFF -DWITH_HAL_RVV=OFF -DWITH_FASTCV=OFF -DWITH_CPUFEATURES=OFF -DWITH_VTK=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_CUBLAS=OFF -DWITH_CUDNN=OFF -DWITH_NVCUVID=OFF -DWITH_NVCUVENC=OFF -DWITH_EIGEN=OFF -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_GTK=OFF -DWITH_GTK_2_X=OFF -DWITH_FRAMEBUFFER=OFF -DWITH_FRAMEBUFFER_XVFB=OFF -DWITH_WAYLAND=OFF -DWITH_IPP=OFF -DWITH_HALIDE=OFF -DWITH_VULKAN=OFF -DWITH_OPENVINO=OFF -DWITH_WEBNN=OFF -DWITH_JASPER=OFF -DWITH_OPENJPEG=OFF -DWITH_JPEG=ON -DWITH_JPEGXL=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DWITH_OPENGL=OFF -DWITH_OPENVX=OFF -DWITH_OPENNI=OFF -DWITH_OPENNI2=OFF -DWITH_PNG=ON -DWITH_SPNG=OFF -DWITH_GDCM=OFF -DWITH_PVAPI=OFF -DWITH_ARAVIS=OFF -DWITH_QT=OFF -DWITH_WIN32UI=ON -DWITH_TBB=OFF -DWITH_HPX=OFF -DWITH_OPENMP=OFF -DWITH_PTHREADS_PF=OFF -DWITH_TIFF=ON -DWITH_V4L=OFF -DWITH_DSHOW=OFF -DWITH_MSMF=OFF -DWITH_MSMF_DXVA=OFF -DWITH_XIMEA=OFF -DWITH_UEYE=OFF -DWITH_XINE=OFF -DWITH_CLP=OFF -DWITH_OPENCL=OFF -DWITH_OPENCL_SVM=OFF -DWITH_OPENCLAMDFFT=OFF -DWITH_OPENCLAMDBLAS=OFF -DWITH_DIRECTX=OFF -DWITH_DIRECTML=OFF -DWITH_OPENCL_D3D11_NV=OFF -DWITH_LIBREALSENSE=OFF -DWITH_VA=OFF -DWITH_VA_INTEL=OFF -DWITH_MFX=OFF -DWITH_GDAL=OFF -DWITH_GPHOTO2=OFF -DWITH_LAPACK=OFF -DWITH_ITT=OFF -DWITH_PROTOBUF=OFF -DWITH_IMGCODEC_GIF=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_PFM=OFF -DWITH_QUIRC=OFF -DWITH_ANDROID_MEDIANDK=OFF -DWITH_ANDROID_NATIVE_CAMERA=OFF -DWITH_ONNX=OFF -DWITH_TIMVX=OFF -DWITH_OBSENSOR=OFF -DWITH_CANN=OFF -DWITH_FLATBUFFERS=OFF -DWITH_ZLIB_NG=OFF -DBUILD_ZLIB=ON -DBUILD_TIFF=ON -DBUILD_JPEG=ON -DBUILD_PNG=ON -DBUILD_WITH_STATIC_CRT=ON
32位
cmake -S . -B build-x86 -G "Visual Studio 17 2022" -A Win32 -D CMAKE_INSTALL_PREFIX="D:/path/to/your/opencv_install_x86" -DBUILD_LIST="core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBS=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_js=OFF -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_PACKAGE=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_OBJC=OFF -DBUILD_KOTLIN_EXTENSIONS=OFF -DINSTALL_CREATE_DISTRIB=OFF -DINSTALL_BIN_EXAMPLES=OFF -DINSTALL_C_EXAMPLES=OFF -DINSTALL_PYTHON_EXAMPLES=OFF -DINSTALL_ANDROID_EXAMPLES=OFF -DINSTALL_TESTS=OFF -DWITH_1394=OFF -DWITH_AVFOUNDATION=OFF -DWITH_AVIF=OFF -DWITH_CAP_IOS=OFF -DWITH_CAROTENE=OFF -DWITH_KLEIDICV=OFF -DWITH_NDSRVP=OFF -DWITH_HAL_RVV=OFF -DWITH_FASTCV=OFF -DWITH_CPUFEATURES=OFF -DWITH_VTK=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_CUBLAS=OFF -DWITH_CUDNN=OFF -DWITH_NVCUVID=OFF -DWITH_NVCUVENC=OFF -DWITH_EIGEN=OFF -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_GTK=OFF -DWITH_GTK_2_X=OFF -DWITH_FRAMEBUFFER=OFF -DWITH_FRAMEBUFFER_XVFB=OFF -DWITH_WAYLAND=OFF -DWITH_IPP=OFF -DWITH_HALIDE=OFF -DWITH_VULKAN=OFF -DWITH_OPENVINO=OFF -DWITH_WEBNN=OFF -DWITH_JASPER=OFF -DWITH_OPENJPEG=OFF -DWITH_JPEG=ON -DWITH_JPEGXL=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DWITH_OPENGL=OFF -DWITH_OPENVX=OFF -DWITH_OPENNI=OFF -DWITH_OPENNI2=OFF -DWITH_PNG=ON -DWITH_SPNG=OFF -DWITH_GDCM=OFF -DWITH_PVAPI=OFF -DWITH_ARAVIS=OFF -DWITH_QT=OFF -DWITH_WIN32UI=ON -DWITH_TBB=OFF -DWITH_HPX=OFF -DWITH_OPENMP=OFF -DWITH_PTHREADS_PF=OFF -DWITH_TIFF=ON -DWITH_V4L=OFF -DWITH_DSHOW=OFF -DWITH_MSMF=OFF -DWITH_MSMF_DXVA=OFF -DWITH_XIMEA=OFF -DWITH_UEYE=OFF -DWITH_XINE=OFF -DWITH_CLP=OFF -DWITH_OPENCL=OFF -DWITH_OPENCL_SVM=OFF -DWITH_OPENCLAMDFFT=OFF -DWITH_OPENCLAMDBLAS=OFF -DWITH_DIRECTX=OFF -DWITH_DIRECTML=OFF -DWITH_OPENCL_D3D11_NV=OFF -DWITH_LIBREALSENSE=OFF -DWITH_VA=OFF -DWITH_VA_INTEL=OFF -DWITH_MFX=OFF -DWITH_GDAL=OFF -DWITH_GPHOTO2=OFF -DWITH_LAPACK=OFF -DWITH_ITT=OFF -DWITH_PROTOBUF=OFF -DWITH_IMGCODEC_GIF=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_PFM=OFF -DWITH_QUIRC=OFF -DWITH_ANDROID_MEDIANDK=OFF -DWITH_ANDROID_NATIVE_CAMERA=OFF -DWITH_ONNX=OFF -DWITH_TIMVX=OFF -DWITH_OBSENSOR=OFF -DWITH_CANN=OFF -DWITH_FLATBUFFERS=OFF -DWITH_ZLIB_NG=OFF -DBUILD_ZLIB=ON -DBUILD_TIFF=ON -DBUILD_JPEG=ON -DBUILD_PNG=ON -DBUILD_WITH_STATIC_CRT=ON
编译
cmake --build build-x64 --config Release -j 1cmake --install build-x64 --config Release
核心计算
- 查找轮廓
cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
- 获取最小外接矩形
cv2.minAreaRect(contour)
- 文本框置信度得分计算
- Vatti裁剪算法扩张(Unclip)
- 主要使用了shapely库和clipper库
import onnxruntime
import cv2
import numpy as npprint("onnxruntime版本为:", onnxruntime.__version__)# 读取图片
# image = cv2.imread("chinese.png")
# image = cv2.imread("none.png")
# image = cv2.imread("oneline.png")
image = cv2.imread("zzz.png")
# image = cv2.imread("111.png")
# image = cv2.imread("black.png")# 创建 SessionOptions 对象
sess_options = onnxruntime.SessionOptions()# 设置日志级别,数值越低,日志越详细(0 表示输出所有日志)
sess_options.log_severity_level = 0
sess_options.log_verbosity_level = 2 # 数值可以根据需要调整# 创建 InferenceSession 时传入配置
# det_session = onnxruntime.InferenceSession("./onnx/det-model.onnx", sess_options=sess_options)
# 加载 ONNX 文本检测模型
det_session = onnxruntime.InferenceSession("./onnx/det-model.onnx")# 打印 session 的debug信息
print(det_session.get_modelmeta().description)# shape[0] -> h
# shape[1] -> w
# shape[2] -> c
width, height, channel = image.shape[1], image.shape[0], image.shape[2]
#
print(f'width: {width}, height: {height}, channel: {channel}')#
max_side_len = 960
ratio = 1.0 if max(width, height) < max_side_len else max_side_len / max(width, height)ratio_width = int(width * ratio)
ratio_height = int(height * ratio)divid = 32
target_width = max(int(round(ratio_width / 32) * 32), 32)
target_height = max(int(round(ratio_height / 32) * 32), 32)print(f'target_width: {target_width}, target_height: {target_height}')# show_image = cv2.resize(image, (640, 640))
show_image = cv2.resize(image, (target_width, target_height))
cv2.imshow("Text Mask", show_image)
cv2.waitKey(0)# 预处理
# det_input = cv2.resize(image, (640, 640)) / 255.0 # 归一化
det_input = cv2.resize(image, (target_width, target_height)) / 255.0 # 归一化
# det_input = image / 255.0 # 归一化
det_input = np.transpose(det_input, (2, 0, 1))[np.newaxis, :, :, :].astype(np.float32)print(f'----det_input.shape: {det_input.shape}')# 推理
input_name = det_session.get_inputs()[0].name
output_name = det_session.get_outputs()[0].name
print(f'-----input_name: {input_name}')
print(f'-----output_name: {output_name}')
det_output = det_session.run([output_name], {input_name: det_input})[0]#
#
#
# 获取非零值的索引(文本区域)
# non_zero_indices = np.nonzero(det_output)# print(f'--------------------------')
# print(f'len:{len(non_zero_indices[0])}')
# # 打印非零值的索引及对应的值
# for i in range(len(non_zero_indices[0])):
# print(f'--------------------------')
# coords = tuple(non_zero_indices[j][i] for j in range(len(non_zero_indices)))
# print(f"坐标: {coords}, 值: {det_output[coords]}")# 5. 确保 `det_output` 是 4D (batch, channels, height, width)
print("det_output shape:", det_output.shape)# 6. 获取二值化文本区域
box_thresh = 0.3
text_mask = (det_output[0, 0, :, :] > box_thresh).astype(np.uint8) * 255# 7. 确保 `text_mask` 是单通道 2D 图像
print("text_mask shape:", text_mask.shape) # 应该是 (height, width)# 8. 显示二值化结果(可选)
# cv2.imshow("Text Mask", text_mask)
# cv2.waitKey(0)
# cv2.destroyAllWindows()# 9. 确保 `text_mask` 兼容 OpenCV
if len(text_mask.shape) == 3:text_mask = cv2.cvtColor(text_mask, cv2.COLOR_BGR2GRAY)# 对文本mask进行膨胀操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
text_mask = cv2.dilate(text_mask, kernel, iterations=2)# show again
cv2.imshow("Text Mask", text_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()def get_mini_boxes(contour):# 获取最小外接矩形bounding_box = cv2.minAreaRect(contour)points = cv2.boxPoints(bounding_box)points = np.array(points)# 计算边长side_1 = np.linalg.norm(points[0] - points[1])side_2 = np.linalg.norm(points[1] - points[2])# 返回四个顶点坐标和最小边长return points, min(side_1, side_2)def unclip(box, unclip_ratio=1.5):"""使用Vatti裁剪算法对文本框进行扩张"""from shapely.geometry import Polygonfrom shapely.ops import unary_unionpoly = Polygon(box)# 计算扩张距离distance = poly.area * unclip_ratio / poly.length# 对多边形进行扩张expanded = poly.buffer(distance)# 获取扩张后的坐标if isinstance(expanded, (Polygon)):box = np.array(expanded.exterior.coords).astype('int32')else:box = np.array(unary_union(expanded).exterior.coords).astype('int32')return box# 10. 轮廓检测
contours, _ = cv2.findContours((text_mask * 255).astype(np.uint8), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 11. 处理检测到的文本框
min_size = 3 # 最小尺寸
boxes = []
scores = []# 处理每个轮廓
for contour in contours:# 获取最小外接矩形和最小边长points, side_length = get_mini_boxes(contour)# 过滤掉太小的框if side_length < min_size:continue# 对文本框进行扩张box = unclip(points)if len(box) < 4: # 确保至少有4个点continue# 获取新的最小外接矩形rect = cv2.minAreaRect(box)box = cv2.boxPoints(rect)box = np.int32(box)# 计算框的面积作为得分score = cv2.contourArea(box) / (width * height)# 添加到结果列表boxes.append(box)scores.append(score)# 按得分排序
indices = np.argsort(scores)[::-1]
boxes = [boxes[i] for i in indices]# 保存文本框
for idx, box in enumerate(boxes):# 获取边界框的范围x_min = max(0, np.min(box[:, 0]))y_min = max(0, np.min(box[:, 1]))x_max = min(show_image.shape[1], np.max(box[:, 0]))y_max = min(show_image.shape[0], np.max(box[:, 1]))# 提取文本区域text_roi = show_image[y_min:y_max, x_min:x_max]# 保存为图片output_filename = f'text_box_{idx}.png'cv2.imwrite(output_filename, text_roi)print(f"已保存文本框图片: {output_filename}")# 在原图上绘制文本框# cv2.drawContours(show_image, [box], 0, (0, 255, 0), 2)# 显示标注后的图片
cv2.imshow("Detected Text Boxes", show_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关文章:
图像后处理记录
图像后处理记录 ocr后处理记录 opencv裁剪 编译命令 cmake -S . -B build-x64 -DBUILD_LIST"core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBSOFF -DBUILD_opencv_appsOFF -DBUILD_opencv_jsOFF -DBUILD_ANDROID_PROJECTSOFF -DBUILD_ANDROID_EXAMPLESOFF -…...
解决element中的el-anchor链接被作为路由跳转导致页面404
解决element中的el-anchor链接被作为路由跳转导致页面404 问题: 在使用elementPlus时,el-anchor-link中的href被识别为路由进行跳转,导致不能正常跳转到锚点,且页面显示404。 解决:自定义方法解决 <!--添加hand…...
Mapreduce中maven打包
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序(例如:jar包),并发运行在…...
C++初阶——string的使用(下)
C初阶——string的使用(下) 一、string类对象的容量操作 对于string的容量操作,我们可以通过顺序表来理解,顺序表是通过动态数组来实现的,在数据结构专栏的第一篇就是顺序表的详细讲解,链接如下ÿ…...
AIGC vs 人类创作者:是竞争还是协作?
AIGC vs 人类创作者:是竞争还是协作? 随着人工智能技术的飞速发展,特别是生成式AI(AIGC, AI-Generated Content)的崛起,越来越多的领域开始出现AI的身影。从文本创作、图像生成到音乐制作,AIGC…...
Stable Baselines3 结合 gym 训练 CartPole 倒立摆
视频讲解: Stable Baselines3 结合 gym 训练 CartPole 倒立摆 今天介绍下stable_baselines3和gym,可以方便实现DL的实现,应用在机械臂catch、reach等场景 测试代码仓库:https://github.com/LitchiCheng/DRL-learning.git https:…...
ctfshow web8
前言 学习内容:简单的盲注脚本的书写 web8 这个题目题目手动注入很麻烦 主要是他过滤了 union 空格和 过滤了union的解决方法 1、使用盲注(报错注入和盲注) 2、使用时间盲注 3、堆叠注入 盲注脚本的书写 首先他是有注入点的 然后熟悉requests包的使用 …...
Linux程序地址空间
目录 研究背景 程序地址空间回顾 来段代码感受一下 进程地址空间 Linux2.6内核进程调度队列 一个CPU拥有一个runqueue 优先级 活跃队列(只出不进) 过期队列(只进不出) active指针和expired指针 总结 研究背景 Linux内核版本&#…...
破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
丝滑升级拥抱大模型:详解AI时代的应用智能化升级路径 破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级AI原生时代 ——十年代码无需重写,三步开启智能化跃迁 作者:孤弋、孚阳 序幕:一场跨越 20 年的技术对话 在杭…...
游戏引擎学习第240天:将渲染器移至第三层
这节又枯燥又无聊简直了 回顾并为今天的内容做铺垫 昨天我们说到,想对渲染器和平台层的集成方式做一些修改。我们之前简单讲了一下修改的目的:我们希望游戏本身不再直接调用 OpenGL 的渲染代码,而是只生成一组渲染指令缓冲区,然…...
2025.04.23华为机考第三题-300分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 时空旅行者的最优路径 问题描述 A先生是一名时空旅行者,他可以在不同的时空点之间穿梭。每次从一个时空点跳跃到另一个时空点需要消耗一个时间单位。在每个时空点,都有一些特…...
Kafka 保证多分区的全局顺序性的设计方案和具体实现
Kafka 本身无法直接保证多分区的全局顺序性,因为分区设计旨在并行处理以提升吞吐量。 要实现多分区的顺序性,可尝试通过以下方法在系统层面或业务逻辑上解决: 一、方案设计 单一分区路由(还是将消息发送到同一分区)&a…...
数据结构初阶:二叉树(四)
概述:本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件(tree.h) 1.2 创建二叉树 1.3 前中后序遍历 1.3.1 遍历规则 1.3.1.1 前序遍历代码实现 1.3.1.2 中序遍历代码实现 1.3.1.3 后序遍历代…...
华为开发岗暑期实习笔试(2025年4月16日)
刷题小记: 第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需…...
第一篇:Django简介
第一篇:Django简介 文章目录 第一篇:Django简介一、纯手写一个简易版的web框架1、软件开发架构2、HTTP协议3、简易的socket服务端4、wsgiref模块5、动静态网页6、后端获取当前时间展示到html页面上7、字典数据传给html文件8、数据从数据库中获取的展示到…...
2025年渗透测试面试题总结-拷打题库13(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库13 一、GitHub等三方敏感信息泄漏防御 二、业务逻辑漏洞技术规避 …...
(09)Vue脚手架的使用(Vite、vue-cli、create-vue)
本系列教程目录:Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 Vue脚手架3.1 vite3.3.1 Vite使用1)创建Vite项目2)Vite项目打包 3.1.2 组件化开发3.1.4 Vite工程运行原理1)分析main.js2)自定义根组件 3.2 vue…...
Unity 将Excel表格中的数据导入到Mysql数据表中
1.Mysql数据表users如下: 2.即将导入的Excel表格如下: 3.代码如下: using System; using System.Data; using System.IO; using Excel; using MySql.Data.MySqlClient; using UnityEngine; using UnityEditor;public class ImportExcel {// …...
【QT】信号与槽中多个按钮(pushbutton)共用一个槽函数的两种实现方式
两种方法的对比 方法1:sender() 优点:代码简洁,无需额外参数 缺点:依赖运行时类型转换,安全性较低 适用场景:简单场景,少量按钮 方法2:Lambda (推荐) 优点:安全直观&…...
Python----深度学习(神经网络的过拟合解决方案)
一、正则化 1.1、正则化 正则化是一种用于控制模型复杂度的技术。它通过在损失函数中添加额外的项(正则 化项)来降低模型的复杂度,以防止过拟合。 在机器学习中,模型的目标是在训练数据上获得较好的拟合效果。然而,过…...
【金仓数据库征文】从 HTAP 到 AI 加速,KingbaseES 的未来之路
国产数据库早已实现 “可替代”,但要真正与国际头部厂商掰手腕,必须在 HTAP(Hybrid‑Transaction/Analytical Processing)与 AI 加速 两条技术赛道上实现跨越。KingbaseES 自 V8R3 调整为多进程架构后,历经 V8R6、KSOn…...
创建第一个Spring Boot项目
什么是Spring Boot 随着Spring的快速发展,项目中的XML文件越来越多,繁琐的配置以及,整合第三方框架的配置问题,导致大大增加了开发和部署的效率,使开发者无法专心于业务的开发。Spring Boot就相当于使Spring框架的脚手…...
Java—— 正则表达式 练习
需求: 请编写正则表达式验证用户输入的手机号码是否满足要求。 请编写正则表达式验证用户输入的邮箱号是否满足要求。 请编写正则表达式验证用户输入的电话号码是否满足要求。 验证手机号码 13112345678 13712345667 13945679027 139456790271 验证座机电话号码 02…...
Linux[指令与权限]
Linux指令与权限 Linux环境中,打包文件有多种 tar (打包/解包) 指令 tar -czvf 文件要打包到的位置 文件(打包并压缩到) tar -xzvf 文件(在当前目录下解压) tar选项 -c创建压缩文件 -z使用gzip属性压缩 -v展现压缩过程 -f后面使用新建文档名 -x不要新建,解压 -C 文件…...
MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...
【Redis】集合类型Set 常用命令详解
1. sadd - 添加 语法:sadd key value > sadd testset A 1 > sadd testset B 1 > sadd testset C 1 > sadd testset C # set的值不能重复 0 > smembers set1 # 查询指定set的所有值,乱序 1) "B" 2) "A" 3) "C&qu…...
React 5 种组件提取思路与实践
在开发时,经常遇到一些高度重复但略有差异的 UI 模式,此时我们当然会把组件提取出去,但是组件提取的方式有很多,怎么根据不同场景选取合适的方式呢?尤其时在复杂的业务场景中,组件提取的思路影响着着代码的可维护性、可读性以及扩展性。本文将以一个[详情]组件为例,探讨…...
第十五届蓝桥杯 2024 C/C++组 合法密码
目录 题目: 题目描述: 题目链接: 思路: substr函数: 思路详解: 代码: 代码详解; 题目: 题目描述: 题目链接: P10906 [蓝桥杯 2024 国 B] 合法密码 -…...
云原生时代的双轮驱动
在当今数字化浪潮汹涌澎湃的时代,企业 IT 主管、CIO、CTO 们肩负着引领企业乘风破浪、实现数字化转型的重任。而主数据平台与数据中台,宛如企业数字化征程中的双引擎,为企业发展注入强劲动力。 一、主数据与数据中台:企业数据世界…...
GD32F407单片机开发入门(六)定时器TIMER详解及实战含源码
文章目录 一.概要二.通用定时器内部结构1.时基单元2.时钟源3.输入捕获4.输出比较 三.通用定时器内部特色四.TIME定时器1ms中断例程五.工程源代码下载六.小结 一.概要 定时器就是计数器,应用在我们生活的方方面面,比如有闹钟、计时器等。在GD32F407VET6定…...
时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库
小T导读:胜软科技在石油石化行业中选择使用 TDengine 处理时序数据,不仅显著降低了运维数据库的成本,也大幅减少了存储空间的占用,实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中ÿ…...
【问题解决】本机navicat连接云服务器mysql
一般情况下,当你使用navicat等工具连接云服务器会因为mysql的安全机制,导致无法连接root用户,但是在测试环境中,不考虑安全性的前提条件下,可以通过修改MySQL的配置文件来连接云服务器mysql的root用户。 选择数据库&am…...
STM32F407 的通用定时器与串口配置深度解析
在 STM32F407 芯片的开发过程中,通用定时器和串口的配置与使用是极为关键的技能点。本文将结合提供的代码示例,深入剖析这两个模块的配置流程、工作原理以及实际应用,助力开发者更好地掌握相关技术。 一、通用定时器 (一&#x…...
深入探究Linux项目自动化构建工具:make与Makefile
目录 引言 一、make与Makefile概述 1.1 背景 1.2 理解 二、make工作原理 2.1 查找Makefile 2.2 确定目标文件 2.3 处理文件依赖 三、Makefile实例分析 3.1 简单C程序示例 3.2 项目清理机制 四、结合行缓冲区概念的有趣现象 五、结语 引言 在Linux软件开发的世界里…...
【Hive入门】Hive基础操作与SQL语法:DDL操作全面指南
目录 1 Hive DDL操作概述 2 数据库操作全流程 2.1 创建数据库 2.2 查看数据库 2.3 使用数据库 2.4 修改数据库 2.5 删除数据库 3 表操作全流程 3.1 创建表 3.2 查看表信息 3.3 修改表 3.4 删除表 4 分区与分桶操作 4.1 分区操作流程 4.2 分桶操作 5 最佳实践与…...
STM32F103 “BluePill” 上的 DMA 原理与实践
摘要:本文深入浅出地介绍什么是 DMA(直接存储器访问),它的核心原理、硬件架构,以及在 STM32F103(BluePill)上常见的几种使用场景(ADC、UART、内存拷贝等)。通过对比 CPU 轮询、中断、DMA 三种方式的数据搬运效率,结合寄存器级和 HAL 库示例代码,并附带性能测试与优化…...
软考软件设计师30天备考指南
文章目录 一、考情分析(一)综合知识(二)案例分析 二、30天学习规划(一)第1 - 5天:基础夯实(二)第6 - 10天:核心知识突破(三)第11 - 15…...
比较:AWS VPC peering与 AWS Transit Gateway
简述: VPC 对等连接和 Transit Gateway 用于连接多个 VPC。VPC 对等连接提供全网状架构,而 Transit Gateway 提供中心辐射型架构。Transit Gateway 提供大规模 VPC 连接,并简化了 VPC 间通信管理,相比 VPC 对等连接,支持大量 VPC 的 VPC 间通信管理。 VPC 对等连接 AWS V…...
【AI大模型】MCP:AI应用的“超级扩展坞”
一、什么是MCP MCP(Model Context Protocol,模型上下文协议)是一种新兴的开放协议,于2024年11月由Anthropic公司(Claude的开发者)开源。它的核心目标是建立一个类似USB-C的标准化协议,统一AI模…...
线程封装
目录 makefile Thread.hpp main.cc 以面向对象的方式造轮子 #ifndef _THREAD_HPP__ // 如果没有定义过 _THREAD_HPP__ #define _THREAD_HPP__ // 则定义 _THREAD_HPP__// 这里是头文件的实际内容(类、函数声明等)#endif // 结束条件…...
【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战
在日常开发中,SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作,这篇文章将带你系统了解:这两个框架是如何防止 SQL 注入的,我们又该如何写出安全的代码。 什么是 SQL 注入&#…...
智能穿戴的终极形态会是AR眼镜吗?
清晨的地铁里,戴着普通眼镜的小张正通过镜片查看实时导航路线,眼前的虚拟箭头精准指引换乘方向;手术室里,主刀医生透过镜片看到患者血管的3D投影,如同获得透视眼般精准避开危险区域;装修现场,设…...
ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。本文的操作均在Master主机下进行 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之…...
Hive 多表查询案例
文章目录 前提条件Hive 多表查询案例JOIN案例JOIN查询数据准备1. 内连接(INNER JOIN)2. 左外连接(LEFT OUTER JOIN)3. 右外连接(RIGHT OUTER JOIN)4. 全外连接(FULL OUTER JOIN)5. 多…...
4.23刷题记录(栈与队列专题)
第一部分:基础知识 栈先进后出,队列先进先出栈用stack实现,主要函数有pop,push,top队列由queue或者deque实现,主要函数有front,back,push,pop,emplace&#…...
Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
Jieba 是一个流行的中文分词Python库,它提供了三种分词模式:精确模式、全模式和搜索引擎模式。精确模式尝试将句子最精确地切分,适合文本分析;全模式则扫描文本中所有可能的词语,速度快但存在冗余;搜索引擎…...
Redisson实战:分布式系统中的五大典型应用场景
引言 在分布式系统架构中,数据一致性、高并发控制和资源协调是开发者面临的核心挑战。Redisson作为基于Redis的Java客户端,不仅提供了丰富的分布式对象和服务,还简化了分布式场景下的编程模型。本文将通过实际代码示例,解析Redis…...
webrtc建立连接的过程
WebRTC 连接全过程:从零到视频通话的每一步 WebRTC 是个神奇的技术,让浏览器直接进行点对点(P2P)音视频通话或数据传输,不用每次都靠服务器中转。想知道 Alice 和 Bob 是怎么通过 WebRTC 建立视频通话的吗?…...
system verilog 语句 耗时规则
在 SystemVerilog 中,确实有一类语句是**不消耗仿真时间(zero simulation time)**的,我们一般叫它们: ✅ 零延迟语句(Zero-Time Statements) 🔹1. 什么是“不费时间”的语句? 这些语句在仿真时…...
【Docker】在Ubuntu平台上的安装部署
写在前面 docker作为一种部署项目的辅助工具,真是太好用了需要魔法,不然无法正常运行笔者环境:ubuntu22.04 具体步骤 更新系统包索引 sudo apt update安装必要依赖包 sudo apt install -y apt-transport-https ca-certificates curl softwa…...