C++与OpenCV虹膜分割实战:从瞳孔定位到掩膜生成的分阶段流程
简介这是一份面向计算机视觉初学者与图像处理方向开发者的虹膜分割实现代码基于C与OpenCV编写可用于生物特征识别、人眼图像分析等场景的入门实践与课程设计参考。压缩包共39个文件约3.26MB包含2个cpp源码文件、1个vcproj工程与sln解决方案以及10张bmp、10张jpg测试图片另附1份PDF方法介绍PPT方便对照原理理解算法流程。资源已有1124人学习下载说明其在虹膜提取这一细分方向具有一定参考价值。读者可从中获得完整的工程结构与可编译运行的源码结合测试图片直接验证分割效果并通过配套PPT梳理虹膜定位与边界提取的思路适合作为二次开发或算法改进的起点。1. 虹膜分割在 C 和 OpenCV 里到底难在哪虹膜分割 Iris Segmentation 这件事第一次做的人往往觉得不就是找圆吗霍夫变换一把梭。真上手才发现瞳孔和虹膜的边界在近红外图里对比度还行可一旦换成可见光彩色图睫毛、眼睑、反光点全来捣乱霍夫圆检测直接给你一堆候选圆挑哪个全靠玄学。我在一个模拟项目里用 C 和 OpenCV 做虹膜分割前后翻车三次才把流程跑稳血泪经验就是别指望一个函数解决得分阶段做粗定位加精修。这篇笔记讲的就是怎么用 C 和 OpenCV 把虹膜分割从零跑通。适合两类人一是做生物特征识别的工程师需要把虹膜区域抠出来送后续编码二是做图像处理 Demo 的同学想找一个有明确评价标准的练手项目。读完你能拿到一套可复现的流程包括瞳孔定位、虹膜外边界拟合、噪声掩膜生成以及每一步的参数怎么调、失败时看什么。2. 从瞳孔到虹膜C 与 OpenCV 的分阶段分割流程2.1 为什么不能一步到位做虹膜分割虹膜分割的输入通常是一张眼部区域图输出是虹膜的内外边界和有效区域掩膜。内边界是瞳孔和虹膜的过渡外边界是虹膜和巩膜的过渡。这两个边界的对比度方向相反瞳孔比虹膜暗虹膜又比巩膜暗。如果直接对整张图做边缘检测再拟合圆睫毛和眼睑的强边缘会把结果带偏。常见做法是分两步先定位瞳孔因为瞳孔是整张图里最暗且最接近圆形的区域用阈值加连通域就能粗定位再以瞳孔中心为先验在极坐标下沿径向搜索虹膜外边界。这样做的理由是虹膜外边界在瞳孔中心附近近似圆形极坐标展开后边界变成一条水平曲线用一维梯度就能找到比在笛卡尔坐标下做二维圆检测稳得多。我一般会把流程拆成四个函数瞳孔粗定位、瞳孔精修、虹膜外边界拟合、掩膜生成。每个函数单独可测出问题能快速定位是哪一步崩了。2.2 瞳孔粗定位阈值加连通域的最小实现先看代码。这段是瞳孔粗定位的核心输入是灰度图输出是瞳孔的粗略圆心和半径。#include opencv2/opencv.hpp #include vector #include algorithm // 瞳孔粗定位阈值 连通域 圆形度筛选 bool coarsePupil(const cv::Mat gray, cv::Point2f center, float radius) { cv::Mat blur, binary; // 高斯模糊压噪声核大小 5 是经验值太大瞳孔边缘会糊 cv::GaussianBlur(gray, blur, cv::Size(5, 5), 1.5); // 自适应阈值在眼部图里比固定阈值稳blockSize 取 31 覆盖瞳孔尺度 cv::adaptiveThreshold(blur, binary, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY_INV, 31, 10); // 形态学开运算去掉睫毛造成的细碎白点 cv::Mat kernel cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)); cv::morphologyEx(binary, binary, cv::MORPH_OPEN, kernel); std::vectorstd::vectorcv::Point contours; cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); float bestScore 0.0f; bool found false; for (const auto c : contours) { double area cv::contourArea(c); if (area 100) continue; // 太小的直接丢多半是噪声 cv::Point2f pc; float r; cv::minEnclosingCircle(c, pc, r); if (r 5) continue; // 圆形度 面积 / 外接圆面积越接近 1 越像圆 float circularity static_castfloat(area / (CV_PI * r * r)); // 综合得分圆形度为主面积做加权避免选到小圆 float score circularity * std::min(area / 1000.0, 1.0); if (score bestScore) { bestScore score; center pc; radius r; found true; } } return found; }逻辑说明先模糊再自适应阈值是因为眼部图光照不均固定阈值在暗处会漏、亮处会多。THRESH_BINARY_INV让暗的瞳孔变成白色前景。开运算的核用椭圆而不是矩形因为瞳孔是圆的椭圆核更贴合。筛选时用圆形度而不是单纯面积是为了排除眼睑阴影这种大面积但不圆的区域。参数说明blockSize取 31 是覆盖瞳孔直径的经验值如果输入图分辨率翻倍这个值也要跟着翻。C取 10 是阈值偏移调大能让二值图更干净但可能把瞳孔边缘吃掉。area 100这个下限按 640x480 的图设的分辨率变了要等比调。2.3 瞳孔精修在粗定位附近做边缘拟合粗定位给的圆心和半径误差通常在 5 到 10 像素直接拿去做极坐标展开会偏。精修的做法是在粗定位圆附近取一圈径向梯度找梯度最大的位置作为真实边界点再用最小二乘拟合圆。// 瞳孔精修沿径向找梯度极值再拟合圆 bool refinePupil(const cv::Mat gray, cv::Point2f center, float radius) { const int rays 72; // 每 5 度一条射线 const int searchBand 15; // 在粗半径上下 15 像素内搜 std::vectorcv::Point2f edgePoints; for (int i 0; i rays; i) { float theta 2.0f * CV_PI * i / rays; float maxGrad 0.0f; float bestR radius; for (int dr -searchBand; dr searchBand; dr) { float r radius dr; if (r 3) continue; int x cvRound(center.x r * std::cos(theta)); int y cvRound(center.y r * std::sin(theta)); if (x 1 || y 1 || x gray.cols - 1 || y gray.rows - 1) continue; // 径向梯度外侧减内侧瞳孔比虹膜暗所以边界处梯度为正 float grad static_castfloat(gray.atuchar(y, x 1)) - static_castfloat(gray.atuchar(y, x - 1)); if (grad maxGrad) { maxGrad grad; bestR r; } } if (maxGrad 5.0f) { // 梯度太小的射线丢掉多半被睫毛挡了 edgePoints.emplace_back(center.x bestR * std::cos(theta), center.y bestR * std::sin(theta)); } } if (edgePoints.size() 20) return false; // 有效点太少精修失败 // 最小二乘拟合圆解 [2x 2y 1] * [a b c]^T x^2 y^2 cv::Mat A(edgePoints.size(), 3, CV_32F); cv::Mat b(edgePoints.size(), 1, CV_32F); for (size_t i 0; i edgePoints.size(); i) { float x edgePoints[i].x, y edgePoints[i].y; A.atfloat(i, 0) 2 * x; A.atfloat(i, 1) 2 * y; A.atfloat(i, 2) 1; b.atfloat(i, 0) x * x y * y; } cv::Mat sol; cv::solve(A, b, sol, cv::DECOMP_SVD); center.x sol.atfloat(0); center.y sol.atfloat(1); radius std::sqrt(sol.atfloat(2) center.x * center.x center.y * center.y); return true; }逻辑说明径向梯度用中心差分近似gray(y, x1) - gray(y, x-1)在瞳孔边界处因为外侧亮内侧暗结果为正。只保留梯度大于阈值的射线是为了排除被睫毛或反光挡住的无效方向。拟合用 SVD 解超定方程比直接解正规方程数值上稳。参数说明rays取 72 是精度和速度的折中要更稳可以加到 120。searchBand取 15 取决于粗定位误差如果粗定位经常偏 20 像素以上先回去调粗定位。梯度阈值 5.0 是 8 位灰度下的经验值图像对比度低时要往下调。2.4 虹膜外边界极坐标展开加一维搜索瞳孔定位准了之后虹膜外边界就好找了。把以瞳孔中心为原点的环形区域展开成矩形横轴是角度纵轴是半径然后在每一列上找梯度极值。// 虹膜外边界极坐标展开后逐列找梯度极值 bool irisOuterBoundary(const cv::Mat gray, const cv::Point2f center, float pupilR, float irisR) { const int angBins 360; const int radBins 80; float rMin pupilR * 1.2f; // 从瞳孔外 20% 开始搜 float rMax pupilR * 3.5f; // 上限按瞳孔半径倍数给 cv::Mat polar(radBins, angBins, CV_32F); for (int a 0; a angBins; a) { float theta 2.0f * CV_PI * a / angBins; for (int r 0; r radBins; r) { float rr rMin (rMax - rMin) * r / (radBins - 1); int x cvRound(center.x rr * std::cos(theta)); int y cvRound(center.y rr * std::sin(theta)); if (x 0 || y 0 || x gray.cols || y gray.rows) { polar.atfloat(r, a) 0; } else { polar.atfloat(r, a) gray.atuchar(y, x); } } } // 每一列找径向梯度最大处 std::vectorfloat radii; for (int a 0; a angBins; a) { float maxGrad 0.0f; int bestR 0; for (int r 1; r radBins - 1; r) { float grad polar.atfloat(r 1, a) - polar.atfloat(r - 1, a); if (grad maxGrad) { maxGrad grad; bestR r; } } if (maxGrad 3.0f) { radii.push_back(rMin (rMax - rMin) * bestR / (radBins - 1)); } } if (radii.size() angBins / 3) return false; // 取中位数当外半径比均值抗离群点 std::nth_element(radii.begin(), radii.begin() radii.size() / 2, radii.end()); irisR radii[radii.size() / 2]; return true; }逻辑说明极坐标展开把二维圆检测降成一维梯度搜索这是整个流程里最值钱的一步。每一列独立找极值再用中位数聚合能天然排除被眼睑遮挡的角度。rMin从瞳孔外 20% 开始是因为瞳孔和虹膜过渡带本身有宽度从瞳孔边界直接搜会搜到内边界。参数说明radBins取 80 意味着径向分辨率是(rMax - rMin) / 79如果瞳孔半径 40 像素这个分辨率约 1.2 像素够用。rMax取瞳孔半径 3.5 倍是统计经验亚洲人虹膜外径通常是瞳孔的 2.5 到 3 倍留余量防止漏。梯度阈值 3.0 比瞳孔精修低因为虹膜外边界对比度通常更弱。2.5 掩膜生成把睫毛和反光挡掉分割出内外圆之后还要生成一个有效区域掩膜把睫毛、眼睑、镜面反光排除掉否则后续特征提取会被污染。// 生成虹膜有效区域掩膜 cv::Mat buildIrisMask(const cv::Mat gray, const cv::Point2f center, float pupilR, float irisR) { cv::Mat mask cv::Mat::zeros(gray.size(), CV_8U); // 先画圆环 cv::circle(mask, center, cvRound(irisR), 255, -1); cv::circle(mask, center, cvRound(pupilR), 0, -1); // 反光检测高亮小区域用高阈值加连通域面积筛 cv::Mat bright; cv::threshold(gray, bright, 220, 255, cv::THRESH_BINARY); std::vectorstd::vectorcv::Point specs; cv::findContours(bright, specs, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); for (const auto s : specs) { if (cv::contourArea(s) 200) { // 反光点通常不大 cv::drawContours(mask, std::vectorstd::vectorcv::Point{s}, -1, 0, -1); } } return mask; }逻辑说明圆环用两次circle画先实心大圆再挖掉小圆。反光检测用固定高阈值是因为镜面反光在近红外图里接近饱和阈值 220 能稳定抓到。面积上限 200 是为了不误伤巩膜高亮区域。参数说明阈值 220 按 8 位灰度设如果图像做过归一化要重新标定。面积 200 对应 640x480 下的反光点分辨率变了要等比调。3. 参数怎么调五个必调项和它们的联动关系3.1 自适应阈值的 blockSize 和 C这两个参数是瞳孔粗定位的命门。blockSize决定局部阈值的感受野必须大于瞳孔直径否则瞳孔内部会被切成两半。C是阈值偏移调大让二值图更保守调小更激进。我的调法先量一下瞳孔在图上大概多少像素blockSize取这个值的 1.5 倍并向上取奇数。C从 10 开始如果二值图里瞳孔有空洞就降到 5如果睫毛被误检就升到 15。这两个参数要一起看单独调一个容易顾此失彼。3.2 径向搜索带宽 searchBandsearchBand决定精修时在粗半径上下多大范围找边界。设太小粗定位偏了就找不到设太大可能搜到虹膜内边界上去。经验值是粗定位半径误差的两倍。如果你发现精修后半径反而更离谱先检查这个值是不是超过了瞳孔和虹膜内边界的距离。3.3 梯度阈值三个地方各有一个瞳孔精修用 5.0虹膜外边界用 3.0这两个不一样是有原因的。瞳孔边界对比度通常比虹膜外边界高阈值可以设高一点过滤噪声。如果图像质量差两个都要往下调但别低于 2.0否则噪声梯度会被当成边界。3.4 极坐标的 radBins 和 rMaxradBins决定径向分辨率rMax决定搜索上限。这两个联动rMax设大了同样的radBins下分辨率变粗可能跳过真实边界。我的做法是先按瞳孔半径 3.5 倍设rMax然后保证(rMax - rMin) / radBins小于 1.5 像素不够就加radBins。3.5 掩膜的反光面积上限这个参数最容易被忽略。设太小反光点挖不干净设太大会把巩膜上的高亮当反光挖掉虹膜有效区域少一块。按图像分辨率算反光点面积通常不超过虹膜面积的 2%用这个比例反推面积上限比较稳。4. 避坑与排查虹膜分割里最常见的五个翻车现场4.1 瞳孔定位跑到眼睑阴影上现象粗定位返回的圆心明显偏上或偏下半径偏大。原因眼睑阴影在阈值图里也是暗区且面积可能比瞳孔大圆形度筛选的得分被面积加权项拉高。解决把面积加权项的上限调低或者加一个先验——瞳孔中心应该在图像中心区域给偏离中心的候选圆扣分。4.2 精修后圆心跳变现象粗定位看着还行精修后圆心突然偏移十几像素。原因某几条射线的梯度极值搜到了睫毛边缘这些离群点把最小二乘拟合带偏。解决拟合前先做一轮剔除算所有边界点到粗定位圆心的距离去掉偏离中位数超过 20% 的点再拟合。4.3 虹膜外边界搜到瞳孔内边界现象irisR算出来只比pupilR大一点点。原因rMin设得太小或者瞳孔精修后的半径偏小导致搜索起点落在瞳孔内部。解决rMin至少设成pupilR * 1.15并且在极坐标梯度搜索时如果最大梯度出现在搜索带的最左端说明搜索起点不对直接判失败。4.4 反光掩膜把虹膜挖出大洞现象掩膜生成后虹膜区域缺了一大块。原因反光面积上限设太大把巩膜高亮或眼睑高光当反光处理了。解决加一个位置约束只挖圆环内的连通域圆环外的不管面积多大都不动。4.5 分辨率一变全崩现象换了一批图所有参数都不对了。原因所有像素相关的参数都是按某一分辨率调的没有归一化。解决在流程入口加一个归一化步骤把眼部区域缩放到固定宽度比如 320 像素所有参数按这个尺度设处理完再映射回原图坐标。5. 进阶技巧用径向对称变换做兜底和结果验证前面那套流程在质量好的近红外图上能跑但遇到可见光彩色图、睫毛浓密、或者瞳孔被反光遮掉一半的情况粗定位那一步就可能直接失败。我一般会加一个兜底径向对称变换。径向对称变换的思路是圆上的点对圆心的梯度方向都指向圆心或背离圆心。对每个像素沿梯度方向在正反两个方向各投一票累加到一个累加器里圆心位置的票数会形成峰值。这个方法的鲁棒性比阈值法强代价是计算量大。// 径向对称变换兜底找瞳孔中心 cv::Point2f radialSymmetryCenter(const cv::Mat gray, int minR, int maxR) { cv::Mat gx, gy; cv::Sobel(gray, gx, CV_32F, 1, 0, 3); cv::Sobel(gray, gy, CV_32F, 0, 1, 3); cv::Mat accum cv::Mat::zeros(gray.size(), CV_32F); for (int y 0; y gray.rows; y) { for (int x 0; x gray.cols; x) { float dx gx.atfloat(y, x); float dy gy.atfloat(y, x); float mag std::sqrt(dx * dx dy * dy); if (mag 20.0f) continue; // 弱梯度不投票 dx / mag; dy / mag; // 沿正反两个方向投票 for (int sign -1; sign 1; sign 2) { for (int r minR; r maxR; r) { int cx cvRound(x sign * r * dx); int cy cvRound(y sign * r * dy); if (cx 0 || cy 0 || cx gray.cols || cy gray.rows) continue; accum.atfloat(cy, cx) 1.0f; } } } } // 高斯平滑累加器让峰值更集中 cv::GaussianBlur(accum, accum, cv::Size(9, 9), 2.0); double maxVal; cv::Point maxLoc; cv::minMaxLoc(accum, nullptr, maxVal, nullptr, maxLoc); return cv::Point2f(maxLoc.x, maxLoc.y); }逻辑说明梯度方向归一化后沿正反两个方向各投一轮是因为不知道边界是暗到亮还是亮到暗。累加器平滑是为了把分散的票聚成峰。minR和maxR按瞳孔半径的可能范围给一般取 15 到 60。参数说明梯度幅值阈值 20.0 过滤掉平坦区域的噪声投票。投票半径范围要覆盖瞳孔可能的大小给窄了峰值不明显给宽了计算量上去。这个方法算一次大概几百毫秒不适合每帧都跑只在粗定位失败时兜底。验证分割结果也有讲究。我一般会算两个指标一是内外圆之间的区域里灰度标准差标准差太大说明边界没对准二是掩膜有效区域占圆环面积的比例低于 60% 说明遮挡太严重这张图直接丢弃比硬算更明智。这套流程我在模拟项目里跑了几百张图质量好的近红外图成功率在 95% 以上可见光图掉到 70% 左右。掉的那部分主要卡在粗定位所以如果你的场景是可见光建议把径向对称兜底做成默认开启别等失败了再补救。参数没有一套通吃的先归一化分辨率再按本文的顺序逐个调能省很多来回。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

pnpm 的构建判定引擎:@pnpm/building.pkg-requires-build 如何判断一个包是否需要编译

pnpm 的构建判定引擎:@pnpm/building.pkg-requires-build 如何判断一个包是否需要编译

包管理器开发工具CLI 【免费下载链接】pnpm Fast, disk space efficient package manager 项目地址: https://gitcode.com/gh_mirrors/pn/pnpm 点击查看 免费下载 本指南围绕 pnpm 仓库中的 pnpm11/building/pkg-requires-build 模块展开,剖析 pnpm 在安…

2026/10/11 17:27:17 阅读更多 →
SQL注入原理与防御实战:从报错注入到参数化查询

SQL注入原理与防御实战:从报错注入到参数化查询

1. 从一条诡异的订单记录说起:这次安全事件让我彻底重视SQL注入 先讲一个我亲历过的案例。某天凌晨,一位开发者同事接到告警:线上订单系统出现异常,数据库里凭空多出大量测试订单,金额字段全是乱码,用户表里…

2026/10/11 17:27:17 阅读更多 →
SQL注入全解析:原理、攻击类型、手工测试与防御实战

SQL注入全解析:原理、攻击类型、手工测试与防御实战

做了这么多年安全测试,如果要我选一个最有“性价比”的漏洞,SQL注入绝对排在前三。说它性价比高,是因为这类问题的成因往往简单到离谱——一段字符串拼接,一句单引号没过滤,甚至只是一个参数引号被转发的顺序不对&…

2026/10/11 17:27:17 阅读更多 →

最新新闻

自动侧推定位机构中的接近开关:让工件靠边更准确

自动侧推定位机构中的接近开关:让工件靠边更准确

自动侧推定位机构常用于装配前校正、检测前靠边、输送线转位和小型工件姿态调整。工件从输送线进入定位区后,通常需要由侧推板或气缸将其推向基准面。如果侧推距离不足,工件可能没有真正贴紧定位边;如果回位不完整,又会影响下一个…

2026/10/11 18:11:43 阅读更多 →
排序算法选择排序全解析:逻辑、稳定性、复杂度与工程取舍

排序算法选择排序全解析:逻辑、稳定性、复杂度与工程取舍

讲个真实场景:我见过不少刚接触算法的同事,写出来的第一个排序代码,其实都是选择排序。倒不是因为他们背过这个算法,而是因为人天生就喜欢"从一堆东西里挑最小的,放到最前面"——这个动作太符合直觉了。但选…

2026/10/11 18:11:43 阅读更多 →
快照时间线分析:用历史快照还原目标网站的演变

快照时间线分析:用历史快照还原目标网站的演变

快照时间线分析:用历史快照还原目标网站的演变 【免费下载链接】Legendary_OSINT A list of OSINT tools & resources for (fraud-)investigators, CTI-analysts, KYC, AML and more. 项目地址: https://gitcode.com/GitHub_Trending/le/Legendary_OSINT …

2026/10/11 18:11:43 阅读更多 →
一个软件工程大一新生的C语言学习感悟

一个软件工程大一新生的C语言学习感悟

我的C语言学习之路作为一名软件工程的大一新生,在这个暑假里开始学习C语言,我想分享一下我的感受。我之前接触计算机很少,但也会一点基本的操作。在得知我是软件工程专业时,我便询问了豆包关于这个专业相关的内容,于是…

2026/10/11 18:11:43 阅读更多 →
AI-For-Beginners 实战指南:基于 Hugging Face Transformers 的实验、文本生成与 Notebook 整理

AI-For-Beginners 实战指南:基于 Hugging Face Transformers 的实验、文本生成与 Notebook 整理

教程人工智能机器学习深度学习 【免费下载链接】AI-For-Beginners 12 Weeks, 24 Lessons, AI for All! 项目地址: https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners 点击查看 免费下载 本指南围绕课程《AI-For-Beginners》第 18 课的课后任务(…

2026/10/11 18:11:42 阅读更多 →
BACnet读写与COV订阅实战:bacpypes3工程落地指南

BACnet读写与COV订阅实战:bacpypes3工程落地指南

简介:本资源是一套基于C#实现的BACnet楼宇自控协议实践项目,面向自动化、智能建筑及工业通信领域的初学者与开发人员,聚焦设备属性读写、订阅值变化等核心功能,助力快速掌握BACnet协议在实际工程中的基础应用。压缩包共131个文件&…

2026/10/11 18:10:42 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →