首页 > 编程知识 正文

单目测距和双目测距,单目测距算法

时间:2023-05-04 01:48:38 阅读:275439 作者:904

 

  1. 简介:

/*******************************************************************  本项目是使用单目摄像头实现距离的测量,首先单目摄像头与kinect等深度摄像头最大的区别是无法有效获取深度信息,那就首先从这方面入手,尝试通过图像获取摄像头与人的距离。 在网上看了几天关于摄像头标定和摄像头焦距等原理的文章,然后通过这篇文章真正启发了我:用python和opencv来测量目标到相机的距离 主要的测距的原理是利用相似三角形计算物体到相机的距离。********************************************************************/

 

2. 单目测距原理

/*********************************************************************   我们将使用相似三角形来计算相机到一个已知的物体或者目标的距离。 相似三角形就是这么一回事:假设我们有一个宽度为 W 的目标或者物体。然后我们将这个目标放在距离我们的相机为 D 的位置。我们用相机对物体进行拍照并且测量物体的像素宽度 P 。这样我们就得出了相机焦距的公式:F = (P x D) / W举个例子,假设我在离相机距离 D = 24 英寸的地方放一张标准的 8.5 x 11 英寸 A4 纸(横着放;W = 11)并且拍下一张照片。我测量出照片中 A4 纸的像素宽度为 P = 249 像素。因此我的焦距 F 是:F = (248px x 24in) / 11in = 543.45当我继续将我的相机移动靠近或者离远物体或者目标时,我可以用相似三角形来计算出物体离相机的距离:D’ = (W x F) / P从以上的解释中,我们可以看到,要想得到距离,我们就要知道摄像头的焦距和目标物体的大小,这两个已知条件根据公式:D’ = (W x F) / P 得出目标到摄像机的距离D,其中P是指像素距离,W是A4纸的宽度,F是摄像机焦距。********************************************************************/

3.单目测距Python代码(带注释) import numpy as npimport cv2 # 找到目标函数def find_marker(image): # convert the image to grayscale, blur it, and detect edges #将图像转换成灰度、模糊和检测边缘 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) edged = cv2.Canny(gray, 35, 125) # find the contours in the edged image and keep the largest one; #在边缘图像中找到轮廓并保持最大的轮廓 # we'll assume that this is our piece of paper in the image #我们假设这是我们在图像中的一张纸 (_, cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 求最大面积 c = max(cnts, key = cv2.contourArea) # compute the bounding box of the of the paper region and return it #计算纸张区域的边界框并返回它 # cv2.minAreaRect() c代表点集,返回rect[0]是最小外接矩形中心点坐标, # rect[1][0]是width,rect[1][1]是height,rect[2]是角度 return cv2.minAreaRect(c) # 距离计算函数 def distance_to_camera(knownWidth, focalLength, perWidth): # compute and return the distance from the maker to the camera #计算并返回从目标到相机的距离 return (knownWidth * focalLength) / perWidth # initialize the known distance from the camera to the object, which# in this case is 24 inches#初始化已知距离从相机到对象,在这种情况下是24英寸KNOWN_DISTANCE = 24.0 # initialize the known object width, which in this case, the piece of# paper is 11 inches wide#初始化已知的物体宽度,在这种情况下,纸是11英寸宽。# A4纸的长和宽(单位:inches)KNOWN_WIDTH = 11.69KNOWN_HEIGHT = 8.27 # initialize the list of images that we'll be using#初始化我们将要使用的图像列表IMAGE_PATHS = ["Picture1.jpg", "Picture2.jpg", "Picture3.jpg"] # load the furst image that contains an object that is KNOWN TO BE 2 feet# from our camera, then find the paper marker in the image, and initialize# the focal length#加载包含一个距离我们相机2英尺的物体的第一张图像,然后找到图像中的纸张标记,并初始化焦距#读入第一张图,通过已知距离计算相机焦距image = cv2.imread("E:\lena.jpg") #应使用摄像头拍的图marker = find_marker(image) focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH # D’ = (W x F) / P #通过摄像头标定获取的像素焦距#focalLength = 811.82print('focalLength = ',focalLength) #打开摄像头camera = cv2.VideoCapture(0) while camera.isOpened(): # get a frame (grabbed, frame) = camera.read() marker = find_marker(frame) if marker == 0: print(marker) continue inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0]) # draw a bounding box around the image and display it #在图像周围绘制一个边界框并显示它 box = cv2.boxPoints(marker) box = np.int0(box) cv2.drawContours(frame, [box], -1, (0, 255, 0), 2) # inches 转换为 cm cv2.putText(frame, "%.2fcm" % (inches *30.48/ 12), (frame.shape[1] - 200, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 2.0, (0, 255, 0), 3) # show a frame cv2.imshow("capture", frame) if cv2.waitKey(1) & 0xFF == ord('q'): breakcamera.release()cv2.destroyAllWindows()

4.单目测距Python代码(纯代码)

import numpy as npimport cv2 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) c = max(cnts, key = cv2.contourArea) return cv2.minAreaRect(c) def distance_to_camera(knownWidth, focalLength, perWidth): return (knownWidth * focalLength) / perWidth KNOWN_DISTANCE = 24.0 KNOWN_WIDTH = 11.69KNOWN_HEIGHT = 8.27IMAGE_PATHS = ["Picture1.jpg", "Picture2.jpg", "Picture3.jpg"] image = cv2.imread("E:\lena.jpg") marker = find_marker(image) focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH print('focalLength = ',focalLength)camera = cv2.VideoCapture(0) while camera.isOpened(): (grabbed, frame) = camera.read() marker = find_marker(frame) if marker == 0: print(marker) continue inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0]) box = cv2.boxPoints(marker) box = np.int0(box) cv2.drawContours(frame, [box], -1, (0, 255, 0), 2) cv2.putText(frame, "%.2fcm" % (inches *30.48/ 12), (frame.shape[1] - 200, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 2.0, (0, 255, 0), 3) cv2.imshow("capture", frame) if cv2.waitKey(1) & 0xFF == ord('q'): breakcamera.release()cv2.destroyAllWindows()

 

5.单目测距Python代码运行结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。