Edge Detector ============= 此示例对 3 个不同的输入执行边缘检测:左、右和 RGB 相机。使用 HW 加速 sobel 滤波器 3x3。Sobel 滤波器参数可以通过按键 1 和 2 进行更改。 Demo ********* .. image:: /_static/images/samples/edge_detections.png 设置 ***************** .. warning:: 说明:此处安装的是第二代depthai库 请运行以下命令来安装所需的依赖项 .. code-block:: bash python3 -m pip install -U pip python3 -m pip install opencv-python python3 -m pip install -U --force-reinstall depthai 有关更多信息,请参阅 :ref:`Python API 安装指南 ` 源代码 **************** 可以在 `GitHub `_ 上找到。国内用户也可以在 `gitee `_ 上找到。 流程图 ############# .. image:: /_static/images/samples/flow_chart/edge_detection.png .. code-block:: python #!/usr/bin/env python3 import cv2 import depthai as dai import numpy as np # Create pipeline pipeline = dai.Pipeline() # Define sources and outputs camRgb = pipeline.create(dai.node.ColorCamera) monoLeft = pipeline.create(dai.node.MonoCamera) monoRight = pipeline.create(dai.node.MonoCamera) edgeDetectorLeft = pipeline.create(dai.node.EdgeDetector) edgeDetectorRight = pipeline.create(dai.node.EdgeDetector) edgeDetectorRgb = pipeline.create(dai.node.EdgeDetector) xoutEdgeLeft = pipeline.create(dai.node.XLinkOut) xoutEdgeRight = pipeline.create(dai.node.XLinkOut) xoutEdgeRgb = pipeline.create(dai.node.XLinkOut) xinEdgeCfg = pipeline.create(dai.node.XLinkIn) edgeLeftStr = "edge left" edgeRightStr = "edge right" edgeRgbStr = "edge rgb" edgeCfgStr = "edge cfg" xoutEdgeLeft.setStreamName(edgeLeftStr) xoutEdgeRight.setStreamName(edgeRightStr) xoutEdgeRgb.setStreamName(edgeRgbStr) xinEdgeCfg.setStreamName(edgeCfgStr) # Properties camRgb.setBoardSocket(dai.CameraBoardSocket.RGB) camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P) monoLeft.setResolution(dai.MonoCameraProperties.SensorResolution.THE_400_P) monoLeft.setBoardSocket(dai.CameraBoardSocket.LEFT) monoRight.setResolution(dai.MonoCameraProperties.SensorResolution.THE_400_P) monoRight.setBoardSocket(dai.CameraBoardSocket.RIGHT) edgeDetectorRgb.setMaxOutputFrameSize(camRgb.getVideoWidth() * camRgb.getVideoHeight()) # Linking monoLeft.out.link(edgeDetectorLeft.inputImage) monoRight.out.link(edgeDetectorRight.inputImage) camRgb.video.link(edgeDetectorRgb.inputImage) edgeDetectorLeft.outputImage.link(xoutEdgeLeft.input) edgeDetectorRight.outputImage.link(xoutEdgeRight.input) edgeDetectorRgb.outputImage.link(xoutEdgeRgb.input) xinEdgeCfg.out.link(edgeDetectorLeft.inputConfig) xinEdgeCfg.out.link(edgeDetectorRight.inputConfig) xinEdgeCfg.out.link(edgeDetectorRgb.inputConfig) # Connect to device and start pipeline with dai.Device(pipeline) as device: # Output/input queues edgeLeftQueue = device.getOutputQueue(edgeLeftStr, 8, False) edgeRightQueue = device.getOutputQueue(edgeRightStr, 8, False) edgeRgbQueue = device.getOutputQueue(edgeRgbStr, 8, False) edgeCfgQueue = device.getInputQueue(edgeCfgStr) print("Switch between sobel filter kernels using keys '1' and '2'") while(True): edgeLeft = edgeLeftQueue.get() edgeRight = edgeRightQueue.get() edgeRgb = edgeRgbQueue.get() edgeLeftFrame = edgeLeft.getFrame() edgeRightFrame = edgeRight.getFrame() edgeRgbFrame = edgeRgb.getFrame() # Show the frame cv2.imshow(edgeLeftStr, edgeLeftFrame) cv2.imshow(edgeRightStr, edgeRightFrame) cv2.imshow(edgeRgbStr, edgeRgbFrame) key = cv2.waitKey(1) if key == ord('q'): break if key == ord('1'): print("Switching sobel filter kernel.") cfg = dai.EdgeDetectorConfig() sobelHorizontalKernel = [[1, 0, -1], [2, 0, -2], [1, 0, -1]] sobelVerticalKernel = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]] cfg.setSobelFilterKernels(sobelHorizontalKernel, sobelVerticalKernel) edgeCfgQueue.send(cfg) if key == ord('2'): print("Switching sobel filter kernel.") cfg = dai.EdgeDetectorConfig() sobelHorizontalKernel = [[3, 0, -3], [10, 0, -10], [3, 0, -3]] sobelVerticalKernel = [[3, 10, 3], [0, 0, 0], [-3, -10, -3]] cfg.setSobelFilterKernels(sobelHorizontalKernel, sobelVerticalKernel) edgeCfgQueue.send(cfg) .. include:: /pages/includes/footer-short.rst