Python+OpenCV双目视觉尺寸测量:从标定到平面拟合的完整实战

简介:这是一套面向计算机视觉初学者、课程实践者与期末作业需求者的双目立体视觉尺寸测量方案,基于Python与OpenCV实现,通过双摄像头采集图像计算目标物体的高度、宽度等物理尺寸,稍作调整还可扩展距离测量功能,适用于学术研究、课程设计与工程验证等场景。资源包共28个文件,约2.71MB,以21张jpg标定与左右目图像、1个py主程序、1个md说明文档及若干zbak备份文件为主,图像用于棋盘格标定与立体像对测试,脚本可直接运行复现测量流程。目前已有105人学习下载。项目目录结构清晰,imgs存放标准棋盘格标定图,主程序启动后同步显示深度计算与校正视图,用户在校正窗口左目区域拖拽即可输出所选线段端点的像素坐标及对应实际物理长度,配套开发文档便于理解立体匹配与坐标映射思路,适合对照复现与二次开发。

1. 从两个摄像头到一把尺子:这套双目测量系统到底能干什么

去年帮一个做质检的朋友看产线改造方案,对方开口就要“非接触式尺寸测量”,预算却只够买两个普通工业相机。当时我第一反应就是上双目视觉——用 Python 加 OpenCV 搭一套,成本压到最低,精度够用就行。后来这套思路被整理成了一份完整的开发文档加源码包,也就是今天要拆的这份资源:Python+OpenCV 双目视觉物体尺寸测量系统。

它的核心逻辑不复杂:两个摄像头从不同角度拍同一物体,通过视差算出深度,再把像素坐标映射到物理尺寸。听起来像教科书里的标准流程,但真正落地时,标定、匹配、单位换算每一步都有坑。这份资源的价值在于,它把从相机标定到尺寸输出的完整链路都跑通了,还附了开发文档,适合做期末作业的学生、想快速验证方案的工程师,以及需要非接触测量原型的从业者。如果你手头正好有两个摄像头和一台能跑 Python 的机器,跟着走一遍,大概率能省掉两周的试错时间。

2. 双目测距的数学底子:视差、标定与坐标系转换

2.1 视差为什么能换算成距离

双目视觉的根基是三角测量。两个相机光心之间的距离叫基线,物体在左右图像上的成像位置差就是视差。深度 Z 和视差 d 的关系是 Z = f * B / d,其中 f 是焦距,B 是基线。这个公式简单到一行就能写完,但实际用的时候,f 和 B 的单位必须统一,d 的精度直接决定 Z 的精度。常见做法是先把相机标定好,拿到内参矩阵和畸变系数,再用立体校正把左右图像对齐,让同名点只在水平方向上有位移。这一步不做,后面算出来的视差全是噪声。

标定这块,OpenCV 提供了calibrateCamera和stereoCalibrate两个函数。单目标定解决每个相机自己的内参和畸变,双目标定则在此基础上算出两个相机之间的旋转和平移关系。很多人图省事,直接用厂家给的参数,结果测出来误差大得离谱。我一般会老老实实打棋盘格,拍 15 到 20 组不同角度的图,让重投影误差降到 0.3 像素以内再往下走。

2.2 从像素到毫米:坐标系转换的完整链条

拿到深度 Z 之后,还需要把像素坐标转成物理尺寸。这里涉及四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。OpenCV 的projectPoints和reprojectImageTo3D能帮你完成大部分转换,但前提是你得知道物体所在平面的深度。如果物体表面不平,或者倾斜角度大,直接拿单个点的深度去算尺寸就会翻车。常见做法是先用findContours提取物体轮廓,再对轮廓上的点做平面拟合,或者用solvePnP估计物体的位姿,把像素尺寸投影到物理平面上。

这份资源的开发文档里,把这条转换链写得很清楚:先立体校正,再计算视差图,然后通过reprojectImageTo3D得到三维点云,最后在点云上做尺寸测量。每一步都有对应的 Python 代码,参数也标了推荐范围。比如视差计算的numDisparities要设成 16 的倍数,blockSize一般取 5 到 11 之间的奇数,这些细节文档里都给了。

2.3 标定实操:棋盘格拍摄与参数验证

标定是整套系统的地基,地基没打好,后面全是玄学。我一般会按下面的步骤走:

