使用Python,OpenCV检测摄像机到标记对象的距离
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV检测摄像机到标记对象的距离
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV檢測攝像機到標記對象的距離
- 1. 效果圖
- 2. 三角形相似性是什么?
- 3. 三角形相似性檢測距離原理
- 4. 使用Python,OpenCV檢測標記對象
- 5. 源碼
- 參考
這篇博客將介紹如何確定圖像中已知物體到相機的距離, 確定從相機到標記物體的距離是計算機視覺/圖像處理領域中一個非常好的研究課題。有倆種實現方式:
- 使用非常簡單明了的技術——三角形相似性;
- 使用相機模型的固有參數,雖然復雜但更準確;
本文將介紹第一種方法。
1. 效果圖
測距效果圖1
邊緣檢測圖
測距效果圖2
效果圖3:
2. 三角形相似性是什么?
三角形相似性是假設我們有一個標記或對象,寬度稱為W 。然后,我們將此標記放置在距相機一定距離D處。我們使用相機拍攝物體的圖片,然后以像素P為單位測量其寬度。這使我們能夠得出攝像機的可感知焦距F:
F =(P x D)/ W
當繼續將相機移近或遠離物體/標記時,可以應用三角形相似度來確定物體到相機的距離:
D’=(寬x F)/ P
3. 三角形相似性檢測距離原理
原理是參照物
利用三角形相似度,需要在應用算法之前了解兩個重要參數:
- 用作標記的對象在某種距離度量(例如英寸或米)中的寬度(或高度)。
- 相機攝像頭到標記對象的距離(以英寸或米為單位)。
- 使用計算機視覺和圖像處理算法來自動確定對象的感知寬度/高度(以像素為單位),并完成三角形相似度并為我們提供焦距。
- 在后續圖像中,找到其余的標記/對象??并利用計算出的焦距來確定距相機到對象的距離。
4. 使用Python,OpenCV檢測標記對象
- 轉換灰度圖
- 高斯模糊消除高頻噪音
- 尋找邊緣
- 檢測輪廓,根據原始圖像的特征保留相應的標記
在圖像中找到標記的其他替代方法是利用顏色,假使標記的顏色與圖像中其余場景的顏色不同。您還可以應用諸如關鍵點檢測,局部不變描述符和關鍵點匹配之類的方法來查找標記。
5. 源碼
# 使用Pthon,OpenCV檢測標記對象到攝像頭的距離
# USAGE
# python distance_to_camera.py# 導入必要的包
from imutils import paths
import numpy as np
import imutils
import cv2# 函數接受單個參數,image:源輸入圖像
# 查找我們要計算距離的對象
def find_marker(image):# 轉換為灰度圖,高斯模糊,檢測邊緣# 高斯模糊以消除高頻噪聲gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(gray, 35, 125)# 從邊緣圖像中檢測輪廓,并保留最大的輪廓# 假設最大輪廓是我們的紙cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)c = max(cnts, key = cv2.contourArea)# 返回紙區域的最小面積輪廓return cv2.minAreaRect(c)# 使用三角形相似度計算距離
# knownWidth 已知寬度
# focalLength 標記寬度
# perWidth 感知寬度
def distance_to_camera(knownWidth, focalLength, perWidth):# 計算并返回到攝像機的距離return (knownWidth * focalLength) / perWidth# 找到與圖像中的對象或標記的距離的第一步是校準和計算焦距。為此,我們需要知道:
# 初始化已知物體到攝像頭的距離
KNOWN_DISTANCE = 24.0# 初始化已知物體的寬度
KNOWN_WIDTH = 11.0# 進行簡單的校準
# 加載圖像,尋找到紙的輪廓,計算感知焦距
image = cv2.imread("images/2ft.png")
marker = find_marker(image)
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH# 有了感知焦距,可以很容易地計算出相機到后續圖像中標記的距離。
# 遍歷圖像
for imagePath in sorted(paths.list_images("images")):# 加載圖像,尋找圖像中的標記,計算標記到攝像頭的距離image = cv2.imread(imagePath)marker = find_marker(image)inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])# 繪制邊界框并展示在圖像上,同時顯示距離box = cv2.cv.BoxPoints(marker) if imutils.is_cv2() else cv2.boxPoints(marker)box = np.int0(box)cv2.drawContours(image, [box], -1, (0, 255, 0), 2)cv2.putText(image, "%.2fft" % (inches / 12),(image.shape[1] - 200, image.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,2.0, (0, 255, 0), 3)cv2.imshow("image", image)cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2015/01/19/find-distance-camera-objectmarker-using-python-opencv/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV检测摄像机到标记对象的距离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拖鞋多少钱啊?
- 下一篇: python install sciki