基于opencv的双目测距(python3单目测距)

一、写在前面的话

基于python3和opencv的单目测距

刚刚接触Opencv没多久,为了检验自己最近学习的内容,准备做一下单目视觉测距。网上有很多关于单目测距的文章,我这里主要借鉴的是和两篇文章,在这里特别作出说明。 工作环境:Ubuntu16.04 + Opencv3.4.0 + Pycharm 摄像头:本着一切从简的原则(好吧就是穷),选用了一款物美价廉的摄像头PS3专用PlayStation Eye, 只要27.5人民币。(这里贴一下,不是打广告,大家完全可以采用其他的摄像头或者工业相机。)

二、单目测距原理

单目相机测距常用或者说实用的方法就是相似三角形法,为了让大家更好地理解程序,这里简单说一下相似三角形法。

基于python3和opencv的单目测距

举个栗子,假设现在我们有一张A4纸(8.27in x 11.69in), in代表英寸,1in = 25.4mm。纸张宽度W=11.69in,相机距离纸张的距离D = 32in,此时拍下的照片中A4纸的像素宽度为P=192px(我的相机实际测量得到的值)。 此时我们可以算出焦距F=(192×30)/11.69。 当我们将摄像头远离或者靠近A4纸时,就可以用相似三角形得到相机距离物体的距离。 此时的距离: D’ = (W’ x F ) / P’ (注意:这里测量的距离是相机到物体的垂直距离,产生夹角,测量的结果就不准确了。)

三、实现代码

#!/usr/bin/python3# -*- coding: utf-8 -*-# Date: 19-10-29import numpy as np # 导入numpy库import cv2 # 导入Opencv库KNOWN_DISTANCE = 32 # 这个距离自己实际测量一下KNOWN_WIDTH = 11.69 # A4纸的宽度KNOWN_HEIGHT = 8.27IMAGE_PATHS = ["Picture1.jpg", "Picture2.jpg", "Picture3.jpg"] # 将用到的图片放到了一个列表中# 定义目标函数def find_marker(image): gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将彩色图转化为灰度图 gray_img = cv2.GaussianBlur(gray_img, (5, 5), 0) # 高斯平滑去噪 edged_img = cv2.Canny(gray_img, 35, 125) # Canny算子阈值化 cv2.imshow("降噪效果图", edged_img) # 显示降噪后的图片 # 获取纸张的轮廓数据 img, countours, hierarchy = cv2.findContours(edged_img.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # print(len(countours)) c = max(countours, key=cv2.contourArea) # 获取最大面积对应的点集 rect = cv2.minAreaRect(c) # 最小外接矩形 return rect# 定义距离函数def distance_to_camera(knownWidth, focalLength, perWidth): return (knownWidth * focalLength) / perWidth# 计算摄像头的焦距(内参)def calculate_focalDistance(img_path): first_image = cv2.imread(img_path) # 这里根据准备的第一张图片,计算焦距 # cv2.imshow('first image', first_image) marker = find_marker(first_image) # 获取矩形的中心点坐标,长度,宽度和旋转角度 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) # 获取矩形的中心点坐标,长度,宽度和旋转角度, 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()

四、运行结果

第一张照片:

基于python3和opencv的单目测距

第二张照片:

基于python3和opencv的单目测距

第三张照片:

基于python3和opencv的单目测距

(0)
上一篇 2023年2月8日 上午9:57
下一篇 2023年2月8日 上午10:02

相关推荐

  • 梦幻西游五开每周必做任务

    五开刷任务在大家看来是比较赚钱的,但作为以赚钱为目的的玩游戏,我们在学会赚钱之前首先需要学会如何省钱。相对单开玩家来说,五开玩家的投入可能需要多好几倍,无论是时间还是金钱的投入都要…

    2023年1月2日
    0
  • pdf文件不能打印显示发送传真

    不知道大家会不会偶尔处理一些 PDF 文件,但又不会经常用到它,因此就不会安装相关的软件了,就算是之前因为某些原因安装过,后面过一段时间也会把它卸载了;当然这些都是正常的,因为作者…

    2023年4月11日
    0
  • 黄豆芽变绿了还能吃吗

    黄豆芽是一种常见的蔬菜,富含蛋白质、钙、磷等多种营养成分,是人们喜爱的健康食品。但是,有时候我们会发现黄豆芽变绿了,这时候是否还能吃呢? 首先,黄豆芽变绿是因为叶绿素的存在,这是一…

    生活百科 2023年7月25日
    0
  • 全球橄榄油品牌排行榜

    世界橄榄油十大名牌排行榜 一、品利 在橄榄油品牌排行榜中,品利是西班牙著名的食品企业,于1942年所成立,多年来专注于橄榄油的研发,还被西班牙的心脏协会作为首推产品,被誉为是橄榄油…

    生活百科 2023年3月18日
    0
  • 怎么样画好看的五官,画五官幼儿简笔画

    对于一些新手来说,可能话人物的脸非常的困难,那是因为没有掌握一定技巧的缘故。 第一步:画脸型的大概轮廓 首先,我们先画一个正圆,标出互相垂直的直径。纵线延长至圆外少许(不到半径的长…

    2023年5月25日
    0
  • 淘宝交的保证金在哪里可以查看(淘宝1000保证金怎么退回支付宝)

    很多交了淘宝保证金的淘宝卖家,觉得淘宝保证金没有用,下面就对淘宝卖家比较关心的淘宝保证金在哪里交以及淘宝保证金怎么退回问题做一个解答。 淘宝保证金有什么用 第一、消保对买家来说,是…

    2023年6月7日
    0
  • 老爷与外孙的关系称之为什么

    #头条创作挑战赛# 原创: 我是山东济宁人,也可称为鲁南人。现介绍我们当地对″爷""老爷"″外姥爷""爷俩"″爷们儿&#…

    2023年4月15日
    0
  • 全国勘察设计注册工程师公共基础考试用书(第2册)书籍

    25.在热学中经常用L作为体积的单位: 筑道答案:(C) 26.两容器内分别盛有氢气和氦气,若它们的温度和质量分别相等,则: A.两种气体分子的平均平动动能相等 B.两种气体分子的…

    2023年4月8日
    0
  • 网上订房不是本人可以入住吗

    在现代社会,越来越多的人开始使用互联网来预订旅行和住宿。但是,很多人都有一个相同的疑惑:网上订房不是本人可以入住吗? 首先,我们需要了解酒店的入住政策。大多数酒店都有自己的规定,需…

    生活百科 2023年7月4日
    0
  • 七月半中元节习俗禁忌你知道多少

    @头号周刊 导语 农历七月十五中元节,老祖宗留下的“10大禁忌”,看看有没有道理 老话说:“七月十五是鬼节,安全禁忌要牢记”。在民间,农历七月被称为“鬼月”,而七月十五则被称为“鬼…

    2023年1月11日
    0

发表评论

登录后才能评论