第四章 深度估計和分割
1 捕獲深度網路攝影機的幀
深度圖 灰階 每個像素都是網路攝影機到物體表面的距離 毫米
點雲圖 彩色 每種顏色對應一個維度空間 米
視差圖 灰階 每個像素代表物體表面的立體視差 近大遠小
有效深度掩模一個給定像素的深度資訊是否有效
2 從視差圖中得到掩模
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2016/12/1 10:16# @Author : Retacn# @Site : 深度網路攝影機資料的處理# @File : depth.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import numpy as np#裝置CAP_OPENNI=900CAP_OPENNI_ASUS=910#通道(基於浮點數的距離)CAP_OPENNI_DEPTH_MAP=0#會得到bgr映像CAP_OPENNI_POINT_CLOUD_MAP=1#XYZCAP_OPENNI_DISPARITY_MAP=2#CAP_OPENNI_DISPARITY_MAP_32F=3CAP_OPENNI_VALID_DEPTH_MASK=4CAP_OPENNI_BGR_IMAGE=5CAP_OPENNI_GRAY_IMAGE=6#產生掩模def createMedianMask(disparityMap,#視差圖 validDepthMask,#有效深度掩模 rect=None):#矩形 if rect is not None: x,y,w,h=rect disparityMap=disparityMap[y:y+h,x:x+w] validDepthMask=validDepthMask[y:y+h,x:x+w] #得到中值 median=np.median(disparityMap) #產生掩模,逐像素進行布爾操作 return np.where((validDepthMask==0) | (abs(disparityMap-median)<12),#值為真假的數組,當有效視差與平均視差>=12,看作雜訊 1.0,#為真時,數組相應元素為該值 0.0)#為假時,為該值
3 對複製操作進行掩模
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2016/12/1 10:22# @Author : Retacn# @Site : 矩形地區複製# @File : rects.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2import numpy as npfrom Three import utils#對複製操作執行掩模def copyRect(src, dst, srcRect, dstRect, mask=None,#掩模參數,掩模要和映像有相同的通道數 interpolation=cv2.INTER_LINEAR):#插值方法為線性插值 x0,y0,w0,h0=srcRect x1,y1,w1,h1=dstRect #如果掩模為空白,則執行複製操作 if mask is None: dst[y1:y1+h1,x1:x1+w1]=cv2.resize(src[y0:y0+h0,y0:y0+h0],#源映像 (w1,h1),#靶心圖表像 interpolation=interpolation)#插值方法 else: #如果掩模為單通道,則複製通道 if not utils.isGray(src): mask=mask.repeat(3).reshape(h0,w0,3) dst[y1:y1+h1,x1:x1+w1]=np.where(cv2.resize(mask,(w1,h1),interpolation=cv2.INTER_NEAREST), cv2.resize(src[y0:y0+h0,x0:x0+w0],(w1,h1),interpolation=interpolation), dst[y1:y1 + h1, x1:x1 + w1] )#一組矩形的迴圈交換def swqpRects(src,dst,rects,masks=None,interpolation=cv2.INTER_LINEAR): if dst is not src: dst[:]=src numRects=len(rects) if numRects<2: return if masks is None: masks=[None]*numRects x,y,w,h=rects[numRects-1] temp=src[y:y+h,x:x+w].copy() i=numRects-2 while i>=0: copyRect(src,dst,rects[i],rects[i+1],masks[i],interpolation) i-=1 copyRect(temp,dst,(0,0,w,h),rects[0],masks[numRects-1],interpolation)
4 使用普通網路攝影機進行深試評估
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2016/12/1 11:40# @Author : Retacn# @Site : 使用普通網路攝影機進行深試估計# @File : commonCamera2Depth.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2import numpy as npdef update(val=0): stereo.setBlockSize(cv2.getTrackbarPos('window_size','disparity')) stereo.setUniquenessRatio(cv2.getTrackbarPos('uniquenessRatio','disparity')) stereo.setSpeckleWindowSize(cv2.getTrackbarPos('speckleWindowSize','disparity')) stereo.setSpeckleRange(cv2.getTrackbarPos('speckleRange','disparity')) stereo.setDisp12MaxDiff(cv2.getTrackbarPos('disp12MaxDiff','disparity')) print('computing disparity...') disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0 cv2.imshow('left', imgL) cv2.imshow('disparity', (disp - min_disp) / num_disp)if __name__=='__main__': windows_size=5 #一個匹配塊的大小,大於1的奇數 min_disp=16 #最小視差值 num_disp=192-min_disp #最大視差值和最小視差值的差 blockSize=windows_size uniquenessRatio=1 speckleRange=3 #每個已串連部分的最大視差變化 speckleWindowSize=3 #平滑視差地區的最大視窗尺寸 disp12MaxDiff=200 P1=600 #控制視差圖平滑度有第一個參數 P2=2400#第二個參數,值越大視差圖越平滑 #讀入映像 imgL=cv2.imread('../imgl.jpg') imgR=cv2.imread('../imgr.jpg') cv2.namedWindow('disparity') cv2.createTrackbar('speckleRange','disparity',speckleRange,50,update) cv2.createTrackbar('window_size','disparity',windows_size,21,update) cv2.createTrackbar('speckleWindowSize','disparity',speckleWindowSize,200,update) cv2.createTrackbar('uniquenessRatio','disparity',uniquenessRatio,50,update) cv2.createTrackbar('disp12MaxDiff','disparity',disp12MaxDiff,250,update) stereo=cv2.StereoSGBM_create(minDisparity=min_disp, numDisparities=num_disp, blockSize=blockSize, uniquenessRatio=uniquenessRatio, speckleRange=speckleRange, speckleWindowSize=speckleWindowSize, disp12MaxDiff=disp12MaxDiff, P1=P1, P2=P2) update() cv2.waitKey()
5 使用分水嶺和grabcut演算法進行物體分割
A 使用brabcut進行前景檢測
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2016/12/2 11:17# @Author : Retacn# @Site : 使用grubCut進行前景檢測# @File : grabcutNew.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"