距實(shí)戰(zhàn):從相機(jī)標(biāo)定到距離計(jì)算完整鏈路)
做視覺測(cè)距這個(gè)需求十個(gè)里有八個(gè)是從“檢測(cè)到框”開始到“算出距離”結(jié)束。YOLO系列模型發(fā)展到Ultralytics YOLO11檢測(cè)精度和推理速度已經(jīng)非常成熟但很多人把模型跑通了才發(fā)現(xiàn)框出來容易距離難算。這篇博文就圍繞Ultralytics YOLO11做距離計(jì)算這件事把像素坐標(biāo)到物理距離的完整鏈路拆開講清楚從相機(jī)成像原理、焦距標(biāo)定到檢測(cè)結(jié)果換算、誤差排查給你一條可以直接落地的實(shí)現(xiàn)路徑。1. 距離計(jì)算的整體思路與方案選型先說結(jié)論YOLO11本身只負(fù)責(zé)“在圖像里找到目標(biāo)并畫出邊界框”它輸出的是像素坐標(biāo)不包含任何深度信息。想從二維像素算出三維物理距離必須在模型之外再搭一套幾何換算邏輯整套系統(tǒng)才算閉環(huán)。1.1 為什么不能直接使用檢測(cè)框的像素大小算距離很多人第一反應(yīng)是“物體在畫面里越小距離越遠(yuǎn)”然后試圖用一個(gè)線性函數(shù)擬合邊框高度和距離的關(guān)系。這個(gè)思路在固定場(chǎng)景、固定相機(jī)角度下勉強(qiáng)能用換到別的場(chǎng)景就徹底失效。根本原因在于相機(jī)成像是一個(gè)透視投影過程物體在圖像上的大小與距離之間是倒數(shù)關(guān)系不是線性關(guān)系。距離10米和距離20米時(shí)物體在畫面里縮小的幅度完全不同。真正可靠的做法是走針孔相機(jī)模型加相似三角形換算。這個(gè)方案的前提是你知道目標(biāo)的實(shí)際物理尺寸比如人的平均身高、車牌的寬度然后利用相機(jī)焦距這個(gè)內(nèi)部參數(shù)把像素高度換算成物理距離。1.2 三種主流測(cè)距方案的取舍方案一單目視覺測(cè)距本項(xiàng)目采用的核心方案只用一個(gè)普通攝像頭借助幾何模型和已知尺寸先驗(yàn)來估算距離。優(yōu)點(diǎn)是成本低、部署簡(jiǎn)單、算力要求小適合大部分安防和工業(yè)場(chǎng)景。缺點(diǎn)是精度依賴目標(biāo)尺寸先驗(yàn)的準(zhǔn)確性且無法應(yīng)對(duì)目標(biāo)遮擋。方案二雙目立體視覺測(cè)距通過兩個(gè)相機(jī)拍攝同一場(chǎng)景利用左右視圖的視差計(jì)算深度。精度高不受目標(biāo)尺寸先驗(yàn)限制但需要嚴(yán)格的相機(jī)同步和標(biāo)定流程硬件成本和計(jì)算開銷都翻倍。適合對(duì)精度要求極高、場(chǎng)景可控的室內(nèi)環(huán)境。方案三深度相機(jī)直接測(cè)距用深度傳感器直接獲取每個(gè)像素的深度值原理最簡(jiǎn)單精度也穩(wěn)定。但深度相機(jī)普遍視場(chǎng)角有限戶外強(qiáng)光下性能急劇下降設(shè)備成本也高于普通網(wǎng)絡(luò)攝像頭。綜合來看單目方案在“快速落地驗(yàn)證 中遠(yuǎn)距離估算”這個(gè)需求上性價(jià)比最高。本項(xiàng)目選它不是因?yàn)樗茏龅胶撩准?jí)精度而是因?yàn)樗茉谄胀〝z像頭和YOLO11的基礎(chǔ)上用最小的改動(dòng)換來可用的距離估計(jì)能力。1.3 完整技術(shù)鏈路整個(gè)系統(tǒng)分為四個(gè)模塊串起來就是一條完整鏈路目標(biāo)檢測(cè)模塊基于Ultralytics YOLO11加載預(yù)訓(xùn)練權(quán)重對(duì)視頻幀執(zhí)行推理輸出邊界框、類別和置信度。相機(jī)標(biāo)定模塊計(jì)算相機(jī)內(nèi)參矩陣和畸變系數(shù)核心是獲取焦距像素值。幾何換算模塊基于三角形相似原理將檢測(cè)框高度轉(zhuǎn)換為物理距離。結(jié)果可視化與輸出模塊在幀上疊加距離標(biāo)注并輸出結(jié)構(gòu)化數(shù)據(jù)。2. 相機(jī)成像模型與焦距標(biāo)定實(shí)操測(cè)距的精度上限一半取決于相機(jī)標(biāo)定做得好不好。這一節(jié)不講虛的直接給標(biāo)定思路和關(guān)鍵參數(shù)。2.1 針孔成像模型的核心關(guān)系在針孔模型下相機(jī)拍攝目標(biāo)時(shí)物理世界中的目標(biāo)高度、相機(jī)焦距、目標(biāo)到相機(jī)的距離、目標(biāo)在圖像傳感器上成像的像素高度四者滿足一個(gè)極其簡(jiǎn)潔的關(guān)系物理高度 / 像素高度 物理距離 / 焦距這個(gè)式子整理之后就能得到距離的計(jì)算公式距離 目標(biāo)物理高度 × 焦距 / 目標(biāo)像素高度這里的焦距不是鏡頭包裝盒上寫的毫米數(shù)而是以像素為單位的等效焦距。這個(gè)數(shù)值會(huì)隨相機(jī)分辨率變化所以在實(shí)際項(xiàng)目中必須通過標(biāo)定來確定不能靠猜也不能直接用傳感器尺寸手工推算因?yàn)殓R頭實(shí)際視角往往和標(biāo)稱值有偏差。2.2 基于棋盤格的標(biāo)定流程棋盤格標(biāo)定是目前最穩(wěn)定、最常用的方法核心原理是讓相機(jī)從不同角度拍攝一個(gè)圖案尺寸已知的棋盤格通過檢測(cè)角點(diǎn)來求解相機(jī)內(nèi)參和畸變系數(shù)。操作步驟如下打印一張A4紙大小的棋盤格建議使用7x10的角點(diǎn)布局格邊長打印后用游標(biāo)卡尺測(cè)量精確值別輕信打印設(shè)置里的理論值。固定好相機(jī)手持棋盤格在相機(jī)前變換姿態(tài)拍攝15到20張照片。要覆蓋不同距離、不同傾斜角度、畫面四個(gè)角落確保棋盤格在每張圖里完整可見。對(duì)每張照片用OpenCV的cv2.findChessboardCorners提取角點(diǎn)坐標(biāo)并配合cv2.cornerSubPix做亞像素級(jí)精化。import cv2 import numpy as np CHECKERBOARD (7, 10) criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32) objp[:, :2] np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2) objp objp * square_size # square_size為實(shí)測(cè)格邊長單位米 objpoints [] imgpoints [] images [fcalib_{i}.jpg for i in range(1, 21)] for fname in images: img cv2.imread(fname) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners cv2.findChessboardCorners(gray, CHECKERBOARD, None) if ret: corners2 cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) objpoints.append(objp) imgpoints.append(corners2) ret, mtx, dist, rvecs, tvecs cv2.calibrateCamera( objpoints, imgpoints, gray.shape[::-1], None, None ) fx mtx[0, 0] # x軸等效焦距像素單位 fy mtx[1, 1] # y軸等效焦距標(biāo)定完成后fx和fy就是換算公式里的焦距。注意在測(cè)距公式中水平方向和垂直方向的像素尺寸通常不同具體用哪個(gè)焦距取決于你測(cè)量目標(biāo)是靠水平寬度還是垂直高度。2.3 標(biāo)定實(shí)操中的關(guān)鍵注意事項(xiàng)棋盤格不要與相機(jī)平面平行要故意傾斜一個(gè)角度否則角點(diǎn)匹配會(huì)退化標(biāo)定結(jié)果會(huì)虛高。標(biāo)定照片要覆蓋變焦范圍。定焦鏡頭可以一次標(biāo)定長期使用變焦鏡頭如果改變了焦距必須重新標(biāo)定?;冃U龑?duì)遠(yuǎn)距離測(cè)距影響巨大。實(shí)測(cè)中未校正畸變的畫面邊緣誤差能到15%以上靠近畫面中心時(shí)誤差相對(duì)小。如果只測(cè)畫面中心區(qū)域目標(biāo)可以忽略畸變校正否則務(wù)必對(duì)每幀先做cv2.undistort再送入檢測(cè)模型。3. 基于YOLO11的檢測(cè)結(jié)果提取與坐標(biāo)處理標(biāo)定拿到焦距后下一步就是讓YOLO11在視頻流或圖片中輸出邊界框并從輸出里提取出測(cè)距所需的像素高度和類別信息。3.1 模型加載與推理流程Ultralytics YOLO11的使用已經(jīng)非常工程化幾行代碼就能跑通。以下代碼基于實(shí)測(cè)穩(wěn)定版本from ultralytics import YOLO model YOLO(yolo11n.pt) # 可以用n/s/m/l/x不同尺寸 results model.predict( sourcecamera_in.mp4, imgsz640, conf0.4, streamTrue, classes[0], # 0對(duì)應(yīng)COCO數(shù)據(jù)集中的person類 verboseFalse, )這里的streamTrue很關(guān)鍵它讓模型對(duì)視頻流逐幀處理而不是一次性加載整段視頻能顯著降低內(nèi)存占用。imgsz640是常見的平衡點(diǎn)尺寸越大精度越高但推理延遲也隨之上升邊緣設(shè)備上建議保持640服務(wù)端有GPU可以嘗試768或更高。3.2 提取目標(biāo)的高度與類別信息YOLO11的返回對(duì)象中核心信息封裝在result.boxes里。手動(dòng)遍歷每個(gè)檢測(cè)框拿到歸一化的坐標(biāo)和類別import cv2 import numpy as np KNOWN_HEIGHTS { 0: 1.7, # person單位米 2: 1.5, # car典型轎車高度 7: 0.6, # truck按小型貨車估算 } results model.predict(sourcecamera_in.mp4, streamTrue, verboseFalse) for result in results: frame result.orig_img.copy() if result.boxes is None: continue for box in result.boxes: cls int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() y_min, y_max int(xyxy[1]), int(xyxy[3]) pixel_height y_max - y_min if cls in KNOWN_HEIGHTS: real_height KNOWN_HEIGHTS[cls] distance (real_height * fx) / pixel_height cv2.rectangle(frame, (int(xyxy[0]), y_min), (int(xyxy[2]), y_max), (0, 255, 0), 2) label fcls{cls} conf{conf:.2f} dist{distance:.2f}m cv2.putText(frame, label, (int(xyxy[0]), y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)這段代碼會(huì)把每個(gè)目標(biāo)的類別、置信度和計(jì)算出的距離實(shí)時(shí)標(biāo)注在對(duì)應(yīng)框上方。實(shí)測(cè)下來在普通筆記本CPU上yolo11n模型配合640輸入分辨率幀率能穩(wěn)定在25FPS以上完全能滿足實(shí)時(shí)預(yù)覽。3.3 為什么不直接用邊界框的寬度很多人問為什么不用邊界框的寬度算距離寬度不是也能反映目標(biāo)大小嗎核心原因是對(duì)于直立的人、車輛這類目標(biāo)檢測(cè)框的高度與目標(biāo)實(shí)際高度之間存在相對(duì)穩(wěn)定的對(duì)應(yīng)關(guān)系受目標(biāo)姿態(tài)變化影響較小。而寬度方向一個(gè)側(cè)身的人和一個(gè)正面的人邊界框?qū)挾炔町悩O大直接算距離誤差會(huì)非常離譜。用高度做換算本質(zhì)上是因?yàn)楦叨认闰?yàn)更穩(wěn)定。3.4 檢測(cè)框抖動(dòng)處理YOLO11單幀檢測(cè)會(huì)受運(yùn)動(dòng)模糊、目標(biāo)姿態(tài)變化、遮擋等因素影響導(dǎo)致檢測(cè)框高度在相鄰幀之間抖動(dòng)進(jìn)而讓測(cè)距結(jié)果忽遠(yuǎn)忽近。處理手段不是改模型而是在后處理環(huán)節(jié)引入平滑算法。我實(shí)測(cè)最有效的是簡(jiǎn)單的一階低通濾波smoothed_distance alpha * current_distance (1 - alpha) * previous_distancealpha取0.3到0.5之間比較合適。太小會(huì)讓反應(yīng)變遲鈍目標(biāo)急停時(shí)距離變化顯示有拖影太又完全濾不掉抖動(dòng)。另外人的行走速度大約在每秒1.2到1.5米可以根據(jù)這個(gè)參考值做目標(biāo)跟蹤時(shí)的速度合理性校驗(yàn)連續(xù)多幀距離跳變超過這個(gè)范圍就可以判定為檢測(cè)異常。4. 距離公式的推導(dǎo)與誤差邊界分析看到這里公式已經(jīng)用起來了但你還是要知道這個(gè)公式到底在算什么誤差從哪里來這樣在結(jié)果異常時(shí)才知道該往哪個(gè)方向排查。4.1 三角形相似的完整推導(dǎo)設(shè)相機(jī)光心為O感光元件平面在焦距f處目標(biāo)頂部與底部分別為A和B對(duì)應(yīng)成像點(diǎn)A和B。則三角形OAB與三角形OAB相似于是AB / AB OA / OA其中AB是目標(biāo)物理高度HAB是成像像素高度h經(jīng)過畸變校正后OA是目標(biāo)到光心的實(shí)際距離D近似為水平距離OA等于焦距f。于是D H × f / h這個(gè)推導(dǎo)成立的前提是目標(biāo)底部與成像平面近似的垂直關(guān)系目標(biāo)必須直立且相機(jī)光軸與地面平行。如果相機(jī)俯仰角度過大底部落點(diǎn)與目標(biāo)實(shí)際垂直腳點(diǎn)發(fā)生偏移公式就會(huì)系統(tǒng)性地偏向某一側(cè)。4.2 誤差來源的定量分析實(shí)際誤差來自三個(gè)主要方面目標(biāo)物理高度先驗(yàn)誤差如果把人高先驗(yàn)設(shè)為1.7米而檢測(cè)對(duì)象實(shí)際身高是1.9米那么求出的距離會(huì)系統(tǒng)性偏大約11.8%。在實(shí)際場(chǎng)景中固定先驗(yàn)值不可避免會(huì)引入誤差這是單目測(cè)距的天然局限。檢測(cè)框像素高度的量化誤差圖像在y方向的分辨率越高相同物理距離對(duì)應(yīng)的像素高度變化越敏感。以1080P視頻為例一個(gè)60米外的人像素高度可能只有幾十像素而此時(shí)檢測(cè)框上下邊緣差1個(gè)像素距離計(jì)算值就會(huì)變化大約2%。非線性的透視失真相機(jī)邊緣區(qū)域畸變顯著即使校正后依然存在殘差。當(dāng)目標(biāo)位于畫面邊緣時(shí)誤差比中心區(qū)域高出很多。實(shí)測(cè)結(jié)論是目標(biāo)靠近畫面中心誤差約5%到8%目標(biāo)移到畫面邊緣誤差可飆升至15%以上。4.3 影響距離計(jì)算精度的核心參數(shù)焦距f對(duì)測(cè)距結(jié)果的影響是線性的。焦距標(biāo)定誤差5%測(cè)距結(jié)果就會(huì)跟著偏差5%。而像素高度h對(duì)測(cè)距結(jié)果的影響是非線性的目標(biāo)越遠(yuǎn)、像素高度越小同樣的檢測(cè)框誤差導(dǎo)致的距離誤差越大。所以在遠(yuǎn)距離場(chǎng)景下提高網(wǎng)絡(luò)輸入分辨率比優(yōu)化標(biāo)定參數(shù)更有性價(jià)比。5. 實(shí)操過程從YOLO11檢測(cè)到距離輸出的完整代碼前面是理論與模塊拆解這里給一套可以直接運(yùn)行的完整實(shí)現(xiàn)。環(huán)境依賴很簡(jiǎn)單主要就是Ultralytics、OpenCV和NumPy。5.1 完整代碼框架import cv2 import numpy as np from collections import deque from ultralytics import YOLO # 焦距通過相機(jī)標(biāo)定獲得這里是示例值 FX 980.0 # 目標(biāo)類別對(duì)應(yīng)的物理高度單位為米 KNOWN_HEIGHTS { 0: 1.7, # person 2: 1.5, # car } # 距離平滑緩存 dist_history deque(maxlen3) def calculate_distance(cls, pixel_height): real_height KNOWN_HEIGHTS.get(cls) if real_height is None: return None return (real_height * FX) / pixel_height def smooth_distance(raw_dist): if abs(raw_dist - dist_history[-1]) 2.0: dist_history.clear() dist_history.append(raw_dist) return float(np.mean(dist_history)) def main(): model YOLO(yolo11n.pt) cap cv2.VideoCapture(0) # 或本地視頻文件路徑 while cap.isOpened(): ret, frame cap.read() if not ret: break # 去畸變處理需要傳入標(biāo)定得到的dist系數(shù) # frame cv2.undistort(frame, mtx, dist) results model.predict(frame, imgsz640, conf0.4, verboseFalse) for result in results: if result.boxes is None: continue for box in result.boxes: cls int(box.cls[0]) conf float(box.conf[0]) x1, y1, x2, y2 box.xyxy[0].tolist() pixel_height y2 - y1 raw_dist calculate_distance(cls, pixel_height) if raw_dist is None: continue final_dist smooth_distance(raw_dist) cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) info f{model.names[cls]} {conf:.2f} D{final_dist:.1f}m cv2.putText(frame, info, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow(YOLO11 Distance, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows() if __name__ __main__: main()5.2 參數(shù)調(diào)整建議conf建議不低于0.3低于這個(gè)值檢測(cè)框抖動(dòng)會(huì)很嚴(yán)重測(cè)距結(jié)果也會(huì)跟著劇烈跳動(dòng)。要識(shí)別小目標(biāo)時(shí)可以適當(dāng)降到0.25但要做好誤差增大的心理準(zhǔn)備。輸入分辨率imgsz設(shè)640時(shí)人體最小可靠檢測(cè)距離約40米超過這個(gè)距離檢測(cè)框本身就開始不穩(wěn)定。需要更遠(yuǎn)測(cè)距時(shí)把輸入分辨率升到1280代價(jià)是推理時(shí)間增加大約2.5倍。距離平滑的deque長度設(shè)為3即可太大會(huì)造成測(cè)距延遲感明顯目標(biāo)快速移動(dòng)時(shí)距離顯示明顯滯后。5.3 部署時(shí)的視頻流接入建議這套系統(tǒng)不只是能處理本地?cái)z像頭實(shí)際項(xiàng)目里更常見的是接入RTSP網(wǎng)絡(luò)攝像頭。只需要把cv2.VideoCapture(0)替換成cv2.VideoCapture(rtsp://your_stream_address)。注意網(wǎng)絡(luò)攝像頭存在斷流重連問題穩(wěn)妥的做法是在主循環(huán)里檢測(cè)cap.isOpened()為False時(shí)自動(dòng)重建連接避免程序跑一會(huì)兒就死掉。6. 常見問題與排查技巧實(shí)錄這段時(shí)間我前后泡在這個(gè)項(xiàng)目里踩了不少坑整理下來大概有五大類基本覆蓋了新手會(huì)遇到的所有問題。6.1 距離數(shù)值不穩(wěn)定前后幀跳動(dòng)劇烈這個(gè)問題最常出現(xiàn)。檢查順序依次是檢測(cè)框是否抖動(dòng)可以加跟蹤或平滑、目標(biāo)是否在畫面邊緣往中心靠、當(dāng)前幀是否出現(xiàn)運(yùn)動(dòng)模糊降低快門或提高幀率。最終手段是加低通濾波把短時(shí)跳變削平。6.2 計(jì)算距離整體偏大或偏小如果誤差方向一致、幅度穩(wěn)定基本是焦距標(biāo)定不準(zhǔn)或者目標(biāo)物理高度先驗(yàn)和實(shí)際不符。排查方法是找一個(gè)已知距離的位置放置標(biāo)定物反推當(dāng)前焦距的實(shí)際有效值然后調(diào)整代碼中的FX常數(shù)。千萬別改檢測(cè)閾值改閾值只會(huì)讓框變多或變少不會(huì)修正系統(tǒng)性距離偏差。6.3 目標(biāo)在畫面邊緣時(shí)距離誤差明顯變大這是畸變未有效校正的典型癥狀。解決方法是確保送入模型前對(duì)每幀執(zhí)行cv2.undistort。實(shí)測(cè)1080P圖像全幀去畸變單幀耗時(shí)約2到3毫秒對(duì)整體幀率影響不大可以放心開啟。6.4 多目標(biāo)場(chǎng)景下距離標(biāo)記串位當(dāng)畫面中有多個(gè)人重疊時(shí)YOLO11可能會(huì)把多個(gè)目標(biāo)合并在一個(gè)框里導(dǎo)致輸出的像素高度比真實(shí)高度大距離就被算近了。這種情況沒有完美的檢測(cè)后處理能拯救較優(yōu)的策略是加載精度更高的模型yolo11m或yolo11l并調(diào)高conf過濾置信度低的重疊框。要對(duì)同一行人做穩(wěn)定測(cè)距建議在檢測(cè)之上再套一層ByteTrack等多目標(biāo)跟蹤讓每個(gè)目標(biāo)的距離信息隨時(shí)間關(guān)聯(lián)起來。6.5 標(biāo)定時(shí)角點(diǎn)檢測(cè)失敗通常是棋盤格圖片邊緣被裁切、光照不均勻?qū)е聦?duì)比度太低或者棋盤格反光嚴(yán)重。解決辦法是保證棋盤格完整出現(xiàn)在畫面中適當(dāng)調(diào)整曝光補(bǔ)償避免強(qiáng)光直射打印紙。另外別用太厚的塑封膜反光會(huì)讓角點(diǎn)響應(yīng)質(zhì)量驟減。7. 進(jìn)階優(yōu)化像素高度修正與參考物等寬法基礎(chǔ)項(xiàng)目跑通之后想讓精度再上一個(gè)臺(tái)階可以考慮下面幾個(gè)優(yōu)化方向改動(dòng)量都不大但收益明顯。7.1 基于檢測(cè)框底邊位置的修正一個(gè)容易被忽略的事實(shí)是當(dāng)目標(biāo)在畫面中的位置不同時(shí)同樣的像素高度對(duì)應(yīng)的物理距離并不相同。嚴(yán)格修正需要用到標(biāo)定得到的旋轉(zhuǎn)矩陣和平移向量將檢測(cè)框底邊中心點(diǎn)的像素坐標(biāo)反投影到地面平面。這個(gè)方法改動(dòng)復(fù)雜一些但在固定相機(jī)場(chǎng)景下能做得很準(zhǔn)。簡(jiǎn)化版做法先離線采集不同畫面位置與實(shí)測(cè)距離的對(duì)應(yīng)關(guān)系擬合一個(gè)修正系數(shù)再乘到原始距離上。這個(gè)方法是我實(shí)測(cè)性價(jià)比最高的精度提升手段。7.2 參考物等寬測(cè)距法當(dāng)目標(biāo)物理高度不可靠或類別太多時(shí)可以換一種思路在場(chǎng)景中放置一個(gè)物理尺寸已知的參考標(biāo)志物用“參考物在畫面里的像素寬度 對(duì)比 目標(biāo)的像素寬度”的比例關(guān)系配合兩者與相機(jī)的三角關(guān)系推導(dǎo)距離。這種方法特別適合固定機(jī)位的施工區(qū)域或停車場(chǎng)入口精度受目標(biāo)姿態(tài)影響較小。7.3 多幀置信度融合對(duì)靜態(tài)或低速目標(biāo)可以收集連續(xù)N幀的距離計(jì)算結(jié)果剔除明顯離群值后取中位數(shù)。這個(gè)方法特別適合閘機(jī)、安防門禁這類目標(biāo)停留時(shí)間長的場(chǎng)景能夠把測(cè)距誤差穩(wěn)在3%以內(nèi)。實(shí)時(shí)性要求高的場(chǎng)景慎用延遲會(huì)疊加。我個(gè)人在實(shí)際項(xiàng)目中的感受是視覺測(cè)距做到最后拼的不是模型多強(qiáng)而是對(duì)誤差來源的理解和對(duì)場(chǎng)景約束的把握。YOLO11負(fù)責(zé)把目標(biāo)穩(wěn)定找出來剩下的精度全靠相機(jī)標(biāo)定、幾何修正和工程細(xì)節(jié)堆出來。這個(gè)項(xiàng)目后續(xù)如果要擴(kuò)展可以考慮往端側(cè)設(shè)備遷移把模型導(dǎo)出為ONNX再轉(zhuǎn)TensorRT或OpenVINO格式在Jetson系列設(shè)備和工業(yè)相機(jī)方案上同樣的邏輯可以跑出接近實(shí)時(shí)的多路測(cè)距能力。踩過幾次坑之后最大的體會(huì)是任何看似高大上的視覺算法落地時(shí)都要回歸到“標(biāo)定準(zhǔn)不準(zhǔn)、先驗(yàn)對(duì)不對(duì)、場(chǎng)景穩(wěn)不穩(wěn)”這三件事上來。