<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          (附代碼)干貨 | 攝像頭單目測距原理及實現(xiàn)

          共 3658字,需瀏覽 8分鐘

           ·

          2021-08-07 17:31

          點擊左上方藍(lán)字關(guān)注我們



          一個專注于目標(biāo)檢測與深度學(xué)習(xí)知識分享的公眾號

          編者薦語
          單目測距的核心是使用相似三角形來計算相機(jī)到一個已知的物體或者目標(biāo)的距離。即:假設(shè)我們有一個寬度為 W 的目標(biāo)或者物體。然后我們將這個目標(biāo)放在距離我們的相機(jī)為 D 的位置。我們用相機(jī)對物體進(jìn)行拍照并且測量物體的像素寬度 P 。這樣我們就得出了相機(jī)焦距的公式:F = (P x D) / W,然后我們便可以使用此公式進(jìn)行計算了。但在實際的情況下,還需要考慮各種其他的因素。

          作者 | 吳建明wujianming@知乎

          鏈接 | https://zhuanlan.zhihu.com/p/137943238


          一.測距原理

          空間的深度或距離等數(shù)據(jù)的攝像頭。

          人的眼睛長在頭部的前方,兩只眼的視野范圍重疊,兩眼同時看某一物體時,產(chǎn)生的視覺稱為雙眼視覺。

          雙眼視覺的優(yōu)點是可以彌補(bǔ)單眼視野中的盲區(qū)缺損,擴(kuò)大視野,并產(chǎn)生立體視覺。

          也就是說,假如只有一只眼睛,失去立體視覺后,人判斷距離的能力將會下降。

          這也就是單目失明的人不能考取駕照的原因。



          單純的單目視覺測距,必須已知一個確定的長度。

          f為攝像頭的焦距,c為鏡頭光心。物體發(fā)出的光經(jīng)過相機(jī)的光心,然后成像于圖像傳感器或者也可以說是像平面上,如果設(shè)物體所在平面與相機(jī)平面的距離為d,物體實際高度為H,在傳感器上的高度為h,H一定要是已知的,我們才能求得距離d。

          假設(shè)我們有一個寬度為 W 的目標(biāo)或者物體。然后我們將這個目標(biāo)放在距離我們的相機(jī)為 D 的位置。我們用相機(jī)對物體進(jìn)行拍照并且測量物體的像素寬度 P 。這樣我們就得出了相機(jī)焦距的公式:

          F = (P x D) / W

          例如,假設(shè)現(xiàn)在我們有一張A4紙(8.27in x 11.69in), in代表英寸,1in = 25.4mm。紙張寬度W=11.69in,相機(jī)距離紙張的距離D = 32in,此時拍下的照片中A4紙的像素寬度為P=192px(我的相機(jī)實際測量得到的值)。
          此時我們可以算出焦距F=(192x30)/11.69。
          當(dāng)我們將攝像頭遠(yuǎn)離或者靠近A4紙時,就可以用相似三角形得到相機(jī)距離物體的距離。
          此時的距離:D’ = (W’ x F ) / P’。
          (注意:這里測量的距離是相機(jī)到物體的垂直距離,產(chǎn)生夾角,測量的結(jié)果就不準(zhǔn)確了。)

          二.測距步驟

          1. 使用攝像機(jī)采集道路前方的圖像;

          2. 在道路區(qū)域?qū)ξ矬w進(jìn)行檢測,通過矩形框?qū)⑽矬w形狀框出來。

          3. 結(jié)合矩形框信息,找到該矩形框底邊的兩個像平面坐標(biāo),分別記為(u1,v1)和(u2,v2);

          4. 使用幾何關(guān)系推導(dǎo)法,由像平面坐標(biāo)點(u1, v1)、(u2, v2)推導(dǎo)出道路平面坐標(biāo)(x1,y1)、(x2, y2);(投影到地面上,z軸為0)

          5. 通過歐氏距離公式計算出d。

          三.難點整理:

          1.圖像畸變矯正模型的理解;

          (標(biāo)定參數(shù),內(nèi)參矩陣,畸變矩陣,外參矩陣(平移、旋轉(zhuǎn)向量矩陣))

          2.像素坐標(biāo)與世界坐標(biāo)公式的推導(dǎo)及驗證;

          3.測距方法,對于檢測物體在攝像頭前方、左側(cè)、右側(cè)的判別思路;

          4.弄清反畸變;對于畸變矯正后的圖像中的檢測框中的點進(jìn)行反畸變處理。

          四.相機(jī)鏡頭畸變矯正-->得到相機(jī)的內(nèi)外參數(shù)、畸變參數(shù)矩陣

          1. 外參數(shù)矩陣。世界坐標(biāo)經(jīng)過旋轉(zhuǎn)和平移,然后落到另一個現(xiàn)實世界點(攝像機(jī)坐標(biāo))上。

          2. 內(nèi)參數(shù)矩陣。告訴你上述那個點在1的基礎(chǔ)上,是如何繼續(xù)經(jīng)過攝像機(jī)的鏡頭、并通過針孔成像和電子轉(zhuǎn)化而成為像素點的。

          3. 畸變矩陣。告訴你為什么上面那個像素點并沒有落在理論計算該落在的位置上,還產(chǎn)生了一定的偏移和變形.

          五.實現(xiàn)代碼

          #!/usr/bin/python3# -*- coding: utf-8 -*-# Date: 18-10-29import numpy as np # 導(dǎo)入numpy庫import cv2 # 導(dǎo)入Opencv庫KNOWN_DISTANCE = 32 # 這個距離自己實際測量一下KNOWN_WIDTH = 11.69 # A4紙的寬度KNOWN_HEIGHT = 8.27IMAGE_PATHS = ["Picture1.jpg", "Picture2.jpg", "Picture3.jpg"] # 將用到的圖片放到了一個列表中# 定義目標(biāo)函數(shù)def find_marker(image):gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 將彩色圖轉(zhuǎn)化為灰度圖gray_img = cv2.GaussianBlur(gray_img, (5, 5), 0) # 高斯平滑去噪edged_img = cv2.Canny(gray_img, 35, 125) # Canny算子閾值化cv2.imshow("降噪效果圖", edged_img) # 顯示降噪后的圖片# 獲取紙張的輪廓數(shù)據(jù)img, countours, hierarchy = cv2.findContours(edged_img.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# print(len(countours))c = max(countours, key=cv2.contourArea) # 獲取最大面積對應(yīng)的點集rect = cv2.minAreaRect(c) # 最小外接矩形return rect# 定義距離函數(shù)def distance_to_camera(knownWidth, focalLength, perWidth):return (knownWidth * focalLength) / perWidth# 計算攝像頭的焦距(內(nèi)參)def calculate_focalDistance(img_path):first_image = cv2.imread(img_path) # 這里根據(jù)準(zhǔn)備的第一張圖片,計算焦距# cv2.imshow('first image', first_image)marker = find_marker(first_image) # 獲取矩形的中心點坐標(biāo),長度,寬度和旋轉(zhuǎn)角度focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH # 獲取攝像頭的焦距# print(marker[1][0])print('焦距(focalLength) = ', focalLength) # 打印焦距的值return focalLength# 計算攝像頭到物體的距離def calculate_Distance(image_path, focalLength_value):image = cv2.imread(image_path)# cv2.imshow("原圖", image)marker = find_marker(image) # 獲取矩形的中心點坐標(biāo),長度,寬度和旋轉(zhuǎn)角度, marke[1][0]代表寬度distance_inches = distance_to_camera(KNOWN_WIDTH, focalLength_value, marker[1][0])box = cv2.boxPoints(marker)# print("Box = ", box)box = np.int0(box)print("Box = ", box)cv2.drawContours(image, [box], -1, (0, 255, 0), 2) # 繪制物體輪廓cv2.putText(image, "%.2fcm" % (distance_inches * 2.54), (image.shape[1] - 300, image.shape[0] - 20),cv2.FONT_HERSHEY_SIMPLEX, 2.0, (0, 255, 0), 3)cv2.imshow("單目測距", image)if __name__ == "__main__":img_path = "Picture1.jpg"focalLength = calculate_focalDistance(img_path)for image_path in IMAGE_PATHS:calculate_Distance(image_path, focalLength)cv2.waitKey(0)cv2.destroyAllWindows()



          END



          雙一流大學(xué)研究生團(tuán)隊創(chuàng)建,專注于目標(biāo)檢測與深度學(xué)習(xí),希望可以將分享變成一種習(xí)慣!

          整理不易,點贊三連↓

          瀏覽 255
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰自拍 | 五月丁香网站 | 亚洲AV无码精品国产 | 国产午夜福利免费视频在线观看 | 996re热精品视频 |