当前位置: 首页 > news >正文

相机标定(输出相机内参和畸变参数)

相机标定


这里我用笔记本电脑自带的摄像头进行相机标定
仅作示例,实际工程中要用对应的摄像头进行标定
同时代码也要相应的修改,不过修改的主要是相机的初始化
粗略的说就是打开相机那部分要修改(依据实际情况相应修改)
最终的结果会输出

重投影误差RMS( 越小越好)
相机内参矩阵cameraMatrix
畸变参数distCoeffs.t()

这里用Opencv内置的矩阵转置函数.t() ,将畸变参数从列向量转换为行向量,便于显示,不过它这个只是显示上改变,畸变参数实际存储的还是列向量。
所以下次如果没有用.t( )把它转置,那最后输出的矩阵就会是列向量

#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
#include <iomanip>using namespace cv;
using namespace std;int main() {// ========== 参数配置 ==========const Size boardSize(12, 8);      // 内角点数量(12×8)const float squareSize = 20.0f;   // 每个棋盘格实际尺寸(mm)const int targetSamples = 20;     // 需要采集的样本数const TermCriteria criteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30, 0.001);// ========== 准备工作 ==========// 生成理论角点坐标(世界坐标系)vector<Point3f> objectCorners;for (int i = 0; i < boardSize.height; ++i) {for (int j = 0; j < boardSize.width; ++j) {objectCorners.push_back(Point3f(j * squareSize, i * squareSize, 0));}}vector<vector<Point3f>> objectPoints;vector<vector<Point2f>> imagePoints;// ========== 初始化摄像头 ==========VideoCapture cap(0);if (!cap.isOpened()) {cerr << "ERROR: 无法打开摄像头" << endl;return -1;}// 获取初始帧确定分辨率Mat initFrame;cap >> initFrame;if (initFrame.empty()) {cerr << "ERROR: 无法获取初始帧" << endl;return -1;}Size imageSize = initFrame.size();// ========== 数据采集 ==========cout << "=== 相机标定程序 ===" << endl;cout << "棋盘规格: " << boardSize.width << "x" << boardSize.height << " (每个格子 " << squareSize << "mm)" << endl;cout << "图像分辨率: " << imageSize.width << "x" << imageSize.height << endl;cout << "需要采集 " << targetSamples << " 个有效样本" << endl;cout << "操作说明:\n  空格键 - 保存当前帧\n  ESC键 - 提前结束采集\n";int currentSamples = 0;Mat frame;while (currentSamples < targetSamples) {cap >> frame;if (frame.empty()) {cerr << "WARNING: 获取帧失败" << endl;continue;}Mat gray;cvtColor(frame, gray, COLOR_BGR2GRAY);// 查找棋盘格角点vector<Point2f> corners;bool found = findChessboardCorners(gray, boardSize, corners,CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);if (found) {// 亚像素级精确化cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), criteria);// 可视化结果drawChessboardCorners(frame, boardSize, corners, found);string status = format("采集进度: %d/%d | 按空格保存", currentSamples, targetSamples);putText(frame, status, Point(20, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 255, 0), 2);imshow("Camera Calibration", frame);// 按键处理 按空格键保存当前图像到示例中int key = waitKey(1);if (key == 32) { // 空格键objectPoints.push_back(objectCorners);imagePoints.push_back(corners);currentSamples++;// 保存确认反馈Mat feedback;frame.copyTo(feedback);string msg = format("样本 %d 已保存!", currentSamples);putText(feedback, msg, Point(frame.cols/4, frame.rows/2), FONT_HERSHEY_SIMPLEX, 1.5, Scalar(0, 255, 255), 3);imshow("Camera Calibration", feedback);waitKey(300);} else if (key == 27) { // ESC键break;}} else {string msg = format("未检测到棋盘格 | 需要 %dx%d 内角点", boardSize.width, boardSize.height);putText(frame, msg, Point(20, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2);imshow("Camera Calibration", frame);if (waitKey(1) == 27) break;}}// ========== 相机标定 ==========if (objectPoints.size() >= 5) {Mat cameraMatrix, distCoeffs;vector<Mat> rvecs, tvecs;cout << "\n>>> 开始计算相机参数..." << endl;double rms = calibrateCamera(objectPoints, imagePoints, imageSize,cameraMatrix, distCoeffs, rvecs, tvecs,CALIB_FIX_K4 + CALIB_FIX_K5);// ========== 结果输出 ==========cout << fixed << setprecision(5);cout << "\n=== 标定结果 ===" << endl;cout << "重投影误差(RMS): " << rms << " (值越小越好,建议<0.5)" << endl;cout << "\n相机内参矩阵:\n" << cameraMatrix << endl;cout << "\n畸变系数(k1,k2,p1,p2,k3):\n" << distCoeffs.t() << endl;// ========== 保存结果 ==========FileStorage fs("camera_calibration.yml", FileStorage::WRITE);fs << "calibration_date" << "2024-03-20";fs << "image_width" << imageSize.width;fs << "image_height" << imageSize.height;fs << "board_width" << boardSize.width;fs << "board_height" << boardSize.height;fs << "square_size" << squareSize;fs << "camera_matrix" << cameraMatrix;fs << "distortion_coefficients" << distCoeffs;fs << "reprojection_error" << rms;fs.release();cout << "\n>>> 参数已保存到 camera_calibration.yml" << endl;// ========== 验证结果 ==========cout << "\n>>> 按ESC键退出验证..." << endl;Mat map1, map2;Mat newCameraMatrix = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs,imageSize, 1, imageSize, 0);initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),newCameraMatrix, imageSize,CV_16SC2, map1, map2);while (true) {cap >> frame;if (frame.empty()) break;// 去畸变处理Mat undistorted;remap(frame, undistorted, map1, map2, INTER_LINEAR);// 并排显示对比Mat comparison;hconcat(frame, undistorted, comparison);putText(comparison, "原始图像", Point(20, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2);putText(comparison, "去畸变图像", Point(frame.cols + 20, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 255, 0), 2);imshow("Calibration Results", comparison);if (waitKey(1) == 27) break;}} else {cerr << "ERROR: 有效样本不足 (" << objectPoints.size() << "),至少需要5个" << endl;}// ========== 资源释放 ==========cap.release();destroyAllWindows();cout << "\n>>> 程序正常结束" << endl;return 0;
}

最终代码实现功能


  1. 完整的错误处理

    • 摄像头初始化检查
    • 帧获取失败处理
    • 样本数量验证
      注意:这里样本数量检测的并不是棋盘格的数量,而是指成功检测到棋盘格角点并保存的有效图像帧数
      (你仔细想想,一张图片就直接测出相机的畸变参数,那误差得有多大啊)
  2. 增强的棋盘格检测

    CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK
    

在相机标定代码中,增强的棋盘格检测主要通过OpenCV的findChessboardCorners函数结合特定的标志位(flags)实现。以下是详细解析:


1. 核心代码段

bool found = findChessboardCorners(gray,                  // 输入灰度图像boardSize,             // 棋盘格内角点数量(如12x8)corners,               // 输出的角点坐标CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK    // 增强检测的标志位组合
);

2. 标志位的作用

通过以下三个标志位的组合,显著提升了棋盘格检测的鲁棒性和效率:

(1) CALIB_CB_ADAPTIVE_THRESH
  • 功能
    使用自适应阈值法二值化图像,替代全局阈值。
  • 解决的问题
    光照不均时(如部分阴影或反光),全局阈值可能导致棋盘格部分区域无法检测。
  • 效果
    对每个局部区域独立计算阈值,确保棋盘格线条清晰。
(2) CALIB_CB_NORMALIZE_IMAGE
  • 功能
    在二值化前对图像进行直方图归一化
  • 解决的问题
    低对比度或亮度偏暗/偏亮的图像。
  • 效果
    增强图像对比度,使黑白棋盘格更分明。
