1、原理

可以推出不同物体的高度比可以通过如下公式得到:

 是左边指定物体的高度(图片中尺寸)

 是右边指定物体的高度(图片中尺寸)

 是左边指定物体的平均视差值

 是右边指定物体的平均视差值

2、代码逻辑框图

3、代码详解

import multiprocessing as mp
import numpy as np
import cv2
import time#读取图像
img5_L = cv2.imread('relative_height/3_a.jpg')
img5_R = cv2.imread('relative_height/3_b.jpg')
img_L=img5_L
img_R=img5_R#功能:获取视差图
#输入:两张图片
#输出:视差图
def disparity(img_L,img_R):stereo = cv2.StereoSGBM_create(numDisparities=48,blockSize=3)disparity = stereo.compute(img_L, img_R)return disparityrect_L = (310,36,521,759) #起点x,y, 增加至为w,h
rect_R = (835,70,590,941)#功能:截图
#输入:图片,截图范围
#输出:截图
def segment(img,rect):mask = np.zeros(img.shape[:2],np.uint8)bgdModel = np.zeros((1,65),np.float64)fgdModel = np.zeros((1,65),np.float64)cv2.grabCut(img,mask,rect,bgdModel,fgdModel,20,cv2.GC_INIT_WITH_RECT)mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')img = img*mask2[:,:,np.newaxis]return img#功能:构建高斯核sieze和sigma
#输入:size,sigma
#输出:二维数组
def gaussian_kernel_2d(kernel_size, sigma):kx = cv2.getGaussianKernel(kernel_size, sigma)ky = cv2.getGaussianKernel(kernel_size, sigma)return np.dot(kx, np.transpose(ky))#功能:彩色图转成灰色图
#输入:彩色图img
#输出:灰色图gray_img
def color_to_gray(img):height = img.shape[0]width = img.shape[1]channels = img.shape[2]value = [0] * 3gray_img = np.zeros([height, width], np.uint8)for row in range(height):for column in range(width):for chan in range(channels):value[chan] = img[row, column, chan]R = value[2]G = value[1]B = value[0]# new_value = 0.2989 * R + 0.5870 * G + 0.1140 * Bnew_value = 0.2989 * R + 0.5870 * G + 0.1140 * B  # 转为灰度像素gray_img[row, column] = new_valuereturn gray_img#功能:获取截图的高度(像素之差)
#输入:img
#输出:高度
def object_height(img):point1=(0,0)point2 = (0, 0)height1=0height2=0for row in range(len(img)):for col in range(len(img[row])):if img[row][col] != 0:height1=rowpoint1=(row,col)breakfor row in range(len(img)-1,-1,-1):for col in range(len(img[row])):if img[row][col] != 0:height2=rowpoint2 = (row, col)breakheight=abs(height2-height1)return point1,point2,height# 功能:求平均视差值
# 输入:抠图img,视差图disparity
# 输出:平均视差值
def average_disparity_value(img,disparity):n=0value=0for row in range(len(img)):for col in range(len(img[row])):if img[row][col] != 0:n +=1value+=disparity[row][col]return value/n#功能:估计图片不同物体的实际高度比
#输入:图片img_L和img_R
#输出:图片中不同物体的实际高度比
def height_ratio(img_L,img_R):t_start = time.clock()print('compute disparity....')disparity1=disparity(img_L,img_R)disparity1 = cv2.filter2D(disparity1, -1, gaussian_kernel_2d(16, 60))print('object segment...')pool = mp.Pool(processes=mp.cpu_count() - 1) #并行处理设置res1=pool.apply_async(segment,(img_L, rect_L))#并行处理seg_L=res1.get()res2=pool.apply_async(segment, (img_R, rect_R))#并行处理seg_R = res2.get()print('color_to_gray...')seg_L=color_to_gray(seg_L)seg_R = color_to_gray(seg_R)print('computer object height...')point1_L,point2_L,height_L=object_height(seg_L)point1_R, point2_R, height_R = object_height(seg_R)d_L=average_disparity_value(seg_L, disparity1)d_R = average_disparity_value(seg_R, disparity1)t_end = time.clock()print('数据处理用时', t_end - t_start)ratio= height_L*d_R/(height_R*d_L)return ratioif __name__ == '__main__':hei_ratio5=height_ratio(img_L,img_R)print(hei_ratio5)

(Python代码)通过视差图获取图片中不同物体的高度比相关推荐

  1. python代码根据当前时间获取下一周的日期

    python代码根据当前时间获取下一周的日期 #使用python代码根据当前日期计算下一周的日期范围 import datetime,calendar import pandas as pddef g ...

  2. 50行Python代码,教你获取公众号全部文章

    点击"小詹学Python",选择"置顶或者星标" 第一时间收到精彩推送! 小詹说:我们平时阅读公众号的文章会遇到一个问题--阅读历史文章体验不好.的确如此,小詹 ...

  3. python实现50行代码_50行Python代码,教你获取公众号全部文章

    > 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自 ...

  4. python实现p图软件_10行Python代码实现美图秀秀

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  5. 4行Python代码打败美图秀秀

    我们平时使用一些图像处理软件时,经常会看到其对图像的亮度.对比度.色度或者锐度进行调整.你是不是觉得这种技术的底 层实现很高大上? 其实最基础的实现原理,用 Python 实现只需要几行代码,学会后你 ...

  6. python画折线图代码-python编程:如何使用python代码绘制折线图?

    推荐 (此处已添加圈子卡片,请到今日头条客户端查看) 折线图: import pandas as pd import matplotlib.pyplot as plt women_degrees = ...

  7. 绘制Python代码的UML图

    转载于:https://blog.csdn.net/Jerry_xzj/article/details/89707567 最近在学习一套Python编写的架构,使用pyreverse和Graphviz ...

  8. 50行python代码自动生成文章_50行Python代码,教你获取公众号全部文章

    > 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自 ...

  9. 使用python代码画折线图【matplotlib】

    1.画折线图[一条示例] import matplotlib.pyplot as plt import numpy as npx_axis_data = [1,2,3,4,5,6,7] #x y_ax ...

最新文章

  1. Spring boot 配置单元测试
  2. ESFramework网络通信框架 4.0 性能测试
  3. 驱动进化之路:总线设备驱动模型
  4. 利用kickstart实现pxe的自动化安装
  5. 为Docker容器设置静态IP
  6. 编译hbase2.2.4+hadoop3.1.2
  7. linux进程和计划任务,linux进程和计划任务
  8. 小甲鱼Python第二十二讲课后习题
  9. MFC之CString与const char* string 转换
  10. java的基本循环结构_Java基础之(九):循环结构
  11. Controller中使用swagger注解的正确姿势
  12. 软件工程经济学工程认证作业整理
  13. 华氏温度和摄氏温度的转换-C语言
  14. 武汉大学 计算机学院 衰落,为何武汉大学每年都被黑,武汉大学真的没有实力吗?...
  15. ubuntu 中 vi 编辑文件上下左右删除键毫无作用肿么办!(上上下下左右左右BABA)
  16. Julia 安装,使用教程
  17. android 内功修炼参考
  18. python导入keras_无法从keras.models python导入名称Cop
  19. Hadoop2.7.2 HBase2.0.0环境搭建
  20. CVECWE概念及其关系

热门文章

  1. 剑桥大学终身教授T.S.:7大机器学习算法与应用案例
  2. 数据驱动精准化营销在大众点评的实践
  3. 肖仰华 | 大规模、高质量的金融知识图谱,如何自动化构建?
  4. 论文浅尝 | 常识用于回答生成式多跳问题
  5. 强化学习之原理与应用
  6. A1051. DNA序列
  7. MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交
  8. 使用代理下载Unity AssetStore上资源的方法
  9. Nginx 的线程池与性能剖析【转载】
  10. 让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)