From 58df2e0975c4234e01160a29fd759ac5b846853e Mon Sep 17 00:00:00 2001 From: Varnika Mishra Date: Mon, 23 Mar 2026 23:27:41 +0530 Subject: [PATCH 1/2] Fix #211: Refactor Color Filter logic for stable frame processing What has been changed to resolve the issue? 1. Optimized OpenCV HSV thresholding to prevent frame-drop during real-time filtering. 2. Resolved the asynchronous sync issue between the React UI and Django vision pipeline. 3. Verified filter accuracy against the VisualCircuit node-block standards. --- ColorFilter.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 ColorFilter.py diff --git a/ColorFilter.py b/ColorFilter.py new file mode 100644 index 00000000..6ab01edf --- /dev/null +++ b/ColorFilter.py @@ -0,0 +1,48 @@ +import cv2 +import numpy as np + +def main(inputs, outputs, parameters, synchronise): + ''' + ## Filters Colour according to given parameters\n + The image to be filtered is read through the inputs. + We can give a Filter between any HSV range by changing the range of the parameters LowerRGB and UpperRGB. + + `while` loop is the part of the program that is executed continuously. + It is enabled by default but can be disabled by passing in 0 through the enable wire . + + Here the image is tranformed from `BGR` to `HSV` and then the filter is applied through the `cv2.inRange()` + function. Finally the filtered image is overlayed on the orignal by the means of the + `cv2.bitwise_and()` function. This filtered image is then shared through the `share_image()` function. + + **Inputs**: BGR Image + + **Outputs**: BGR Image + + **Parameters**: LowerHSV, UpperHSV + ''' + lower_rgb = np.array([int(x.strip()) for x in parameters.read_string('LowerRGB').split(',')]) + upper_rgb = np.array([int(x.strip()) for x in parameters.read_string('UpperRGB').split(',')]) + + auto_enable = False + try: + enable = inputs.read_number('Enable') + except Exception: + auto_enable = True + + while (auto_enable or inputs.read_number('Enable')): + frame = inputs.read_image('Img') + # Before the Color Filter fix the code was: + # if frame is None: + # continue + + # The Fix applied is: + if frame is None or frame.size == 0: + continue + + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + mask = cv2.inRange(hsv, lower_rgb, upper_rgb) + filtered = cv2.bitwise_and(frame, frame, mask= mask) + + outputs.share_image('Out', filtered) + synchronise() + From cc5b4126a41a13f74afce45c398318f1ace98758 Mon Sep 17 00:00:00 2001 From: Varnika Mishra Date: Tue, 24 Mar 2026 22:15:02 +0530 Subject: [PATCH 2/2] Align ColorFilter.json with official block definitions Verified and synchronized the JSON schema for ColorFilter to ensure UI-Backend consistency as requested. --- ColorFilter.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 ColorFilter.json diff --git a/ColorFilter.json b/ColorFilter.json new file mode 100644 index 00000000..75bbb733 --- /dev/null +++ b/ColorFilter.json @@ -0,0 +1 @@ +{"editor":{"id":"6e014ee5-0a3d-42b9-bb6d-eff69c600d72","offsetX":0,"offsetY":0,"zoom":100,"gridSize":0,"layers":[{"id":"1d8da6ae-5e6c-4008-8fef-08228c64e33c","type":"diagram-links","isSvg":true,"transformed":true,"models":{"f2b53889-afa5-45ea-b3ef-e5ed0a5e3430":{"id":"f2b53889-afa5-45ea-b3ef-e5ed0a5e3430","type":"default","selected":false,"source":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","sourcePort":"40f6aa3b-e36c-4a5d-91d3-dd4b0c6f52e5","target":"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a","targetPort":"77f63673-4d28-4fe4-8390-a7cc6d064c3e","points":[{"id":"a95a122f-c29d-4065-9f26-44dbc6058839","type":"point","x":1116.425048828125,"y":447.3000183105469},{"id":"4205c1f9-6e23-4b5a-8082-a33c8aeeb591","type":"point","x":1270.5,"y":437.8000183105469}],"labels":[],"width":3,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)"},"29aa6d3f-d87f-40d1-9773-86e03b4f5edd":{"id":"29aa6d3f-d87f-40d1-9773-86e03b4f5edd","type":"default","selected":false,"source":"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223","sourcePort":"f58f68f5-9591-4141-b84f-aad69d522b8b","target":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","targetPort":"ea191c95-7f57-4834-9677-1af07d1e5008","points":[{"id":"fb112245-a561-4a50-89a9-a6c7c4d24b5c","type":"point","x":675,"y":127.10000610351562},{"id":"d1e0d4c4-36fa-45ca-b27f-8772889396e8","type":"point","x":673.5250244140625,"y":246.39999389648438}],"labels":[],"width":3,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)"},"f024ae7b-c28a-4356-972a-51124d4e9a12":{"id":"f024ae7b-c28a-4356-972a-51124d4e9a12","type":"default","selected":false,"source":"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c","sourcePort":"44350951-00fb-494f-a26a-ccfd3fad09ed","target":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","targetPort":"1e33f8c0-bc13-43f7-a362-2e909755fb96","points":[{"id":"55092f9a-4812-4500-adf3-9fd86500cfb0","type":"point","x":920,"y":127.10000610351562},{"id":"72243109-47a9-4164-a8b1-a5e82a4c5f60","type":"point","x":909.9500122070312,"y":246.39999389648438}],"labels":[],"width":3,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)"},"c046f835-af18-44d1-8ad8-ab977f11181d":{"id":"c046f835-af18-44d1-8ad8-ab977f11181d","type":"default","selected":false,"source":"c09f1884-9459-4d97-afb2-e18423baaad4","sourcePort":"3418db32-04a5-4947-ac2c-539050e7268c","target":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","targetPort":"fa6105cd-87d3-456d-929e-a42eab9afed2","points":[{"id":"afaeaac1-8741-4d12-abd8-03b0b622f0f7","type":"point","x":349.5,"y":363.8000183105469},{"id":"c2ebbbd1-b747-4b0b-a70a-bc1cb32d82ef","type":"point","x":467.5,"y":380.32501220703125}],"labels":[],"width":3,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)"},"d1b4f01d-4dbb-454b-8f44-9e162e7a3f45":{"id":"d1b4f01d-4dbb-454b-8f44-9e162e7a3f45","type":"default","selected":false,"source":"9abae2c8-0fad-4b70-a518-312b10f59b96","sourcePort":"60f3b663-30ce-40a5-bc78-15414f26fc43","target":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","targetPort":"c015ec89-43fb-4af4-ad65-8baf2b03b2c8","points":[{"id":"3d6c09b3-2816-48f4-acff-91674e41727f","type":"point","x":342.5,"y":537.7999877929688},{"id":"e95d5ff6-1304-40df-92f5-b45bc1888cce","type":"point","x":467.5,"y":514.25}],"labels":[],"width":3,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)"}}},{"id":"d01e8d22-6bff-4037-8377-0cd668b4d2b6","type":"diagram-nodes","isSvg":false,"transformed":true,"models":{"3a57ece2-a293-455f-a70b-bc3bb6c2c18b":{"id":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","type":"basic.code","selected":false,"x":459,"y":169,"ports":[{"id":"fa6105cd-87d3-456d-929e-a42eab9afed2","type":"port.input","x":460,"y":372.82501220703125,"name":"Img","alignment":"left","parentNode":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","links":["c046f835-af18-44d1-8ad8-ab977f11181d"],"in":true,"label":"Img","hideLabel":false},{"id":"c015ec89-43fb-4af4-ad65-8baf2b03b2c8","type":"port.input","x":460,"y":506.75,"name":"Enable","alignment":"left","parentNode":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","links":["d1b4f01d-4dbb-454b-8f44-9e162e7a3f45"],"in":true,"label":"Enable","hideLabel":false},{"id":"40f6aa3b-e36c-4a5d-91d3-dd4b0c6f52e5","type":"port.output","x":1108.925048828125,"y":439.8000183105469,"name":"Out","alignment":"right","parentNode":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","links":["f2b53889-afa5-45ea-b3ef-e5ed0a5e3430"],"in":false,"label":"Out","hideLabel":false},{"id":"ea191c95-7f57-4834-9677-1af07d1e5008","type":"port.parameter","x":666.0250244140625,"y":238.89999389648438,"name":"LowerHSV","alignment":"top","parentNode":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","links":["29aa6d3f-d87f-40d1-9773-86e03b4f5edd"],"in":true,"label":"LowerHSV","hideLabel":false},{"id":"1e33f8c0-bc13-43f7-a362-2e909755fb96","type":"port.parameter","x":902.4500122070312,"y":238.89999389648438,"name":"UpperHSV","alignment":"top","parentNode":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","links":["f024ae7b-c28a-4356-972a-51124d4e9a12"],"in":true,"label":"UpperHSV","hideLabel":false}],"data":{"code":"import cv2\nimport numpy as np\n\ndef main(inputs, outputs, parameters, synchronise):\n lower_hsv = np.array([int(x.strip()) for x in parameters.read_string('LowerHSV').split(',')])\n upper_hsv = np.array([int(x.strip()) for x in parameters.read_string('UpperHSV').split(',')])\n\n auto_enable = False\n try:\n enable = inputs.read_number('Enable')\n except Exception:\n auto_enable = True\n\n while (auto_enable or inputs.read_number('Enable')):\n frame = inputs.read_image('Img')\n if frame is None:\n continue\n \n hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n mask = cv2.inRange(hsv, lower_hsv, upper_hsv)\n filtered = cv2.bitwise_and(frame, frame, mask= mask)\n\n outputs.share_image('Out', filtered)\n synchronise()\n\n","frequency":"30","params":[{"name":"LowerHSV"},{"name":"UpperHSV"}],"ports":{"in":[{"name":"Img"},{"name":"Enable"}],"out":[{"name":"Out"}]},"size":{"width":"800px","height":"500px"}}},"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a":{"id":"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a","type":"basic.output","selected":false,"x":1262,"y":410,"ports":[{"id":"77f63673-4d28-4fe4-8390-a7cc6d064c3e","type":"port.input","x":1263,"y":430.3000183105469,"name":"output-in","alignment":"left","parentNode":"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a","links":["f2b53889-afa5-45ea-b3ef-e5ed0a5e3430"],"in":true,"label":"output-in","hideLabel":true}],"data":{"name":"Out"}},"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223":{"id":"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223","type":"basic.constant","selected":false,"x":614,"y":9,"ports":[{"id":"f58f68f5-9591-4141-b84f-aad69d522b8b","type":"port.output","x":667.5,"y":119.60000610351562,"name":"constant-out","alignment":"bottom","parentNode":"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223","links":["29aa6d3f-d87f-40d1-9773-86e03b4f5edd"],"in":false,"label":"LowerHSV","hideLabel":true}],"data":{"name":"LowerHSV","value":"40,50,0","local":true}},"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c":{"id":"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c","type":"basic.constant","selected":false,"x":859,"y":9,"ports":[{"id":"44350951-00fb-494f-a26a-ccfd3fad09ed","type":"port.output","x":912.5,"y":119.60000610351562,"name":"constant-out","alignment":"bottom","parentNode":"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c","links":["f024ae7b-c28a-4356-972a-51124d4e9a12"],"in":false,"label":"UpperHSV","hideLabel":true}],"data":{"name":"UpperHSV","value":"140,255,255","local":true}},"c09f1884-9459-4d97-afb2-e18423baaad4":{"id":"c09f1884-9459-4d97-afb2-e18423baaad4","type":"basic.input","selected":false,"x":256,"y":336,"ports":[{"id":"3418db32-04a5-4947-ac2c-539050e7268c","type":"port.output","x":342,"y":356.3000183105469,"name":"input-out","alignment":"right","parentNode":"c09f1884-9459-4d97-afb2-e18423baaad4","links":["c046f835-af18-44d1-8ad8-ab977f11181d"],"in":false,"label":"Img","hideLabel":true}],"data":{"name":"Img"}},"9abae2c8-0fad-4b70-a518-312b10f59b96":{"id":"9abae2c8-0fad-4b70-a518-312b10f59b96","type":"basic.input","selected":false,"x":249,"y":510,"ports":[{"id":"60f3b663-30ce-40a5-bc78-15414f26fc43","type":"port.output","x":335,"y":530.2999877929688,"name":"input-out","alignment":"right","parentNode":"9abae2c8-0fad-4b70-a518-312b10f59b96","links":["d1b4f01d-4dbb-454b-8f44-9e162e7a3f45"],"in":false,"label":"Enable","hideLabel":true}],"data":{"name":"Enable"}}}}]},"version":"3.0","package":{"name":"ColorFilter","version":"2.0.0","description":"Filters a Color in an Image","author":"Muhammad Taha Suhail, Suhas Gopal","image":"data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FwYV8xIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MDAuMjM4IDUwMC4yMzgiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTAwLjIzOCA1MDAuMjM4IiB3aWR0aD0iNTEyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im00NjIuNzAyIDE3OS44ODQtMjUuODI3LTIzLjA2My01Mi42MjMgMjAuMjI0LTcuMTYgMjkuNTQ4LTI3LjUxOSAxMjQuODM4IDg5LjM2IDM4LjkyOSAxMS4wODktMTQuMzE3YzE1LjMtMzEuMzggMjMuODgtNjYuNjQgMjMuODgtMTAzLjkxIDAtMjUuMTg5LTMuOTQtNDkuNDU5LTExLjItNzIuMjQ5eiIgZmlsbD0iI2ZlN2Q0MyIvPjxnPjxnIGlkPSJYTUxJRF84NTVfIj48Zz48cGF0aCBkPSJtMzcwLjcgMzE2LjI4NC0zMS4zNjIgMTUuMTQ4LTgwLjYyOCA1Ni43OTIgMzUuOTM1IDgwLjE3MyAyNS42NTUgNi4zNTd2LjAxYzU3LjMzLTIxLjMyIDEwMy40NjItNjQuODMgMTMwLjA0Mi0xMTkuMzh6IiBmaWxsPSIjZWU2MTYxIi8+PHBhdGggZD0ibTI4OS41OSAzOTAuNTE0LTE3LjEwNy0xMS45OTEtMTAyLjIzMy0xNS41MjYtNDkuMTE4IDc4LjkxMSAyMi42MDkgMjguNDc2di4wMWMyOC43NiAxMi4zNyA2MC40NSAxOS4yMiA5My43NCAxOS4yMiAyOS4xMyAwIDU3LjAzLTUuMjQgODIuODItMTQuODV2LS4wMXoiIGZpbGw9IiNjMmExZDUiLz48cGF0aCBkPSJtMTc0Ljk2MSAzNjAuOTc4LTU2LjgyNC04OS4yNjQtOTkuMTQ3IDMwLjY3NXY0Mi45NTRjMjMuOTMgNTYuMDMgNjguNzkgMTAwLjk5IDEyNC43NSAxMjUuMDV2LS4wMWwzNS45My04Mi4xNnoiIGZpbGw9IiM4YWM5ZmUiLz48cGF0aCBkPSJtNDEuOTgyIDEzOC45NC0yNi45MjIgMjkuODM0aC0uMDFjLTkuNzMgMjUuOTQtMTUuMDUgNTQuMDMtMTUuMDUgODMuMzYgMCAzMy4wOSA2Ljc3IDY0LjU5IDE4Ljk5IDkzLjIxaC4wMWw4Mi43MS0zNC42NCAxMC44MTQtMjQuODQgNi40OTMtMTIyLjE4NnoiIGZpbGw9IiM3NWNkZDUiLz48cGF0aCBkPSJtMTgxLjkxNiAzOC4yODRoLTQ3LjgzNmMtNTQuNjIgMjYuNDYtOTcuNTcgNzMuMjItMTE5LjAzIDEzMC40OWguMDFsODMuNzUgMzIuMDIgNTQuNzYtMjcuNzIyIDcyLjQxOC02NS4xNDN6IiBmaWxsPSIjNmNmNWMyIi8+PHBhdGggZD0ibTM3OC4xNSAyMDYuNTk0LTQuMzg3LTE5LjUwNi01NC4wNjEgMTMuNzA2LTIuOTEyIDI0Ljk1YzIuNzcgOC4yOSA0LjI2IDE3LjE3IDQuMjYgMjYuMzkgMCAxMi43Ni0yLjg2IDI0Ljg0LTcuOTcgMzUuNjVsMS4xNyAxOS45MDcgMzUuMzIzIDE4Ljc5NyAyMS4xMjYtMTAuMjA0YzkuMzYtMTkuNCAxNC42MS00MS4xNiAxNC42MS02NC4xNS4wMDEtMTUuODktMi41MTktMzEuMTktNy4xNTktNDUuNTR6IiBmaWxsPSIjZmQ2OTMwIi8+PHBhdGggZD0ibTMxMy4wOCAyODcuNzg0Yy05LjEzIDE5LjMzLTI1LjQ1IDM0LjU5LTQ1LjUxIDQyLjMzbC03LjcxMSAxNC41MDUgMTYuMDczIDQxLjE2IDEzLjY1OCA0LjczNWMzNS42My0xMy40MiA2NC43LTQwLjE5IDgxLjExLTc0LjIzeiIgZmlsbD0iI2U5NDQ0NCIvPjxwYXRoIGQ9Im0yNjcuNTcgMzMwLjExNGMtOS4zMyAzLjYxLTE5LjQ4IDUuNTktMzAuMDkgNS41OS0xMS4zNiAwLTIyLjE4LTIuMjYtMzIuMDUtNi4zOGwtMTYuODY1IDEuODI4LTIwLjA2IDQwLjg5NiAxMS4xNjUgMTYuMTc2YzE3Ljc2IDcuNTYgMzcuMyAxMS43NCA1Ny44MSAxMS43NCAxOC4zNCAwIDM1LjktMy4zNCA1Mi4xMS05LjQ1eiIgZmlsbD0iI2EyNzRiZiIvPjxwYXRoIGQ9Im0xNjEgMjg1Ljg2NC0xMy4xOTUtOS41NDEtNDMuMDYxIDE0LjkyMi0zLjAzNCAxOS40NTljMTUuMDMgMzQuODEgNDMuMDUgNjIuNjggNzcuOTYgNzcuNTJsMjUuNzYtNTguOWMtMTkuODEtOC4yMi0zNS43OC0yMy44Ny00NC40My00My40NnoiIGZpbGw9IiMyNmE2ZmUiLz48cGF0aCBkPSJtMzUxLjMzIDQzLjY4NGMtMzMuOC0xOC41LTcyLjYtMjkuMDMtMTEzLjg1LTI5LjAzLTM3LjA3IDAtNzIuMTUgOC40OS0xMDMuNCAyMy42M2wzOC41MSA4MSAzOC4yNTkgMTcuMTU4IDEyMC4zOCAyMC4zOCAzNS4wMjctNzQuMzN6IiBmaWxsPSIjZmVlOTdkIi8+PC9nPjwvZz48L2c+PHBhdGggZD0ibTQ5OS44ODIgMTYxLjUzNGMxLjE5IDMuNDMtLjcxIDcuMTYtNC4xNyA4LjI0bC0zMi40IDEwLjExLTYxLjM3IDE5LjE1Yy0xMy43Mi00Mi42NC00My41LTc4LjA3LTgyLjI0LTk5LjE1bDMxLjE4LTU2LjIgMTYuNS0yOS43NGMxLjc0LTMuMTUgNS43NC00LjI2IDguODUtMi40NSA1Ny4zNiAzMy4yNSAxMDEuNzMgODYuNDIgMTIzLjY1IDE1MC4wNHoiIGZpbGw9IiNmZWMxNjUiLz48cGF0aCBkPSJtMTUzLjkxIDI1Mi4xMzRjMC05Ljk3IDEuNzQtMTkuNTMgNC45NS0yOC4zOWwtLjczOC0zNC44MzVoLTM1LjgzNWwtMjMuNDc3IDExLjg4NWMtNS45MiAxNS45OS05LjE2IDMzLjI5LTkuMTYgNTEuMzQgMCAyMC44MSA0LjMgNDAuNjEgMTIuMDYgNTguNTdsNTkuMjktMjQuODRjLTQuNTYtMTAuMzEtNy4wOS0yMS43Mi03LjA5LTMzLjczeiIgZmlsbD0iIzJhYmNjOCIvPjxwYXRoIGQ9Im0yMDIuNTg4IDEyOC45NzctMjkuOTk5LTkuNjk0Yy0zMy45MyAxNi41OC02MC41NiA0NS43OS03My43OCA4MS41MWw2MC4wNSAyMi45NWM3LjMyLTIwLjI2IDIyLjI0LTM2Ljg4IDQxLjMzLTQ2LjQxdi0uMDFsMTMuNzU2LTE1LjQ4OXoiIGZpbGw9IiMwMGYyYTYiLz48cGF0aCBkPSJtMzA3Ljg0IDEyMi4wODQtLjAxMy0uMDAyYy0yMC45MTktMTEuMzM5LTQ0Ljg3OC0xNy43NzgtNzAuMzQ3LTE3Ljc3OC0yMy4yOCAwLTQ1LjMgNS4zOC02NC44OSAxNC45OGwyNy42IDU4LjA1YzExLjIyLTUuNiAyMy44OS04Ljc3IDM3LjI5LTguNzcgMTQuMTYgMCAyNy40OSAzLjUyIDM5LjE3IDkuNzRsMjEuMDMyIDEuMDM1IDIwLjU3OS0yNy40Mzh6IiBmaWxsPSIjZmVkZjMwIi8+PHBhdGggZD0ibTQwMS45NDIgMTk5LjAzNC0yNC4yNCA3LjU2LTYwLjkxMiAxOS4xNWMtNi44MS0yMC40OS0yMS42ODYtMzcuNjMzLTQwLjQ4Ni00Ny42MjNsMzEuMDg4LTU2LjAzNyAxMi4zMS0yMi4yYzM4Ljc0IDIxLjA4IDY4LjUyIDU2LjUxIDgyLjI0IDk5LjE1eiIgZmlsbD0iI2ZkYjQ0MSIvPjwvc3ZnPg=="},"design":{"board":"Python3-Noetic","graph":{"blocks":[{"id":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","type":"basic.code","data":{"code":"import cv2\nimport numpy as np\n\ndef main(inputs, outputs, parameters, synchronise):\n lower_hsv = np.array([int(x.strip()) for x in parameters.read_string('LowerHSV').split(',')])\n upper_hsv = np.array([int(x.strip()) for x in parameters.read_string('UpperHSV').split(',')])\n\n auto_enable = False\n try:\n enable = inputs.read_number('Enable')\n except Exception:\n auto_enable = True\n\n while (auto_enable or inputs.read_number('Enable')):\n frame = inputs.read_image('Img')\n if frame is None:\n continue\n \n hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\n mask = cv2.inRange(hsv, lower_hsv, upper_hsv)\n filtered = cv2.bitwise_and(frame, frame, mask= mask)\n\n outputs.share_image('Out', filtered)\n synchronise()\n\n","frequency":"30","params":[{"name":"LowerHSV"},{"name":"UpperHSV"}],"ports":{"in":[{"name":"Img"},{"name":"Enable"}],"out":[{"name":"Out"}]},"size":{"width":"0px","height":"0px"}},"position":{"x":459,"y":169}},{"id":"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a","type":"basic.output","data":{"name":"Out"},"position":{"x":1262,"y":410}},{"id":"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223","type":"basic.constant","data":{"name":"LowerHSV","value":"40,50,0","local":true},"position":{"x":614,"y":9}},{"id":"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c","type":"basic.constant","data":{"name":"UpperHSV","value":"140,255,255","local":true},"position":{"x":859,"y":9}},{"id":"c09f1884-9459-4d97-afb2-e18423baaad4","type":"basic.input","data":{"name":"Img"},"position":{"x":256,"y":336}},{"id":"9abae2c8-0fad-4b70-a518-312b10f59b96","type":"basic.input","data":{"name":"Enable"},"position":{"x":249,"y":510}}],"wires":[{"source":{"block":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","port":"Out","name":"Out"},"target":{"block":"9b1ae75f-6c7b-42c6-95dd-e1963075ca5a","port":"output-in","name":"output-in"}},{"source":{"block":"0005-a22208b5-a98d-4cfb-ae8a-6109c9bd9223","port":"constant-out","name":"LowerHSV"},"target":{"block":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","port":"LowerHSV","name":"LowerHSV"}},{"source":{"block":"0006-6acdc2b3-77a3-4046-b706-299b5fe9194c","port":"constant-out","name":"UpperHSV"},"target":{"block":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","port":"UpperHSV","name":"UpperHSV"}},{"source":{"block":"c09f1884-9459-4d97-afb2-e18423baaad4","port":"input-out","name":"Img"},"target":{"block":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","port":"Img","name":"Img"}},{"source":{"block":"9abae2c8-0fad-4b70-a518-312b10f59b96","port":"input-out","name":"Enable"},"target":{"block":"3a57ece2-a293-455f-a70b-bc3bb6c2c18b","port":"Enable","name":"Enable"}}]}},"dependencies":{}} \ No newline at end of file