本文共 2864 字,大约阅读时间需要 9 分钟。
GrabCut进行前景检测:
import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('statue_small.jpg')mask = np.zeros(img.shape[:2],np.uint8)bgdModel = np.zeros((1,65),np.float64)fgdModel = np.zeros((1,65),np.float64)rect = (100,1,421,378)cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')img = img*mask2[:,:,np.newaxis]plt.subplot(121), plt.imshow(img)plt.title("grabcut"), plt.xticks([]), plt.yticks([])plt.subplot(122)plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'), cv2.COLOR_BGR2RGB))plt.title("original"), plt.xticks([]), plt.yticks([])plt.show()
输出:
2:使用分水岭算法进行图像分割
import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('1.png')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# noise removalkernel = np.ones((3,3),np.uint8)opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)# sure background areasure_bg = cv2.dilate(opening,kernel,iterations=3)# Finding sure foreground areadist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)# Finding unknown regionsure_fg = np.uint8(sure_fg)unknown = cv2.subtract(sure_bg,sure_fg)# Marker labellingret, markers = cv2.connectedComponents(sure_fg)# Add one to all labels so that sure background is not 0, but 1markers = markers+1# Now, mark the region of unknown with zeromarkers[unknown==255] = 0markers = cv2.watershed(img,markers)img[markers == -1] = [255,0,0]plt.imshow(img)plt.show()
输出:
3:使用普通摄像头进行深度估计
import numpy as npimport cv2l_camera = cv2.VideoCapture(0)r_camera = cv2.VideoCapture(1)# create windowscv2.namedWindow('left_Webcam', cv2.WINDOW_NORMAL)cv2.namedWindow('right_Webcam', cv2.WINDOW_NORMAL)cv2.namedWindow('disparity', cv2.WINDOW_NORMAL)blockSize = 40while(cv2.waitKey(1) & 0xFF != ord('q')): ret1, left_frame = l_camera.read() ret2, right_frame = r_camera.read() # our operations on the frame come here gray_left = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY) gray_right = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY) cv2.imshow('left_Webcam', gray_left) cv2.imshow('right_Webcam', gray_right) stereo = cv2.StereoSGBM_create(minDisparity=1, numDisparities=16, blockSize=15, #uniquenessRatio = 10, speckleWindowSize = 10, speckleRange = 32, disp12MaxDiff = 1, P1 = 8*3*blockSize**2, P2 = 32*3*blockSize**2) disparity = stereo.compute(gray_left, gray_right) disparity = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) cv2.imshow('disparity', disparity)# When everything done, release the capturecamera.release()cv2.destroyAllWindows()
输出:因为电脑上没有两个摄像头就没有进行试验