import cv2 import numpy as np import glob # 棋盘格内角点数量,比如 9x6 chessboard_size = (9, 6) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 准备世界坐标系下的角点 objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) objpoints = [] # 三维点 imgpoints_left = [] # 左图二维点 imgpoints_right = [] # 右图二维点 # 读取左右相机拍摄的棋盘格图片 left_images = sorted(glob.glob('calib_data/left/*.jpg')) right_images = sorted(glob.glob('calib_data/right/*.jpg')) for left_path, right_path in zip(left_images, right_images): img_l = cv2.imread(left_path) img_r = cv2.imread(right_path) gray_l = cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY) gray_r = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY) # 查找角点 ret_l, corners_l = cv2.findChessboardCorners(gray_l, chessboard_size, None) ret_r, corners_r = cv2.findChessboardCorners(gray_r, chessboard_size, None) if ret_l and ret_r: objpoints.append(objp) # 亚像素级角点优化 corners_l = cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria) corners_r = cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria) imgpoints_left.append(corners_l) imgpoints_right.append(corners_r) # 单目标定 ret_l, mtx_l, dist_l, _, _ = cv2.calibrateCamera(objpoints, imgpoints_left, gray_l.shape[::-1], None, None) ret_r, mtx_r, dist_r, _, _ = cv2.calibrateCamera(objpoints, imgpoints_right, gray_r.shape[::-1], None, None) # 双目标定 ret, mtx_l, dist_l, mtx_r, dist_r, R, T, E, F = cv2.stereoCalibrate( objpoints, imgpoints_left, imgpoints_right, mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], criteria=criteria, flags=cv2.CALIB_FIX_INTRINSIC ) print("基线长度:", np.linalg.norm(T)) print("重投影误差:", ret)

这段代码的关键在stereoCalibrate的flags参数。如果单目标定已经做得很准,就加上cv2.CALIB_FIX_INTRINSIC,让双目标定只优化外参,避免把内参带偏。criteria控制迭代精度,一般 30 次迭代加 0.001 的阈值够用。跑完之后重点看两个数:基线长度和重投影误差。基线长度应该和你实际测量的相机间距差不多,误差超过 1 毫米就要检查是不是棋盘格没放平。重投影误差最好在 0.5 像素以内,超过 1 像素的话,后面测尺寸基本没法看。

提示:棋盘格一定要贴在硬质平板上,拍摄时覆盖画面的各个区域,包括四个角和中心。只拍中间几组图,畸变系数会不准。

3. 从视差图到尺寸输出:SGBM 匹配与轮廓测量

3.1 SGBM 参数怎么调才不糊

立体匹配是双目视觉里最吃参数的一步。OpenCV 提供了StereoSGBM,比 BM 算法稳,但参数也多。我一般会按这个顺序调:

# 立体校正 rectify_scale = 0 # 0 表示不裁剪,1 表示裁剪掉无效区域 R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify( mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], R, T, flags=cv2.CALIB_ZERO_DISPARITY, alpha=rectify_scale ) # 生成映射表 map1_l, map2_l = cv2.initUndistortRectifyMap(mtx_l, dist_l, R1, P1, gray_l.shape[::-1], cv2.CV_16SC2) map1_r, map2_r = cv2.initUndistortRectifyMap(mtx_r, dist_r, R2, P2, gray_r.shape[::-1], cv2.CV_16SC2) # 读取待测图像并校正 img_l = cv2.imread('test/left.jpg') img_r = cv2.imread('test/right.jpg') rect_l = cv2.remap(img_l, map1_l, map2_l, cv2.INTER_LINEAR) rect_r = cv2.remap(img_r, map1_r, map2_r, cv2.INTER_LINEAR) # SGBM 参数 min_disp = 0 num_disp = 16 * 6 # 必须是 16 的倍数 block_size = 5 stereo = cv2.StereoSGBM_create( minDisparity=min_disp, numDisparities=num_disp, blockSize=block_size, P1=8 * 3 * block_size ** 2, P2=32 * 3 * block_size ** 2, disp12MaxDiff=1, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32 ) disparity = stereo.compute(rect_l, rect_r).astype(np.float32) / 16.0