(3) CALIB_CB_FAST_CHECK
  • 功能
    启用快速检查模式,先粗略验证棋盘格是否存在。
  • 解决的问题
    避免在无棋盘格的图像上浪费计算资源。
  • 效果
    显著提升检测速度(尤其对视频流实时处理)。

3. 为何需要这些增强?

场景无增强的检测增强后的检测
光照不均可能漏检部分角点自适应阈值保证全图检测
低对比度图像角点检测不稳定归一化后对比度提升
快速视频处理每帧都完整计算,耗时快速检查跳过无棋盘格的帧
棋盘格部分遮挡易失败自适应阈值+归一化提高容错性

总结

  • 核心标志位
    ADAPTIVE_THRESH + NORMALIZE_IMAGE + FAST_CHECK 是应对复杂场景的黄金组合。
  • 适用场景
    光照变化、低对比度、实时视频流、部分遮挡等情况。
  • 性能权衡
    增强检测会略微增加单次计算量,但通过FAST_CHECK和提前终止机制,整体效率更高。
  1. 详细的用户引导

    • 实时显示采集进度
    • 控制台输出标定参数
    • 保存完整的标定结果文件
  2. 直观的结果验证

    • 并排显示原始/去畸变图像
    • 显示重投影误差(RMS)
  3. 规范的变量管理

    • 使用const定义配置参数
    • 合理的作用域控制
    • 图像尺寸单独保存

编译命令

终端g++编译示例(但是不太推荐)

g++ camera_calibration.cpp -o calibration `pkg-config --cflags --libs opencv4` -std=c++11

最好用CMake或者一些其他的编译工具,会更方便一点
这里就不多赘述了

输出文件示例(camera_calibration.yml)

%YAML 1.0
calibration_date: "2024-03-20"
image_width: 640
image_height: 480
board_width: 12
board_height: 8
square_size: 20.0
camera_matrix: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 5.12345678e+02, 0., 3.19500000e+02, 0., 5.12345678e+02, 2.39500000e+02, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrixrows: 5cols: 1dt: ddata: [ -2.123456e-01, 8.765432e-02, 1.234567e-03, -2.345678e-04, 0. ]
reprojection_error: 0.12345

相关文章:

相机标定(输出相机内参和畸变参数)

相机标定 这里我用笔记本电脑自带的摄像头进行相机标定 仅作示例&#xff0c;实际工程中要用对应的摄像头进行标定 同时代码也要相应的修改&#xff0c;不过修改的主要是相机的初始化 粗略的说就是打开相机那部分要修改&#xff08;依据实际情况相应修改&#xff09; 最终的结果…...

Linux-编辑器的使用

实验三 Linux编辑器的使用 一、实验目的 学习使用vi编辑器建立、编辑和保存文本文件。 二、实验内容 1.进入和退出vi。 2.Vi不同工作模式的切换。 3.文本文件基本编辑&#xff08;光标移动、文本输入、复制、移动、删除、查找、替换&#xff09;。 4.文本文件的保存和备份。…...

Android开发中的复制和粘贴

Android 提供了一个强大的基于剪贴板的框架&#xff0c;用于复制和粘贴。它支持简单和复杂的数据类型&#xff0c;包括文本字符串、复杂数据结构、文本和二进制流数据&#xff0c;以及应用资源。简单的文本数据直接存储在剪贴板中&#xff0c;而复杂的数据则存储为引用&#xf…...

使用 inobounce 解决 iOS 皮筋效果导致的无法下拉刷新

使用 inobounce 解决 iOS 皮筋效果导致的无法下拉刷新 在移动端 H5 页面开发中&#xff0c;iOS 设备的“皮筋效果”&#xff08;Rubber Band Effect&#xff09;是一个常见的挑战。当用户在页面顶部下拉或底部上拉时&#xff0c;iOS 会触发整个页面的回弹效果&#xff0c;这不…...

特征选择与类不平衡处理

特征选择与类不平衡处理技术 一、特征选择方法 1. 过滤法&#xff08;Filter Methods&#xff09; 原理&#xff1a; 基于统计学方法或特征本身的分布特性独立于模型进行特征筛选&#xff0c;通过计算特征与目标变量的相关性或特征的发散性进行排序选择。 典型方法&#xf…...

24、ASP.NET⻚⾯之间传递值的⼏种⽅式

1. QueryString&#xff08;查询字符串&#xff09; 描述&#xff1a;通过 URL 参数传递数据&#xff0c;例如 Page2.aspx?id123。 适用场景&#xff1a;简单、非敏感数据&#xff0c;页面跳转时使用。 2. Session&#xff08;会话&#xff09; 描述&#xff1a;在服务器端…...

【扩展卡尔曼滤波器实际运用案例】

扩展卡尔曼滤波器 算法描述实际案例 算法描述 考虑离散时间非线性动态系统 { x k 1 f k ( x k , w k ) z k h k ( x k , v k ) \left\{\begin{matrix} x_{k1}f_{k}(x_k,w_k)\\ z_{k}h_{k}(x_k,v_k) \end{matrix}\right. {xk1​fk​(xk​,wk​)zk​hk​(xk​,vk​)​ 其中是…...

Centos9 安装 nginx 及配置

1. 安装nginx 安装依赖软件&#xff0c;安装之前可以看一下是否已经安装过以下软件&#xff0c;dnf list installed | grep zlib dnf install gcc-c dnf install zlib dnf install pcre pcre-devel dnf install openssl openssl-devel下载nginx&#xff0c;这里是下载到opt文…...

总结设计测试用例的万能公式

现在有⼀款产品&#xff0c;要求我们对“⻔锁”设计测试⽤例&#xff0c;假如你是测试⼈员&#xff0c;你会怎么设计呢&#xff1f; 1 常规思考逆向思维发散性思维 设计测试⽤例的原则⼆&#xff1a; 1.测试⽤例的编写不仅应当根据有效和预料到的输⼊情况&#xff0c;⽽且也…...

Android RK356X TVSettings USB调试开关

Android RK356X TVSettings USB调试开关 平台概述操作-打开USB调试实现源码补充说明 平台 RK3568 Android 11 概述 RK3568 是瑞芯微&#xff08;Rockchip&#xff09;推出的一款高性能处理器&#xff0c;支持 USB OTG&#xff08;On-The-Go&#xff09;和 USB Host 功能。US…...

python生成动态库在c++中调用

一.Windows下生成动态库.pyd 在setup.py的同目录下使用python setup.py build_ext --inplace 二.在vscode的c中使用.pyd文件&#xff08;动态库&#xff09; 1&#xff09;配置python的环境 python -c "import sys; print(sys.executable)" #确定python安装位置 2…...

大模型数据味蕾论

大模型数据味蕾论 大模型的成长路径&#xff1a;从婴儿到专家预训练数据的"四维口味"模型从文本到模型&#xff1a;数据处理的关键步骤"大模型数据味蕾论"结语 AI大模型就像一位厨师&#xff0c;预训练数据就是这位厨师的味蕾。 没有经过训练的味蕾&#x…...

网络编程4

day4 一、Modbus 1.分类 (1).Modbus RTU: 运行在串口上的协议&#xff0c;采用二进制表现形式以及紧凑型数据结构&#xff0c;通信效率高&#xff0c;应用广泛。(2).Modbus ASCII: 运行在串口上的协议&#xff0c;采用ASCII码传输&#xff0c;并且利用特殊字符作为其字节的开始…...

neo4j-community-3.5.5-unix.tar.gz安装

从官网找了下包&#xff0c;哎&#xff0c;奈何访问不了github,那就找镜像吧&#xff0c;哎&#xff0c;也是不通。 # docker search neo4j Error response from daemon: Get "https://index.docker.io/v1/search?qneo4j&n25": dial tcp 202.160.128.40:443: i…...

高防IP能抵御哪些类型的网络攻击?

高防IP&#xff08;High Defense IP&#xff09;是一种专门针对网络攻击设计的防护服务&#xff0c;主要通过流量清洗、协议分析、行为检测等技术抵御多种网络攻击。以下是其能防御的主要攻击类型及原理&#xff1a; ​​一、常见防御的攻击类型​​ ​​DDoS攻击&#xff08;分…...

动态监控进程

1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法&#xff1a; top [选项] 选项说明 ⭐️僵死进程&#xff1a;内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…...

你学会了些什么220622?--搭建UI自动化

jenkins访问地址&#xff1a;http://192.168.82.129:8080/ 账号密码&#xff1a;admin/a123456a ***** 什么是UI自动化** 使用工具或者脚本对需要测试的软件的前端界面在预设的条件下&#xff0c;在已有的测试数据下运行系统或者应用程序&#xff0c;并获取其前端页面UI显示的…...

深入理解自监督学习(Self-Supervised Learning):理论与实践

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

时序逻辑入门指南:LTL、CTL与PTL的概念介绍与应用场景

引言 在计算机科学和形式化方法中,**时序逻辑(Temporal Logic)**是描述系统动态行为的核心工具,它允许我们形式化地表达“时间”相关的性质,例如“某事件最终会发生”或“系统始终满足安全条件”。其中,LTL(线性时序逻辑)、**CTL(计算树逻辑)和PTL(命题时序逻辑)*…...

Spring Boot 整合 JavaFX 核心知识点详解

1. 架构设计与集成模式 1.1 Spring Boot 与 JavaFX 的分层架构设计 Spring Boot 与 JavaFX 的整合需要精心设计的分层架构,以充分利用两个框架的优势。 标准分层架构 ┌────────────────────────────────────────────────…...

进程与线程:02 多进程图像

多进程图像的起源与核心地位 上节课我们开启了对操作系统核心概念——多进程图像的学习&#xff0c;探讨了其产生的原因。操作系统的核心职责之一是管理CPU&#xff0c;CPU作为实现取指执行的硬件自动化部件&#xff0c;只有执行取指操作&#xff08;即取出并执行程序指令 &am…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中&#xff0c;SIMMECHANICS是M…...

FreeRTOS互斥信号量解决优先级翻转实战教程

FreeRTOS互斥信号量解决优先级翻转实战教程 大家好&#xff01;今天我们来深入探讨FreeRTOS中的优先级翻转问题&#xff0c;并通过互斥信号量来解决这个问题。上一篇文章我们已经了解了优先级翻转的现象&#xff0c;今天我们将动手实践&#xff0c;通过代码对比来直观感受互斥…...

Spark-SQL 四(实验)

用idea实验hive的常用代码 将数据放到项目的目录下 代码实现 运行结果&#xff1a; 实验 统计有效数据条数及用户数量最多的前二十个地址 将数据放到Spark-SQL/input目录下 代码实现&#xff1a; 运行结果&#xff1a;...

前端技术未来的发展趋势分析

以下是关于前端技术未来发展趋势的深度分析&#xff0c;结合行业动态和技术演进方向&#xff0c;从多个维度展开&#xff1a; 一、核心发展趋势 1. 框架融合与性能极致化 趋势&#xff1a;React/Vue/Solid 等框架在编译时优化&#xff08;如React Forget编译器&#xff09;和…...

字节扣子空间开启内测!附免费邀请码!

3月初&#xff0c;当Manus作为首个通用智能体横空出世时&#xff0c;整个科技圈都沸腾了。 当时我就预言过&#xff1a;这种创新产品要真正普及&#xff0c;还得看大厂动作&#xff08;毕竟创业公司的资源有限啊&#xff09;。 这不&#xff0c;字节跳动最近就悄悄放出了大招—…...

高并发场景下的淘宝 API 开发实践:商品数据实时采集与性能优化

在电商行业竞争激烈的当下&#xff0c;实时获取海量商品数据成为企业把握市场动态、制定精准策略的关键。然而&#xff0c;高并发场景下对淘宝 API 的调用极易引发性能瓶颈与稳定性问题。本文将围绕高并发场景下淘宝 API 开发&#xff0c;深入讲解商品数据实时采集的技术要点&a…...

如何将Qt程序打包成应用程序?

1、使用release模式&#xff0c;编译项目 2、新建一个文件夹&#xff08;不要有中文路径&#xff09;&#xff0c;将刚才编译生成的可执行文件&#xff08;.exe&#xff09;放入新建的文件夹下。 可执行文件通常生成在项目目录下的构建文件夹中&#xff0c;如 build-项目名-套…...

AI重塑网络安全:机遇与威胁并存的“双刃剑”时代

一、引言 人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;正在深刻改变网络安全行业的格局。从ChatGPT生成钓鱼邮件到AI驱动的漏洞挖掘&#xff0c;从零信任架构的普及到安全大模型的实战应用&#xff0c;AI既是攻击者的“新武器”&#xff0c;也是防御者的“新…...

c++基础·列表初始化

目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型&#xff08;Aggregate Types&#xff09;初始化 1. 聚合类型定义 2. 初始化…...

颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑

文章目录 前言1. 安装Docker2. Go File使用演示3. 安装cpolar内网穿透4. 配置Go File公网地址5. 配置Go File固定公网地址 前言 在这个信息爆炸的时代&#xff0c;谁不曾遭遇过类似的窘境呢&#xff1f;试想&#xff0c;当你正于办公室中埋首案牍时&#xff0c;手机突然弹出一…...

目标检测中的损失函数(二) | BIoU RIoU α-IoU

BIoU来自发表在2018年CVPR上的文章&#xff1a;《Improving Object Localization With Fitness NMS and Bounded IoU Loss》 论文针对现有目标检测方法只关注“足够好”的定位&#xff0c;而非“最优”的框&#xff0c;提出了一种考虑定位质量的NMS策略和BIoU loss。 这里不赘…...

RS232 串行通信:C++ 实现指南

文章目录 一、RS232 简介1. 电气特性2. 传输速率3. 传输距离 二、在 C 中实现 RS232 通信1. Windows 平台&#xff08;1&#xff09;打开串行端口&#xff08;2&#xff09;配置串行通信参数&#xff08;3&#xff09;发送数据&#xff08;4&#xff09;接收数据&#xff08;5&…...

电控---SWD协议

SWD协议是烧录调试常用的协议&#xff0c;本文对SWD协议进行了&#xff0c;覆盖物理层、协议层、寄存器结构、信号时序、安全特性、实际应用及最新发展趋势的讲解。 一、物理层架构与信号特性 1. 引脚定义与电气规范 核心引脚&#xff1a; SWDIO&#xff08;双向数据线&…...

Linux系统下docker 安装 redis

docker安装最新版的redis 一、docker拉取最新版redis镜像 拉取镜像若没有指定版本&#xff0c;代表拉取最新版本 二、查询redis镜像 三、挂载配置文件 在docker容器内修改redis配置文件不方便&#xff0c;所以挂载配置文件&#xff0c;这样可以在外边修改redis配置 3.1 创建…...

第 2 篇:初探时间序列 - 可视化与基本概念

第 2 篇&#xff1a;初探时间序列 - 可视化与基本概念 (图片来源: Luke Chesser on Unsplash) 在上一篇《你好&#xff0c;时间序列&#xff01;》中&#xff0c;我们了解了什么是时间序列数据以及学习它的重要性。现在&#xff0c;是时候卷起袖子&#xff0c;真正开始接触和探…...

适配器模式:化解接口不兼容的桥梁设计

适配器模式&#xff1a;化解接口不兼容的桥梁设计 一、模式核心&#xff1a;让不兼容的接口协同工作 在软件开发中&#xff0c;经常会遇到接口不兼容的情况&#xff1a;如旧系统提供的接口无法被新系统直接调用&#xff0c;或第三方库的接口与当前系统设计不匹配。适配器模式…...

科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%

4月21日盘后&#xff0c;AI龙头科大讯飞&#xff08;002230.SZ&#xff09;发布2024年报&#xff0c;公司全年实现营业收入233.43亿元&#xff0c;同比增长18.79%&#xff0c;同期归母净利润为5.6亿元。 公司核心赛道业务保持快速增长&#xff0c;消费者、教育、汽车、医疗业务…...

基于大模型的血栓性外痔全流程风险预测与治疗管理研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、血栓性外痔概述 2.1 定义与发病机制 2.2 临床表现与诊断方法 2.3 现有治疗手段综述 三、大模型在血栓性外痔预测中的应用原理 3.1 大模型技术简介 3.2 模型构建与训练数据来源 3.3 模型预测血栓性外痔的工作流程…...

Transformer系列(三):编码器—解码器架构

Transformer架构 一、多头自注意力 &#xff08;Multi-head self-attention&#xff09;将矩阵维度从d降到d/k的优点 二、层归一化 (Lary Norm)三、残差连接 (Residual Connections)Add and Norm 四、注意力对数几率缩放 &#xff08;Attention logit scaling&#xff09;五、T…...

C++入门小馆: 深入string类(二)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

MCU开发学习记录10 - 高级定时器学习与实践(HAL库)—PWM互补输出、死区控制、刹车控制 - STM32CubeMX

本文将介绍高级定时器的概念&#xff08;只讲解高级定时器特有功能&#xff09;、相关函数以及STM32CubeMX生成定时器的配置函数以及对生成定时器的配置函数进行分析&#xff08;包括结构体配置、相关寄存器配置&#xff09;。针对于高级定时器实践&#xff1a;实现输出PWM互补…...

pytest基础-new

规范 1、首先创建 py 文件命名以 test_ 开始或者以 _test 结尾 2、若是新建类&#xff0c;测试类需要以 Test_开头 3、测试用例&#xff08;方法&#xff09;需要以 test_开头 assert 断言 assert xx&#xff1a;判断 xx 为真 assert not xx&#xff1a;判断 xx 不为真 asse…...

利用Qt创建一个模拟问答系统

界面&#xff1a; 添加了聊天显示区域&#xff08;QTextEdit&#xff09; 添加了发送按钮和清空对话按钮 优化了布局和窗口大小添加了时间戳显示 2、功能&#xff1a; 支持实时对话可以清空对话历史 支持按回车发送消息 添加了简单的关键词匹配响应系统 交互体验&#x…...

CCF CSP 第37次(2025.03)(1_数值积分_C++)

CCF CSP 第37次&#xff08;2025.03&#xff09;&#xff08;1_数值积分_C&#xff09; 解题思路&#xff1a;思路一&#xff1a; 代码实现代码实现&#xff08;思路一&#xff09;&#xff1a; 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 原题链接 解题思路…...

使用 Flutter 遇坑小计

前言 首先, 谷哥很贴心地为国内用户准备了一份使用手册 不过很遗憾 就算你照着它的手册来了, 还是会在后续使用中遇到其它的坑 今天我踩了, 保不齐明天就是其他人(lol) running gradle task ‘assembledebug’ stuck 首先去确定下当下Android Studio(或者说你目前的Flutter项…...

C语言中的双链表和单链表详细解释与实现

C语言中的双链表详细解释与实现 双链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;它比单链表更灵活&#xff0c;因为每个节点都包含指向前驱和后继节点的指针。 双链表的基本结构 节点定义 c 复制 下载 typedef struct Node {int dat…...

CSS零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章&…...

使用python调用deepseek 多轮对话,详细讲解

以下代码实现在python中与deepseek实现多轮对话。 Messages参数是对话历史和上下文的核心载体。 数据结构&#xff1a; • 必须是包含消息对象的数组 • 每个消息对象必须包含&#xff1a; o role&#xff1a;发言者身份&#xff08;system/user/assistant&#xff09; o con…...

requestAnimationFrame是什么?【前端】

亲爱的读者&#xff0c;希望今天的你好心情~ 目录 requestAnimationFrame是什么&#xff1f;目的&#xff1f;举个栗子&#xff1a; requestAnimationFrame是什么&#xff1f; requestAnimationFrame 是一种用于优化动画性能的 JavaScript API。它允许你在浏览器的下一次重绘之…...