当前位置:   article > 正文

OpenCV第五弹-深度估计与分割_opencv深度估计

opencv深度估计

(一)使用普通摄像头进行深度估计 

-使用(普通)深度摄像头识别前景区域和背景区域-深度摄像头/立体图像。

-深度摄像头可以计算与摄像头的距离。

-极几何:属于立体视觉几何学,从同一物体的两张不同图像提取三维信息。跟踪从摄像头到图像上每个物体的虚线,然后在第二章图像做同样的操作,并根据同一个物体对应的交叉来计算距离。

 

视差图:灰度图像,该图像的每个像素值代表物体表面的立体视差。

立体视差:从不同视角观察同一场景得到的两张图像叠放在一起,感觉是两张不同的图像,针对两张图像中两个孪生物体之间任意一对相互对应的两个像素点,可以度量像素之间的距离。近距离的物体会产生较大的立体视差,远距离的就小一些

使用极几何计算视差图,对图像中检测到的不同深度的基本表示。-提取前景部分。

条件:在不同视角相同距离拍摄两幅图像,否则计算失败。

  1. import cv2
  2. import numpy as np
  3. # 使用普通摄像头实现视差
  4. def update(val=0):
  5. stereo.setBlockSize(cv2.getTrackbarPos("window_size", "disparity"))
  6. stereo.setUniquenessRatio(cv2.getTrackbarPos("uniquenessRatio", "disparity"))
  7. stereo.setSpeckleWindowSize(cv2.getTrackbarPos("speckleWindowSize", "disparity"))
  8. stereo.setSpeckleRange(cv2.getTrackbarPos("speckleRange", "disparity"))
  9. stereo.setDisp12MaxDiff(cv2.getTrackbarPos("disp12MaxDiff", "disparity"))
  10. print("computing disparity....")
  11. disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
  12. cv2.imshow("left", imgL)
  13. cv2.imshow("disparity", (disp - min_disp) / num_disp)
  14. if __name__ == "__main__":
  15. window_size = 5
  16. min_disp = 16
  17. num_disp = 192 - min_disp
  18. blockSize = window_size
  19. uniquenessRatio = 1
  20. speckleRange = 3
  21. speckleWindowSize = 3
  22. disp12MaxDiff = 200
  23. P1 = 600
  24. P2 = 2400
  25. imgL = cv2.imread("dep1.jpg")
  26. imgR = cv2.imread("dep2.jpg")
  27. cv2.namedWindow("disparity")
  28. cv2.createTrackbar("speckleRange", "disparity", speckleRange, 50, update)
  29. cv2.createTrackerbar("window_size", "disparity", window_size, 21, update)
  30. cv2.createTrackerbar(
  31. "speckleWindowSize", "disparity", speckleWindowSize, 200, update
  32. )
  33. cv2.createTrackerbar("uniquenessRatio", "disparity", uniquenessRatio, 50, update)
  34. cv2.createTrackerbar("disp12MaxDiff", "disparity", disp12MaxDiff, 250, update)
  35. stereo = cv2.StereoSGBM_create(
  36. minDisparity=min_disp,
  37. numDisparities=num_disp,
  38. blockSize=window_size,
  39. uniquenessRatio=uniquenessRatio,
  40. speckleRange=speckleRange,
  41. speckleWindowSize=speckleWindowSize,
  42. disp12MaxDiff=disp12MaxDiff,
  43. P1=P1,
  44. P2=P2,
  45. )
  46. update()
  47. cv2.waitKey()

 (二)使用GrabCut进行前景检测

grabCut函数:

输入图像、掩码、矩形区域、背景/前景模型、迭代次数、grabCut初始化方式

  1. img = cv2.imread("mouse.jpg")
  2. mask = np.zeros(img.shape[:2], np.uint8)
  3. bgdModel = np.zeros((1, 65), np.float64) # 初始化背景模型
  4. fgdModel = np.zeros((1, 65), np.float64) # 初始化前景模型
  5. rect = (100, 50, 421, 378) # 用于被初始化的grabCut算法
  6. cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
  7. # 进行分割
  8. mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype("uint8")
  9. # 创建新的掩码,将原来掩码中值为2和0 的区域设置为0,其他区域设置为1
  10. img = img * mask2[:, :, np.newaxis]
  11. # 根据新的掩码对图像进行遮罩操作,只保留前景像素
  12. plt.subplot(121), plt.imshow(img)
  13. plt.title("grabcut"), plt.xticks([]), plt.yticks([])
  14. plt.subplot(122), plt.imshow(cv2.cvtColor(cv2.imread("mouse.jpg"), cv2.COLOR_BGR2RGB))
  15. plt.title("original"), plt.xticks([]), plt.yticks([])
  16. plt.show()

(三)使用分水岭算法进行图像分割

cv2.morphologyEx函数:形态学操作类型——op参数:

  1. img = cv2.imread("luole.jpg")
  2. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  3. ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
  4. kernel = np.ones((3, 3), np.uint8)
  5. opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
  6. # 输入图像、形态学方法、核、迭代次数——去除噪声
  7. sure_bg = cv2.dilate(opening, kernel, iterations=3)
  8. # 膨胀,得到不部分都是背景的区域
  9. dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
  10. ret1, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
  11. # 获取确定的前景区域
  12. sure_fg = np.uint8(sure_fg)
  13. unknown = cv2.subtract(sure_bg, sure_fg)
  14. # 计算未知区域,即既不是前景也不是背景的区域。
  15. ret2, markers = cv2.connectedComponents(sure_fg)
  16. # 标记连通的前景
  17. markers = markers + 1
  18. # 增加标签数量
  19. markers[unknown == 255] = 0
  20. markers = cv2.watershed(img, markers)
  21. # 使用Watershed算法标记图片
  22. img[markers == -1] = [255, 0, 0]
  23. plt.imshow(img)
  24. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/713394
推荐阅读
相关标签
  

闽ICP备14008679号