通过cv2输出左右眼视差图, 然后根据视差图输出深度边沿
视差图是神经网络里的x--feature,分左右眼
计算过程是先将左眼(或右眼)图片作为主视图(基准),然后用另外一眼图片缓慢的水平划过主视图,
这时候会有部分区域重合,相当于人看东西的时候双目同时注视.
记住这个水平移动的距离就可以计算出景深.计算公式还包含焦距,双眼距离.
小技巧,为了提高计算速度,可以将彩色图片转化为灰度图,如下.
小技巧,为了提高计算速度,可以将多张滑动重合图堆叠在一起,构成一张3D矩阵图,这里将3D矩阵图做个2D切片:
然后从层,行,列3个维度中,选取行的维度进行切片,再卷积,最后得到重合位置,这里做个2D切片:
用到的卷积核见程序中的 ---kernel. 卷积核还有继续改进的空间.
注意图片上边沿附近的2个小白点:
将多个重合位置重新降维到2D得到结果. 这样就得到了深度图, 可以作为 神经网络里的y--label, 可惜简单的算法只能 边沿涂色,需要后续处理才能将整个物体涂色.
# 改成 320 x 240 分辨率# 用 卷积去除彩虹, 卷积核的作用是时间轴上的边界重叠位置,计算重合时刻的视差,# todo 现在是边界有深度信息,面没有深度信息, 计算的结果仅仅是边沿, todo 将视差向右传播,方法是??(直到另外一个极值?)# todo 滑动距离需要改变''' 伪代码:frame2 [0:240, 0:320] 左右眼照片,320x240cv2.cvtColor(imgL,cv2.COLOR_BGR2GRAY) 灰度化cv2.addWeighted() 融合左右眼算法,# 将shift=1 shift=200 堆叠成3D 阵列# 将3D 转换为2D,选择极值,并记录层数 # 将2D转换为深度图,# 将深度图转换为色彩图'''############## import cv2
import numpy as np
import timestart = time.time()dx, dy = 0, -1 # 左眼图片滑动的dx 向右偏移量, dy=-1 制造偏差修正,固定的偏移量# dx=-3 窗外的塔吊重合# dx=-5 办公室远处的绿植重合# dx=-99 距离摄像头15cm的鼻子重合DATA3D =np.zeros((30,240,320), dtype=np.uint8) # 存储 # 2图相减的值,堆叠DATA3D。 每个单元格里是:左右眼差异 所有的视差融合图 高 x 宽 x 视差(像素), --一开始申请连续空间,数据搬运工作量少,比较节约cpu时间,
DATA3D2 =np.zeros((30,240,320), dtype=np.uint8) # 存储 视差融合点 DATA2D=np.zeros((240,320), dtype=np.uint8 ) # 存储 高 x 宽 ,每个单元格里是: 融合后最小值的视差(像素)
# print(DATA3D.shape)keyInput=0########################################################################### kernel = np.array(( # 卷积核,用于查找左右眼重合点[-1, -1, 1, 1, 0],[-1, -1, 1, 0, -1],[-1, -1, 0, -1, -1],[-1, 0, 1, -1, -1],[ 0, 1, 1, -1, -1]),dtype="float32") / 1############## 获取图片 ############################for k in range(0, 1 ): print("读取左右眼图片 -------------")imgL =cv2.imread("imgL00009.png") #读取 图片L ,图片RimgR =cv2.imread("imgR00009.png")
#########################################################imgL_gray=cv2.cvtColor(imgL,cv2.COLOR_BGR2GRAY) #将彩色图片L转换至灰度图片## rows, cols, ch = imgL.shape # for 彩色图片rows, cols = imgL_gray.shape## imgL_gray=imgL_gray.astype(np.int16)imgR_gray=cv2.cvtColor(imgR,cv2.COLOR_BGR2GRAY) #将彩色图片R转换至灰度图片cv2.imshow('imgR_gray',imgR_gray)########################################################################################### 滑动 + 堆叠 for i in range(2,31): # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< todo 滑动距离需要改变print("视差图相减,再堆叠-------------------",i)MAT = np.float32([[1, 0, -2*i], [0, 1, dy]]) # 构造平移变换矩阵 ,[dx, dy]像素移动 imgL_gray_shift = cv2.warpAffine(imgL_gray, MAT, (cols, rows)) # 仿射变换,移动图片。默认为黑色填充# imgL_gray_shift = cv2.warpAffine(imgL_gray, MAT, (cols, rows), borderValue=(255,255,255)) # 白色填充imgMerge=cv2.absdiff(imgR_gray , imgL_gray_shift ) # 2图相减的值, ''' # <<<<<<< debug 注释符号' ' ' 需要对齐## 将 imgMorphClose0 imgMorphClose1 做与运算# imgMerge= cv2.bitwise_xor(imgR_Threshold ,imgL_Threshold) ## 做与或运算 xor# imgMerge= cv2.bitwise_and(imgR_Threshold ,imgL_Threshold) ## 做与运算 and# imgMerge= cv2.bitwise_or(imgR_Threshold ,imgL_Threshold) ## 做或运算 or# imgMerge= cv2.add(imgR_Threshold ,imgL_Threshold) ## 做加运算 add,效果等同于 or# imgMerge= cv2.bitwise_not(imgR_Threshold) ## 做非运算 not'''DATA3D[i-2,:,:] = imgMerge # 2图相减的值,--------------------------------------------堆叠DATA3D。 ########################################################################################### 卷积 + 堆叠 for i in range(0,240):probe2D= DATA3D[:, i, :] # 切片 -------------- 切片DATA3D, 方向在 层,行,列 的 行维度imgProbe2DMin = cv2.filter2D(probe2D, -1, kernel) # 卷积 求重合点-------------- cv.filter2D(源图像,输出数据类型 ,卷积核) , 输出数据类型 =-1 表示输出类型和输入相同 DATA3D2[:,i,:] = imgProbe2DMin # 堆叠 --------------堆叠DATA3D2, 方向同上 ############################################ # 显示 3D矩阵的剖面 imgTemp = DATA3D[:,200,:] *90 ## 未经卷积处理过的3D矩阵的剖面, *90 表示增强信号,否则看不到cv2.imshow( 'imgTemp', imgTemp )imgTemp1 = DATA3D2[:,200,:] *90 ## 已经卷积处理过的3D矩阵的剖面, *90 表示增强信号,否则看不到cv2.imshow( 'imgTemp1', imgTemp1 )########################### # 求极值DATA2D = np.argmax( DATA3D2,axis = 0 ).astype(np.uint8) * 9 # np.argmin( ) 返回了最小值的位置 # debug <<<<<<<<<<<<<<<<<<<程序会将uint8 自动更改为 int64# print(DATA2D.dtype) # print( DATA2D.shape ) outPutColor = cv2.applyColorMap(DATA2D, cv2.COLORMAP_JET) # COLORMAP_JET = 2, 蓝到红# COLORMAP_RAINBOW = 4,红到蓝cv2.imshow( 'outPutColor', outPutColor ) # 如果 DATA2D 声明的时候没有指定数据类型,或者在计算过程中数据类型改变,可以在这里指定为 uint8######### 键盘响应 ,兼计时器 ########################################3 keyInput = cv2.waitKey( 0) & 0xFF #等待键盘输入,间隔 xx us # debu g <<<<<<<<<<<<<<< 设置 waitKey(0) , 则表示程序会无限制的等待用户的按键事件if (keyInput == ord('q')) | (keyInput == 27 ) : # 键盘上的按键 --q --ESCbreakcv2.destroyAllWindows()
通过cv2输出左右眼视差图, 然后根据视差图输出深度边沿相关推荐
- 立体感的3D图像(包含左右眼)生成Red-Cyan分析图
现在在作3D的东西,得到左右两个视角的图,但不知道怎么来判断效果,不知道哪个结果更好,怎么办?现在整理了些方法,备份在此,供大家分享和讨论. 1.Red-Cyan anaglyph 没有眼镜也没有关系 ...
- unity中凹凸贴图、法线贴图、视差贴图和位移贴图
凹凸贴图 ((更多资源资料下载群:193521697邀请码:10026)) 对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行 ...
- Arcgis ArcEngine二次开发: 输出宗地图、宗地草图、权属协议书附图、房产分层分户图、公示图、三调土地利用图、行政区划图、标准分幅图等各种图件
1.Arcgis ArcEngine二次开发: 输出宗地图.宗地草图.权属协议书附图.房产分层分户图.公示图.三调土地利用图.行政区划图.标准分幅图等各种图件 有需要联系QQ:185242573. ...
- 九九乘法表--输出左对齐+输出字长
九九乘法表–输出左对齐+输出字长 oj循环第一题 #include<iostream> #include<iomanip> using namespace std; int m ...
- opengl高级光照之视差贴图(陡峭视差贴图以及视差遮蔽映射)
视差贴图 视差贴图官方文档 视差贴图 视差贴图(Parallax Mapping)技术和法线贴图差不多,但它有着不同的原则.和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感.它也是利用了视错 ...
- Java 输出左直角三角形
import java.util.Scanner; public static void test2() { //输出左直角三角形 Scanner sc =new Sc ...
- 采用邻接矩阵形式存储图,进行图的深度优先搜索并输出结果。
内容: 采用邻接矩阵形式存储图,进行图的深度优先搜索并输出结果. 步骤: 算法分析 本题需要利用邻接矩阵的形式存储图,并对图进行深度优先搜索并输出结果.大体上可以分为两个部分,一是采用邻接矩阵的方式存 ...
- arcgis已搭建好的空间自动化出图(仅仅是自动输出图片,不包含图层处理)中python和arctoolbox的结合使用
#python脚本通过arctoolbox的工具箱新建工具,输入代码构成.本文侧重代码的简单实现.下图为最终界面: ########################################## ...
- activiti动态增加节点_图神经网络之动态图
图这种结构普遍存在于人类社会生活中,如互联网中网页间的互相链接会构成图.网民购买商品会构成"网民-商品"图.人和人的交流会构成图.论文的互相引用也会构成图.有许多任务需要根据这些图 ...
最新文章
- Node.js 报语法错误 SyntaxError: Unexpected identifier
- jsonStore加载远程和本地数据实例
- postgresql 集群_谁说postgresql 没有靠谱的高可用(2)
- numpy.random.uniform()
- 【PP生产订单】入门介绍(六)
- uni-app微信小程序获取手机号;微信小程序获取手机号,获取到后需要进行解密;微信小程序获取手机号失败 Error:该appId没有权限
- 状态开关按钮(ToggleButton)及按钮(Swich)的使用
- POJ 1422 Air Raid
- 用Kubeadm安装K8s后,kube-flannel-ds一直CrashLoopBackOff
- webpack 分离css html,【已解决】ReactJS中Webpack打包时分离css
- [翻译]Popfly系列课程7 –深入幕后:使用 Popfly学习XML的初学者指南
- 求ucinet软件下载资源!!!!
- 浅议一种低成本的48V蓄电池组电压电流采集模块
- 嵌入式开发培训怎么样,嵌入式开发培训前景如何?
- oracle的视图和同义词
- 爱乐活改版未断根,改版后不伦不类
- c语言 qt 写小游戏,Qt实现Flappy Bird游戏
- Redhat 8修改系统语言为英文
- Data Migration 架构
- 差模信号与共模信号的理解