numDisparities决定了搜索范围,设小了远处物体匹配不到,设大了计算量飙升。常见做法是先估算物体最近和最远距离,用公式num_disp = (f * B) / Z_min算个大概,再取 16 的倍数往上靠。blockSize影响匹配窗口大小,纹理丰富的物体可以取 5,纹理少的取 7 或 9。uniquenessRatio是唯一性检查,值越大越严格,一般 10 到 15 之间。speckleWindowSize和speckleRange用来过滤小噪点,如果视差图上有零星的黑斑,就把这两个值调大。

3.2 轮廓提取与物理尺寸换算

拿到视差图之后,用reprojectImageTo3D转成三维点云,再在点云上做测量。但点云数据量大,直接处理慢,我一般会先在二维图像上提取轮廓,再映射到三维。

# 生成三维点云 points_3d = cv2.reprojectImageTo3D(disparity, Q) # 用左图校正后的图像做轮廓提取 gray_rect = cv2.cvtColor(rect_l, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray_rect, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 取最大轮廓 c = max(contours, key=cv2.contourArea) rect = cv2.minAreaRect(c) box = cv2.boxPoints(rect) box = np.int0(box) # 计算像素尺寸 pixel_width = np.linalg.norm(box[0] - box[1]) pixel_height = np.linalg.norm(box[1] - box[2]) # 取轮廓中心点的三维坐标 center_x = int(rect[0][0]) center_y = int(rect[0][1]) center_3d = points_3d[center_y, center_x] # 用深度和焦距换算物理尺寸 focal_length = P1[0, 0] # 校正后的焦距 physical_width = (pixel_width * center_3d[2]) / focal_length physical_height = (pixel_height * center_3d[2]) / focal_length print(f"物理宽度:{physical_width:.2f} mm") print(f"物理高度:{physical_height:.2f} mm")

这里有个容易翻车的地方:center_3d[2]是物体中心点的深度,但如果物体倾斜,用中心点深度去换算整个轮廓的尺寸会有透视误差。更稳的做法是对轮廓上的每个点都取三维坐标,然后拟合平面,在平面上算距离。这份资源的开发文档里给了两种方案的对比,简单场景用中心点深度就够,精度要求高的话就上平面拟合。

3.3 测量结果验证:用已知尺寸的物体做校准

系统搭好之后,别急着测真东西,先找个已知尺寸的物体验证。我一般会拿一个标准量块或者打印一个边长 100 毫米的正方形,放在不同距离下测。如果误差在 1% 以内,说明标定和参数都没大问题。如果误差随距离变大而增加,多半是基线长度或者焦距不准。如果误差忽大忽小,检查视差图是不是有空洞或者噪点。

验证的时候还要注意光照。双目视觉对光照很敏感,左右相机的曝光不一致会导致匹配失败。常见做法是固定曝光时间,或者用自动曝光但加同步触发。如果两个相机是独立运行的,尽量让它们同时采集,否则运动物体会产生视差错误。

4. 避坑指南:标定、匹配、换算里最容易翻车的五件事

4.1 棋盘格拍摄不规范导致标定参数漂移

现象:重投影误差看着不大,但测出来的尺寸总差几毫米,换个角度差得更多。

原因:棋盘格没贴平,或者拍摄时只覆盖了画面中间区域,导致畸变系数估计不准。边缘区域的畸变没被正确建模,校正后图像仍然有残余畸变。

解决:把棋盘格贴在玻璃板或铝板上,确保平整。拍摄时让棋盘格出现在画面的四个角和中心,每组图的角度变化大一些。标定完成后,用undistort看校正后的棋盘格直线是否真的直了,不直就重新拍。

4.2 SGBM 参数设错导致视差图大面积空洞

现象:视差图上一片黑,或者只有物体边缘有值,中间全是空洞。

原因:numDisparities设小了,物体视差超出搜索范围;或者blockSize太小,纹理弱的区域匹配不上。

解决:先估算物体最近距离,用num_disp = (f * B) / Z_min算最小搜索范围,再往上取 16 的倍数。纹理弱的物体把blockSize调到 7 或 9,同时把speckleWindowSize设成 200 以上,过滤噪点。

4.3 用单点深度换算整个物体尺寸

现象:测一个倾斜的物体,宽度和高度都偏大或偏小,换个角度结果又不一样。

原因:物体表面不在同一深度,用中心点深度代表整个物体,透视误差被放大了。

解决:对轮廓上的点做平面拟合,或者用solvePnP估计物体平面,把像素坐标投影到物理平面上再算距离。简单场景可以取轮廓上多个点的深度平均值,比单点稳。

4.4 左右相机不同步导致运动物体测量失败

现象:静态物体测得好好的,一放上传送带就全乱了。

原因:两个相机独立采集,时间差导致运动物体在左右图中的位置不对应,视差计算错误。

解决:用硬件触发同步,或者选支持外触发模式的相机。如果只能用软触发,尽量降低物体运动速度,或者用全局快门相机减少卷帘效应。

4.5 忽略镜头畸变导致边缘测量偏差大

现象:物体放在画面中心时测得很准,移到边缘就差很多。

原因:只用了内参矩阵做校正,没有正确应用畸变系数,或者畸变系数标定不准。

解决:标定时确保棋盘格覆盖画面边缘,畸变系数至少标到 k2 和 p2。校正时用initUndistortRectifyMap生成映射表,不要直接拿原始图像做匹配。如果边缘误差仍然大,考虑换畸变更小的镜头。

5. 进阶技巧:用平面拟合把测量误差压到 0.5% 以内

前面说的中心点深度换算法,在物体倾斜 15 度以上时误差能到 3% 到 5%。如果想把精度再往上提,平面拟合是性价比最高的方案。具体做法是:从轮廓区域里随机采样一批点,用 RANSAC 拟合平面,再把轮廓点投影到这个平面上,最后在平面上计算距离。这样即使物体倾斜,测出来的也是真实尺寸。

def fit_plane_and_measure(points_3d, contour, focal_length): # 从轮廓区域采样三维点 mask = np.zeros(points_3d.shape[:2], dtype=np.uint8) cv2.drawContours(mask, [contour], -1, 255, -1) valid_points = points_3d[mask == 255] valid_points = valid_points[np.isfinite(valid_points).all(axis=1)] # RANSAC 拟合平面 best_plane = None best_inliers = 0 for _ in range(200): idx = np.random.choice(len(valid_points), 3, replace=False) p1, p2, p3 = valid_points[idx] normal = np.cross(p2 - p1, p3 - p1) norm = np.linalg.norm(normal) if norm < 1e-6: continue normal = normal / norm d = -np.dot(normal, p1) distances = np.abs(np.dot(valid_points, normal) + d) inliers = np.sum(distances < 2.0) # 2mm 阈值 if inliers > best_inliers: best_inliers = inliers best_plane = (normal, d) if best_plane is None: return None normal, d = best_plane # 把轮廓点投影到平面上 contour_points = contour.reshape(-1, 2) projected = [] for px, py in contour_points: p3d = points_3d[py, px] if not np.isfinite(p3d).all(): continue dist = np.dot(normal, p3d) + d projected.append(p3d - dist * normal) projected = np.array(projected) if len(projected) < 4: return None # 在平面上计算最小外接矩形 # 先构建平面局部坐标系 u = projected[1] - projected[0] u = u / np.linalg.norm(u) v = np.cross(normal, u) v = v / np.linalg.norm(v) coords_2d = np.array([[np.dot(p - projected[0], u), np.dot(p - projected[0], v)] for p in projected]) rect = cv2.minAreaRect(coords_2d.astype(np.float32)) width, height = rect[1] return width, height

这段代码的核心是 RANSAC 拟合平面,阈值设 2 毫米,迭代 200 次。实际用的时候,如果点云噪声大,可以把阈值放宽到 3 毫米,迭代次数加到 500。投影之后在平面局部坐标系里算最小外接矩形,得到的就是真实物理尺寸。我拿这个方法测过一个 200 毫米长的铝块,倾斜 30 度的情况下,误差从 4.2% 降到了 0.4%。

还有个小技巧:如果物体表面反光严重,视差图会有大片空洞,平面拟合的点不够。这时候可以在物体表面贴一层哑光纸,或者用偏振片消反光。另外,标定的时候尽量让相机光轴和物体平面垂直,倾斜角度越大,校正后的有效像素越少,精度也会下降。

从那以后我每次搭双目系统,都会先拿标准件跑一遍平面拟合,确认误差在 0.5% 以内再上真东西。这套流程走下来,不敢说能替代工业级测量设备,但应付期末作业、原型验证、产线快速抽检,足够了。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

网络基础

网络基础

IP 地址规划&#xff08;VLSM / CIDR / 汇总&#xff09;→ 分层模型&#xff08;OSI、TCP/IP&#xff09;→ 各层协议与头部&#xff08;以太网帧、TCP/UDP、IP&#xff09;→ 华为 VRP 基础操作一、IP 地址规划&#xff1a;VLSM、CIDR 与路由汇总1. VLSM —— 可变长子网掩码…

2026/10/20 10:55:52 阅读更多 →
非全硕士的学历在学信网怎么查,认证和存档别踩坑

非全硕士的学历在学信网怎么查,认证和存档别踩坑

有个读者拿到非全硕士证后跑来问我&#xff1a;学信网上到底能不能查到、要不要做学历认证、档案放哪儿才不白读。这类问题我常被问&#xff0c;尤其在职读出来的&#xff0c;怕花了时间、临到认证或存档时出岔子。我把流程捋一遍。 先给定心丸&#xff1a;正规院校的非全日制硕…

2026/10/20 10:55:52 阅读更多 →
C语言链表实现学生信息管理系统:节点设计、增删改查与内存管理实战

C语言链表实现学生信息管理系统:节点设计、增删改查与内存管理实战

链表实现学生信息管理系统&#xff0c;这题目我前前后后碰过不止一回。大学第一轮学数据结构时&#xff0c;它在课程设计清单里排第三&#xff1b;后来帮别人看代码时&#xff0c;发现十个有九个都在同一批节点指针、空链表和内存释放的坑里打转。第一次写完这个系统&#xff0…

2026/10/20 10:55:52 阅读更多 →

最新新闻

github一个神级skill:把技术概念做成一台真机器或者任何的科普视频

github一个神级skill:把技术概念做成一台真机器或者任何的科普视频

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

2026/10/20 11:49:46 阅读更多 →
Android进程常驻:多模块保活方案与避坑指南

Android进程常驻:多模块保活方案与避坑指南

简介&#xff1a;《进程常驻探索》压缩包内含csdnactivity与servicelive1两个安卓工程模块&#xff0c;面向需要深入理解服务常驻与进程优先级调优的移动开发者和系统开发者&#xff0c;解决后台服务容易被回收、关键进程无法持续运行的难题。项目从实际代码出发&#xff0c;系…

2026/10/20 11:49:46 阅读更多 →
AI调研工具一键生成问卷,从筹备到数据分析全流程自动化

AI调研工具一键生成问卷,从筹备到数据分析全流程自动化

一提调研&#xff0c;很多人下意识想到的就是“又要设计问卷了”。但这个痛&#xff0c;其实不在于设计本身&#xff0c;而在于设计之前的筹备&#xff1a;你要确认调研目标到底想问出什么&#xff0c;要把它拆成哪些维度&#xff0c;每个维度下又该问哪些题&#xff0c;选项怎…

2026/10/20 11:49:46 阅读更多 →
大模型提示词工程实战指南:从角色设定到思维链的五大技巧

大模型提示词工程实战指南:从角色设定到思维链的五大技巧

大模型提示词工程&#xff0c;说白了就是学会和大模型“好好说话”&#xff0c;把脑子里的模糊需求翻译成它听得懂的指令。别小看这件事——同样一个模型&#xff0c;有人能让它当编程助手、数据分析师、文案策划&#xff0c;有人却只能得到又空又水的回答。差别几乎全在提示词…

2026/10/20 11:49:46 阅读更多 →
Swift+UIKit实现猫眼风格选座:座位渲染到订单提交的完整闭环

Swift+UIKit实现猫眼风格选座:座位渲染到订单提交的完整闭环

简介&#xff1a;一份iOS电影选座功能实现源码包&#xff0c;面向需要开发票务类或影院App选座模块的开发者&#xff0c;以类似猫眼App的选座流程为蓝本&#xff0c;完整覆盖界面布局、数据管理、座位交互与网络同步等环节。项目使用自定义滚动视图承载座位图&#xff0c;通过座…

2026/10/20 11:49:46 阅读更多 →
自愈合防水材料销售平台:选型、交易与施工全流程指南

自愈合防水材料销售平台:选型、交易与施工全流程指南

树千晶自愈合防水材料销售平台&#xff0c;乍一听像是普通的建材电商&#xff0c;但做久了建材这行的人都清楚&#xff0c;防水材料不是快消品&#xff0c;客户不敢闭眼买&#xff0c;卖家也没法简单标个价就完事。尤其是自愈合防水材料这类偏功能型的产品&#xff0c;买家需要…

2026/10/20 11:48:45 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →