news 2026/8/8 8:04:51

人工智能之数字生命--工程实践:获取高精度轮廓等信息

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人工智能之数字生命--工程实践:获取高精度轮廓等信息

先把“双目差异”变成“深度/视差”,再用深度做分割,这样“存在”就变得非常清晰。

推荐流程:双目 → 视差/深度 → 存在掩膜 → 轮廓

  1. 标定 + 极线校正(Rectify)
    没有这一步,后面的视差会非常飘,轮廓会抖,动态更没法做。

  2. 计算视差图(Stereo Matching)
    用 OpenCVStereoSGBM(通常比 BM 好)得到 disparity。

  3. 视差后处理

    • speckle 去噪、median/bilateral
    • 有条件用ximgproc::DisparityWLSFilter会明显更干净
  4. 按深度分割存在(生成存在mask)

    • 近处物体:视差大;远处背景:视差小
    • 用阈值/分段阈值 + 连通域/聚类得到“存在候选”
    • 再用形态学 close/open 填洞
  5. 从mask提轮廓
    findContours得到轮廓;需要更精细就用 depth 边界 + 图像边缘(Canny)做融合细化。


为什么这比“左右做差”更准

  • 左右做差:本质是“视角变化造成的像素不对齐”,会把大量背景纹理误判为前景
  • 视差/深度分割:直接在几何层面把前景(近)和背景(远)分开,对纹理/颜色不敏感,轮廓更闭合、更稳定,后续做“动态”才靠谱

一个可直接落地的 OpenCV C++ 核心示例(存在mask + 轮廓)

// 1) 假设你已经做完标定&校正,拿到了 rectLeft, rectRight (灰度)cv::Ptr<cv::StereoSGBM>sgbm=cv::StereoSGBM::create(/*minDisparity*/0,/*numDisparities*/128,// 必须是16的倍数:64/96/128.../*blockSize*/5);sgbm->setP1(8*1*5*5);sgbm->setP2(32*1*5*5);sgbm->setUniquenessRatio(10);sgbm->setSpeckleWindowSize(100);sgbm->setSpeckleRange(2);sgbm->setDisp12MaxDiff(1);sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);cv::Mat disp16S;sgbm->compute(rectLeft,rectRight,disp16S);// 2) disparity 转 float(OpenCV 输出通常是 *16 的定点)cv::Mat disp;disp16S.convertTo(disp,CV_32F,1.0/16.0);// 3) 基于视差阈值做“近物体”mask(阈值要结合你的基线/分辨率调)floatnearDispTh=8.0f;// 例:>8 认为更靠近(需要你现场调)cv::Mat mask=disp>nearDispTh;// 4) 去噪&填洞mask.convertTo(mask,CV_8U,255);cv::morphologyEx(mask,mask,cv::MORPH_OPEN,cv::getStructuringElement(cv::MORPH_ELLIPSE,{3,3}));cv::morphologyEx(mask,mask,cv::MORPH_CLOSE,cv::getStructuringElement(cv::MORPH_ELLIPSE,{7,7}));// 5) 连通域过滤掉小碎片cv::Mat labels,stats,centroids;intn=cv::connectedComponentsWithStats(mask,labels,stats,centroids,8,CV_32S);cv::Mat clean=cv::Mat::zeros(mask.size(),CV_8U);for(inti=1;i<n;i++){intarea=stats.at<int>(i,cv::CC_STAT_AREA);if(area>500){// 过滤阈值按分辨率调clean.setTo(255,labels==i);}}// 6) 轮廓std::vector<std::vector<cv::Point>>contours;cv::findContours(clean,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE);

什么时候“左右两张做差”还能用?

只有在你满足这些条件时它才可能“凑合”:

  • 画面很干净、背景纹理少、光照稳定
  • 你先做了极线校正,并且做了某种对应/对齐(否则差异全是错位)
  • 你只想要“可能存在的边界提示”,不追求闭合轮廓

但一旦你要为“动态”服务(连续帧稳定追踪、速度/位移估计、轮廓编码记忆),深度分割几乎是必选项


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 18:40:01

延迟优化实战:LobeChat端到端响应时间缩短30%

延迟优化实战&#xff1a;LobeChat端到端响应时间缩短30% 在构建现代AI聊天应用的实践中&#xff0c;一个看似微小的延迟——从用户点击发送到第一个字出现在屏幕上——往往决定了体验是“丝滑流畅”还是“卡顿等待”。尤其当大语言模型&#xff08;LLM&#xff09;推理能力趋于…

作者头像 李华
网站建设 2026/8/7 22:21:31

原来是“图”!

死锁检测技术实现&#xff1a;等待图与定时遍历方案 死锁是数据库和并发系统中常见的问题&#xff0c;多个事务互相持有对方所需的资源&#xff0c;导致系统陷入停滞。通过构建等待图并配合定时检测机制&#xff0c;可以高效识别死锁并触发事务回滚&#xff0c;保障系统可用性…

作者头像 李华
网站建设 2026/8/7 16:02:48

力扣(LeetCode) 35: 搜索插入位置 - 解法思路

问题概述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 解法 1:线性搜索 工作原理 线性遍历数组,直到找到目标值或大于目标值的元素: class Solution:def searchInsert(self, nums, ta…

作者头像 李华
网站建设 2026/8/7 23:10:09

读书笔记整理:LobeChat提炼书中精华

LobeChat&#xff1a;如何用一个开源框架重塑AI对话体验 你有没有这样的经历&#xff1f;好不容易跑通了一个本地大模型&#xff0c;结果打开命令行一通输入&#xff0c;黑白界面、没有历史记录、不能传文件——交互体验简直像在写二十年前的程序。更别提想让同事或家人也试试了…

作者头像 李华
网站建设 2026/8/7 23:10:03

黑天鹅养殖技术性价比高的公司

黑天鹅养殖技术性价比高的公司&#xff1a;如何选择与行业实践在特种动物养殖领域&#xff0c;黑天鹅以其优雅的体态和较高的经济价值&#xff0c;吸引了众多投资者的目光。然而&#xff0c;成功养殖黑天鹅不仅需要掌握专业的养殖技术&#xff0c;更关键的是要选择一家能够提供…

作者头像 李华