From cbcbf7ecfa50abc55d4ed13a9136ab18bcaeccb9 Mon Sep 17 00:00:00 2001 From: Teagan Glenn Date: Thu, 4 May 2017 23:11:59 -0600 Subject: [PATCH] Opencv (#2208) * Image processing opencv doc * OpenCV doc * OpenCV logo * Doc updates * Change docs to match opencv component * Update docs * Add comment to example * Add camera config * Add comment to example yaml * Update docs to reflect the camera not being there * Better documentation on configuration and attributes * Reference hub * Set release --- .../image_processing.opencv.markdown | 18 +++++ source/_components/opencv.markdown | 76 ++++++++++++++++++ source/images/OpenCV_Logo.png | Bin 0 -> 18894 bytes 3 files changed, 94 insertions(+) create mode 100644 source/_components/image_processing.opencv.markdown create mode 100644 source/_components/opencv.markdown create mode 100644 source/images/OpenCV_Logo.png diff --git a/source/_components/image_processing.opencv.markdown b/source/_components/image_processing.opencv.markdown new file mode 100644 index 00000000000..9843c7e645a --- /dev/null +++ b/source/_components/image_processing.opencv.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "OpenCV" +description: "Instructions how to integrate OpenCV image processing into Home Assistant." +date: 2017-01-25 00:00 +sidebar: true +comments: false +sharing: true +footer: true +logo: OpenCV_Logo.png +ha_category: Image Processing +featured: false +ha_release: 0.44 +--- + +The `opencv` image processing platform allows you to create a standalone image processor without the linked camera entity as mentioned in the [OpenCV page](https://home-assistant.io/components/opencv). + +Please refer to the [component](/components/opencv/) configuration on how to setup the image processor. diff --git a/source/_components/opencv.markdown b/source/_components/opencv.markdown new file mode 100644 index 00000000000..ebfd368c2f6 --- /dev/null +++ b/source/_components/opencv.markdown @@ -0,0 +1,76 @@ +--- +layout: page +title: "OpenCV" +description: "Instructions how to setup OpenCV within Home Assistant." +date: 2017-04-01 22:36 +sidebar: true +comments: false +sharing: true +footer: true +logo: OpenCV_Logo.png +ha_category: Hub +ha_release: 0.44 +ha_iot_class: "Local Push" +--- + +[OpenCV](https://www.opencv.org) is an open source computer vision image and video processing library. + +Some pre-defined classifiers can be found here: https://github.com/opencv/opencv/tree/master/data + +### {% linkable_title Configuration %} + +To setup OpenCV with Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry + +opencv: + classifier_group: + - name: Family + add_camera: True + entity_id: + - camera.front_door + - camera.living_room + classifier: + - file_path: /path/to/classifier/face.xml + name: Bob + - file_path: /path/to/classifier/face_profile.xml + name: Jill + min_size: (20, 20) + color: (255, 0, 0) + scale: 1.6 + neighbors: 5 + - file_path: /path/to/classifier/kid_face.xml + name: Little Jimmy +``` + +Configuration variables: + +- **name** (*Required*): The name of the OpenCV image processor. +- **entity_id** (*Required*): The camera entity or list of camera entities that this classification group will be applied to. +- **classifier** (*Required*): The classification configuration for to be applied: + - **file_path** (*Required*): The path to the HAARS or LBP classification file (xml). + - **name** (*Optional*): The classification name, the default is `Face`. + - **min_size** (*Optional*): The minimum size for detection as a tuple `(width, height)`, the default is `(30, 30)`. + - **color** (*Optional*): The color, as a tuple `(Blue, Green, Red)` to draw the rectangle when linked to a dispatcher camera, the default is `(255, 255, 0)`. + - **scale** (*Optional*): The scale to perform when processing, this is a `float` value that must be greater than or equal to `1.0`, default is `1.1`. + - **neighbors** (*Optional*): The minimum number of neighbors required for a match, default is `4`. The higher this number, the more picky the matching will be; lower the number, the more false positives you may experience. + +Once OpenCV is configured, it will create an `image_processing` entity for each classification group/camera entity combination as well as a camera so you can see what Home Assistant sees. + +The attributes on the `image_processing` entity will be: + +```json +'matches': { + 'Bob': [ + (x, y, w, h) + ], + 'Jill': [ + (x, y, w, h) + ], + 'Little Jimmy': [ + (x, y, w, h) + ] +} +``` + diff --git a/source/images/OpenCV_Logo.png b/source/images/OpenCV_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8edf677e66d6ef65ee2a851e547bf062009b8d99 GIT binary patch literal 18894 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