注意:當我給這次例子拍照時, 我的卷尺有一點松, 因此結果造成了大約 1 英寸的誤差。 還有我也是很快速地拍下了照片並且沒有完全對齊卷尺上的腳標, 這也會對最終結果的 1 英寸誤差產生影響。 綜上所述, 相似三角形的方法還是合理的, 你也可以用這個方法很簡單地計算出物體或者目標距離你的相機的距離。
第一件要做的事情就是導入必要的包。 我們將用 NumPy 來進行數值計算和 cv2 來綁定 OpenCV 。
在那之後我們定義 find_marker 函數。 這個函數接收一個 image 參數, 並且這意味著我們將用它來找出將要計算距離的物體。
在這個例子中我們使用標準的 8.5 x 11 英寸的 A4 紙作為我們的目標。
目前我們的第一個任務是找出圖像中的這張紙。
我們先將圖像轉成灰度圖, 用高斯模糊除去明顯的噪點, 並且在第 7-9 行 使用邊緣檢測。
完成這幾步後, 我們的圖像應該長這樣:
找到圖像中目標的距離的第一步是標定和計算焦距。我們需要知道以下參數:
相機到物體的距離
這個物體的寬度(單位英尺或米)。注意:也可以用高度,這個例子中我們使用寬度。
這裡不得不提示一下我們所做的並不是實質意義上的攝像機標定。真正的攝像機標定包括攝像機的內參,你可以從這裡獲得更多相關知識。
在第 25 行 我們初始化了已知的 KNOWN_DISTANCE ,從相機到物體的距離為 24 英寸。在第 29 行 我們初始了物體的寬度 KNOWN_WIDTH 為 11 英寸(一張橫著放的標準 A4 紙)。
然後我們在第 32 行 定義要用到的圖片的路徑。
下一步比較重要:是一個簡單的標定。
第 37 行 從硬碟讀取第一張圖,——我們將用這張圖來作為標定圖片。
圖片載入以後,在第 38 行 計算圖中 A4 紙的輪廓資訊,在第 39 行 使用三角形相似法計算出 focalLength。
由於我們已經“標定”了我們的系統並且獲得了 focalLength ,我們可以很容易地計算出相機離接下來圖片中目標的距離。
讓我們看看這個是這麼做的:
在第 42 行 開始遍歷所有的圖片路徑。
然後,在第 45 行 我們將清單中所有的圖片從硬碟讀取下來。在第 46 行 提取目標輪廓,並且在第 47 行 計算攝像機到物體的距離。
在第 50-56 行,我們簡單地畫出目標的邊框並且顯示出距離。
結果
來看看我們的腳本運作,打開一個終端,導航到你的代碼目錄,執行以下命令:
$python distance_to_camera.py
如果一切正常你將會看到 2ft.png 的結果,這張圖是用來“標定”我們的系統並且計算初始的 focalLength:
從上面的圖片我們可以看到我們的焦距被正確地計算出來並且按照代碼中的變數 KNOWN_DISTANCE 和 KNOWN_WIDTH,A4 紙的距離是 2 英尺。
現在我們有了焦距,我們可以在接下來的圖片中計算出目標的距離:
上上面的例子,我們的相機大概離目標有 3 英尺遠。
讓我們退後一步:
再次需要注意的是,我在拍這個例子的時候動作很快並且卷尺並沒有繃緊。而且,我也沒有確保我的相機是百分之百地對準目標底部,因此,這些例子總會有大概 1 英寸的誤差。
以上是我要說的,這篇文章描述的三角形相似法仍然可以用,並且能夠讓你測量出圖像上的物體或目標到你相機的距離。
總結
在這篇博客我們學習了如何計算一個圖像上的已知物體到相機的距離。
為了完成這個任務我們利用了三角形相似法,並且需要知道兩個重要的參數:
1、 目標的實際寬度(或高度),單位可以是英寸或者米。
2、 標定過程 1 中相機到目標的距離。
電腦視覺和影像處理演算法可以被用來自動檢測圖像中物體的圖元寬度或高度並且完成相似三角形的計算,得出一個焦距。
然後在接下來的圖片中,我們只要提取出目標輪廓就可以利用得到的焦距測量出目標到相機的距離。
謝謝閱讀哦!
找到圖像中目標的距離的第一步是標定和計算焦距。我們需要知道以下參數:
相機到物體的距離
這個物體的寬度(單位英尺或米)。注意:也可以用高度,這個例子中我們使用寬度。
這裡不得不提示一下我們所做的並不是實質意義上的攝像機標定。真正的攝像機標定包括攝像機的內參,你可以從這裡獲得更多相關知識。
在第 25 行 我們初始化了已知的 KNOWN_DISTANCE ,從相機到物體的距離為 24 英寸。在第 29 行 我們初始了物體的寬度 KNOWN_WIDTH 為 11 英寸(一張橫著放的標準 A4 紙)。
然後我們在第 32 行 定義要用到的圖片的路徑。
下一步比較重要:是一個簡單的標定。
第 37 行 從硬碟讀取第一張圖,——我們將用這張圖來作為標定圖片。
圖片載入以後,在第 38 行 計算圖中 A4 紙的輪廓資訊,在第 39 行 使用三角形相似法計算出 focalLength。
由於我們已經“標定”了我們的系統並且獲得了 focalLength ,我們可以很容易地計算出相機離接下來圖片中目標的距離。
讓我們看看這個是這麼做的:
在第 42 行 開始遍歷所有的圖片路徑。
然後,在第 45 行 我們將清單中所有的圖片從硬碟讀取下來。在第 46 行 提取目標輪廓,並且在第 47 行 計算攝像機到物體的距離。
在第 50-56 行,我們簡單地畫出目標的邊框並且顯示出距離。
結果
來看看我們的腳本運作,打開一個終端,導航到你的代碼目錄,執行以下命令:
$python distance_to_camera.py
如果一切正常你將會看到 2ft.png 的結果,這張圖是用來“標定”我們的系統並且計算初始的 focalLength:
從上面的圖片我們可以看到我們的焦距被正確地計算出來並且按照代碼中的變數 KNOWN_DISTANCE 和 KNOWN_WIDTH,A4 紙的距離是 2 英尺。
現在我們有了焦距,我們可以在接下來的圖片中計算出目標的距離:
上上面的例子,我們的相機大概離目標有 3 英尺遠。
讓我們退後一步:
再次需要注意的是,我在拍這個例子的時候動作很快並且卷尺並沒有繃緊。而且,我也沒有確保我的相機是百分之百地對準目標底部,因此,這些例子總會有大概 1 英寸的誤差。
以上是我要說的,這篇文章描述的三角形相似法仍然可以用,並且能夠讓你測量出圖像上的物體或目標到你相機的距離。
總結
在這篇博客我們學習了如何計算一個圖像上的已知物體到相機的距離。
為了完成這個任務我們利用了三角形相似法,並且需要知道兩個重要的參數:
1、 目標的實際寬度(或高度),單位可以是英寸或者米。
2、 標定過程 1 中相機到目標的距離。
電腦視覺和影像處理演算法可以被用來自動檢測圖像中物體的圖元寬度或高度並且完成相似三角形的計算,得出一個焦距。
然後在接下來的圖片中,我們只要提取出目標輪廓就可以利用得到的焦距測量出目標到相機的距離。
謝謝閱讀哦!