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