<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Everything Robotics on Medium]]></title>
        <description><![CDATA[Stories by Everything Robotics on Medium]]></description>
        <link>https://medium.com/@everythingrobotics?source=rss-7bde169c191a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*4vi5WiORuKkwShXtCIn5Ug.png</url>
            <title>Stories by Everything Robotics on Medium</title>
            <link>https://medium.com/@everythingrobotics?source=rss-7bde169c191a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 30 May 2026 10:28:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@everythingrobotics/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 2 — Read and decode a QR Code…]]></title>
            <link>https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-2-read-and-decode-a-qr-code-a8707f362c2e?source=rss-7bde169c191a------2</link>
            <guid isPermaLink="false">https://medium.com/p/a8707f362c2e</guid>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[robot-operating-system]]></category>
            <category><![CDATA[opencv]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Everything Robotics]]></dc:creator>
            <pubDate>Thu, 08 Jul 2021 12:45:52 GMT</pubDate>
            <atom:updated>2021-07-08T12:45:52.734Z</atom:updated>
            <content:encoded><![CDATA[<h3>Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 2 — Read and decode a QR Code present in Gazebo with pyzbar library</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kTWjNfczXjocfQxNe2n3Pg.png" /></figure><p>We’ll be expanding on the code that we built in Part — 1 of this series. If you haven’t tried that out, make sure you go back, try, and come back here!</p><p><strong>Link to Part — 1 of this series</strong></p><p><a href="https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-1-display-real-time-video-feed-dc5ebd79e0d9">Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 1 — Display real-time video feed…</a></p><p><strong>Link to GitHub repo</strong></p><p>It contains all the scripts, models and world files that are used in this tutorial series.</p><p><a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch">dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch</a></p><h3>Launching the gazebo world</h3><p>Before running the next command make sure you have run <strong>git pull</strong> and sourced the <strong>setup.bash</strong> file that’s in <strong>{your_workspace_name}/devel/ </strong>folder.</p><p>Then, to launch the gazebo world, run this command in terminal.</p><p><strong>$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 2_world.launch</strong></p><p>This should launch a gazebo world that has a wall with QR code on it and a camera. It should look something like this…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SFIZYSgATyTf_GzacT70qQ.png" /></figure><p>If you can see this, Congrats! You have set everything correctly as of now.</p><p>Alternatively, if you want to launch gazebo world and start running the script out of the box. Then run</p><p><strong>$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 2_world_and_script.launch</strong></p><p>If you wanna know how the code works, then continue reading…</p><h3>Image preprocessing</h3><p>Before jumping on to the code, you gotta know about this thing called image preprocessing. It is something that we have to do to get meaningful data out of the raw camera output. Here’s an <a href="https://towardsdatascience.com/image-pre-processing-c1aec0be3edf">article on ‘Image pre-processing’</a> that I personally found useful. We’d be using some very basic preprocessing techniques in this tutorial. Below, I’ve discussed one of many ways to preprocess images to decode QR codes.</p><ol><li>Convert the image to a grayscale image with <strong>COLOR_BGR2GRAY</strong> function that’s available in cv2</li><li>Since QR Codes are generally made up of two colors, we can make use of the <a href="https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html">threshold function</a>. With that function, we can convert grayscale image that we obtained above, to a binary image that only has two colours, black and white.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4vKbKogZcF6YPPc2QDpKOA.png" /><figcaption>Left — Camera output window | Middle — The image after using COLOR_BGR2GRAY function | Right — After using ‘threshold’ function</figcaption></figure><p>Notice how clear the image is, after preprocessing. Now let’s move on to the code</p><h3>The Code — Explained.</h3><p>Since we are building up on the code that we discussed in <a href="https://dhanuzch.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-1-display-real-time-video-feed-a98c078c708b">Part — 1</a>, I’ll be focusing only on the changes that were made.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2f33620188248145eb6c9c0632f2144c/href">https://medium.com/media/2f33620188248145eb6c9c0632f2144c/href</a></iframe><p>This code is also available as a part of a package in <a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch">my GitHub repo</a></p><h4>pyzbar library</h4><p>This library is is used to decode QR codes and barcodes, To learn more about this library, take a look at this <a href="https://learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/">article</a>.</p><p><strong>line 8</strong>imports the decode function that is available in pyzbar library.</p><h4>Image preprocessing</h4><p><strong>line 29</strong>is to convert the resized_image to a grayscale image.</p><p><strong>line 30</strong> is to set a value for threshold. Note that threshold value depends on a lot of factors. And I’ve set it to 40. To learn about it in depth, take a look at the <a href="https://docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html">official guide</a>.</p><p><strong>line 31</strong> converts the grayscale image to a binary image. Here, thresh,255means all pixel values above 40, will be set to 255(white).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iIW9q6FbBAO3pIc9i-wSjg.png" /><figcaption>In order Left to Right. thresh=0, thresh=40, thresh=120, thresh=255</figcaption></figure><p>Since the lighting conditions and the QR code is stable in this tutorial, we are taking this approach. But in real life using adaptive thresholding or other techniques might be the best bet.</p><h4>Decoding</h4><p><strong>line 36 </strong>is the simplest 😛. All you have to do is call decode function with the image as an argument and the rest will be taken care by the pyzbar library. This will return decoded results.</p><p><strong>line 38</strong>prints the decoded results.</p><p>The decoded result is as follows…</p><pre>[Decoded(data=&quot;You&#39;re breathtaking!&quot;, type=&#39;QRCODE&#39;, rect=Rect(left=100, top=278, width=216, height=214), polygon=[Point(x=100, y=278), Point(x=100, y=490), Point(x=316, y=492), Point(x=315, y=278)])]</pre><p>Doesn’t our output contain too many information?</p><p>To print just the decoded data. Let’s insert the following lines in our script.</p><pre>qr_data = qr_result[0].data<br>print qr_data</pre><p>Alright, this gives us the desired output. Which is… “You’re breathtaking” :) Don’t believe me? Here’s the output xD</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eqSXk6zl3042hHriMFtJfA.png" /></figure><p>Isn’t it slightly inconvenient to get the desired output in the terminal?</p><p>So, next we will try to print the data in Camera output window.</p><h4>Drawing and writing meaningful stuff in cv window</h4><p>Next, our goal is to draw a box over the detected QR Code and print the message on top of the box.</p><p><strong>line 43 </strong>gets the position of QR code in window from qr_result</p><p>With the rectangle function available in cv2 and data obtained from line 43, <strong>line 45</strong>draws a rectangle around the QR code of colour red (0, 0, 255) and thickness 4</p><p><strong>line 47 </strong>defines the format to print the data of QR Code</p><p><strong>line 48 </strong>prints the data of QR code 10 pixels above the box. This is defined with (x, y-10), Font type is Hershey simplex. Colour is red (0, 0, 255) and thickness is 2. All these details will be printed in the window that displays resized_image</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/811/1*dZikrLLxFMZHs8GZKpUumw.png" /><figcaption>Yes senpai! You’re breathtaking :p</figcaption></figure><p>Now, try it with other QR codes. And see if the code works…</p><p>Lemme know in comments if you have any doubts or face difficulties. And also make sure to comment, what my next tutorial should be about!</p><p>That’s it for this series guys!</p><p>Bye!</p><h3>Follow us for Robotics Memes — News — Tips — Projects &amp; More</h3><p><a href="https://www.instagram.com/everythingrobotics/">https://www.instagram.com/everythingrobotics/</a></p><ul><li><a href="https://github.com/dhanuzch">dhanuzch - Overview</a></li><li><a href="https://clubhouse.com/club/the-india-roboticist">Everything Robotics</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a8707f362c2e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 1 — Display real-time video feed…]]></title>
            <link>https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-1-display-real-time-video-feed-dc5ebd79e0d9?source=rss-7bde169c191a------2</link>
            <guid isPermaLink="false">https://medium.com/p/dc5ebd79e0d9</guid>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[opencv]]></category>
            <category><![CDATA[robot-operating-system]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Everything Robotics]]></dc:creator>
            <pubDate>Tue, 06 Jul 2021 11:56:19 GMT</pubDate>
            <atom:updated>2021-07-08T12:46:13.766Z</atom:updated>
            <content:encoded><![CDATA[<h3>Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 1 — Display real-time video feed of 2D camera in gazebo</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EZ2ddmpekbFDbndGD3UlTw.png" /></figure><p>I hope you have everything set up. If you haven’t, follow Part — 0 of this series to set it up, and come back here.</p><p><strong>Link to Part — 0 of this series</strong></p><p><a href="https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-0-getting-everything-set-up-445889573898">Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 0 — Getting everything set up</a></p><p><strong>Link to GitHub repo</strong></p><p>It contains all the scripts, models and world files that are used in this tutorial series.</p><p><a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch">dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch</a></p><h3>Launching the gazebo world</h3><p>Before running the next command make sure you have run <strong>git pull</strong> and sourced the <strong>setup.bash</strong> file that’s in <strong>{your_workspace_name}/devel/ </strong>folder.</p><p>Then, to launch the gazebo world, run this command in terminal.</p><p><strong>$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 1_world.launch</strong></p><p>This should launch gazebo world that has a pine tree, a camera and a turtlebot. It should look something like this…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8mDpFfJwcA-jMaXER1kMzQ.png" /></figure><p>If you can see this, Congrats! You have set everything correctly as of now.</p><p>Alternatively, if you want to launch gazebo world and start running the script out of the box. Then run</p><p><strong>$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 1_world_and_script.launch</strong></p><p>If you wanna know how the code works, then continue reading…</p><h3>The Code — Explained.</h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c0ec813ec4e06e636c8e2468f2aaeb69/href">https://medium.com/media/c0ec813ec4e06e636c8e2468f2aaeb69/href</a></iframe><p>This code is available as a part of a package in <a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch">my GitHub repo</a></p><p>To run this script, run this command in terminal…</p><pre><strong>$ rosrun pkg_cv_ros_tutorial_by_dhanuzch camera_read.py</strong></pre><h4>Importing the libraries</h4><p><strong>line 1</strong> It’s called shebang (or) hashbang, and with it you’re telling your machine to use a specific interpreter. This is required in ROS because our script will be run as an executable. <em>Without this your script will not be executed properly.</em></p><p><strong>line 3&amp;4 </strong>rospy allows us to interface ROS features with python. And cv2 imports the OpenCV library, with which we’ll be doing image processing.</p><p><strong>line 6 </strong>It is ROS package that defines messages for most commonly used sensors. <a href="http://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html">Visit this link to check out the message definition.</a></p><p><strong>line 7</strong> cv_bridge is a package that converts ROS image messages to <a href="https://docs.opencv.org/3.4/d6/d5b/structIplImage.html">openCV images</a> and vice versa. Keep reading to know how we implement it.</p><h4>main() function and __init__ function</h4><p><strong>line 42 </strong>initializes a ROS node with the name <strong>camera_read . </strong>When <strong>anonymous = True</strong> a random number is assigned to the end of the node name to make it unique. Since we just have one node with the same name, anonymous is set to False.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1021/1*nW-Se3cARxgEgahokIEB6A.png" /><figcaption>Top set is when anonymous=False, Bottom set is when anonymous=True</figcaption></figure><p><strong>line 43 </strong>calls the main function.</p><p>When the main function is called…</p><p><strong>line 32 </strong>invokes the<strong><em> </em></strong><em>__init__ </em>function of class camera_1, this function creates an instance variable called image_sub, and it subscribes to /camera_1/image_raw topic.</p><p>That topic has message of type Image<strong> </strong>, and every time a new message arrives it calls the callback()<strong> </strong>function.</p><p><strong>line 35 </strong>keeps the ROS node from shutting down, and it will yield activity to other threads.</p><p><strong>line 39</strong>destroys all the openCV windows that were created.</p><h4>callback() function</h4><p>Finally we will look at the function that gets the job done.</p><p><strong>line 18</strong> converts the ROS image message to cv2 image with bgr8 encoding.</p><p>For example, let’s say if you want to convert a RGB image to a grayscale image, you may use mono8 instead of bgr8. If you’re unsure of this you may set the value as desired_encoding= “passthrough”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/789/1*bKU-94bWlI4wxNQwQZhaMg.png" /><figcaption>Here’s a list of all the encodings that are available</figcaption></figure><p><strong>line 24 </strong>the image output is resized to 360 X 640 pixels. If we try to display the output of camera without downscaling, chances are it will be too big for the display and you might not be able to see the full window.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qxqTUlE-yHoLJv37aLFeYA.png" /><figcaption>Side by side comparison of a downscaled output window and output that’s not downscaled.</figcaption></figure><p>If you see in the above image, the bottom part of the output is cut off. So it is advisable to downscale the image.</p><p><strong>line 27 </strong>the resized image is displayed, and the name of the window is set to &quot;Camera output resized&quot;</p><h3>Follow us for Robotics Memes — News — Tips — Projects &amp; More</h3><p><a href="https://www.instagram.com/everythingrobotics/">https://www.instagram.com/everythingrobotics/</a></p><ul><li><a href="https://github.com/dhanuzch">dhanuzch - Overview</a></li><li><a href="https://clubhouse.com/club/the-india-roboticist">Everything Robotics</a></li></ul><h3>What’s next?</h3><p>In the Final part of this series, we will be scanning a QR code that’s in a Gazebo world.</p><p><a href="https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-2-read-and-decode-a-qr-code-a8707f362c2e">Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 2 — Read and decode a QR Code…</a></p><p>Ask your questions in the comments section! Bye :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dc5ebd79e0d9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 0 — Getting everything set up]]></title>
            <link>https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-0-getting-everything-set-up-445889573898?source=rss-7bde169c191a------2</link>
            <guid isPermaLink="false">https://medium.com/p/445889573898</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[robot-operating-system]]></category>
            <category><![CDATA[opencv]]></category>
            <category><![CDATA[robotics]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Everything Robotics]]></dc:creator>
            <pubDate>Sat, 13 Feb 2021 16:19:58 GMT</pubDate>
            <atom:updated>2021-07-08T12:42:57.794Z</atom:updated>
            <content:encoded><![CDATA[<h3>Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 0 — Getting everything set up</h3><h3>Intro</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zXdkLLruMfgsltZxx91R1Q.png" /></figure><p>This will be a three part series, in which I’ll help you to use OpenCV with Gazebo in ROS (Robot Operating System)</p><ul><li><strong>Part 0 — </strong>Getting everything set up</li><li><strong>Part 1 — </strong>Display real-time video feed of 2D camera in gazebo</li><li><strong>Part 2 — </strong>Read and<strong> </strong>decode a QR Code present in Gazebo with pyzbar library</li></ul><p>Alrighty! Let’s get started with Part 0. Oh wait. Why did I start with Part 0 instead of Part 1 tho? Coz I wanted to flex on ’em non-CS folks and confuse them xD</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*Nssk_S4-mJgBJfZokLvubw.jpeg" /></figure><h3>Getting things in order</h3><h4>1. Installing Gazebo</h4><p>Assuming you have ROS and Gazebo installed, I’ll move forward with this tutorial. If you’re not sure if Gazebo is installed, type <strong>gazebo</strong> in terminal. It should open a window like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EMocdmsIE6ejOdkUihbQDg.png" /><figcaption>An empty Gazebo world</figcaption></figure><p>If you don’t get a screen like this, follow the <a href="http://gazebosim.org/tutorials?cat=guided_b&amp;tut=guided_b1">official tutorial in this link to install gazebo on your machine</a></p><h4>2. Installing OpenCV</h4><p>Once you’re done with that, you gotta install <em>OpenCV</em>. To do that run the following command in terminal</p><pre><strong>$ sudo apt-get install libopencv-dev python-opencv</strong></pre><h4>3. Installing pyzbar</h4><p>Up next, we have to install a python library called <em>pyzbar </em>that allows us to scan barcodes and QR codes using 2D camera. We will be using <em>pyzbar</em> in part 2 of this series.</p><p>To install, run this command in terminal.</p><pre><strong>$ pip install pyzbar</strong></pre><p>If you haven’t installed <em>pip</em> on you machine, run this command in terminal.</p><pre><strong>$ sudo apt install python-pip</strong></pre><h4>4. Installing cv_bridge</h4><p>Finally, to install <em>cv_bridge</em> run these commands separately in terminal.</p><pre><strong>$ sudo apt-get install ros-$ROS_DISTRO-vision-opencv</strong></pre><pre><strong>$ sudo apt-get install ros-$ROS_DISTRO-cv-bridge</strong></pre><p>We’ll see more about this package in the upcoming section.</p><h4>5. Using my customized ROS package</h4><p>All the scripts, models and world files used in this series are available in my repository as a ROS Package.</p><p><strong>Link to GitHub Repo</strong></p><p><a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch">dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch</a></p><p>Alternatively, you can clone it to your PC by running this command in src folder of your workspace(for example, catkin_ws/src)</p><pre><strong>$ git clone </strong><a href="https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch.git"><strong>https://github.com/dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch.git</strong></a></pre><p>And then compile the package by running <strong>catkin build </strong>or <strong>catkin_make </strong>, This depends on which build system you use. I personally prefer<strong>catkin build </strong>over <strong>catkin_make </strong>because it has additional functionalities and really useful tools that <strong>catkin_make</strong>doesn’t offer.</p><p><a href="https://catkin-tools.readthedocs.io/en/latest/migration.html#additional-differences-with-catkin-build">To learn more about the differences between these two</a></p><h3>Intro to cv_bridge</h3><p>Most of you reading this might know what ROS is and how fast the number of ROS powered robots is growing day by day. Nowadays, ROS is being used in NASA’s Rovers, vaccuum cleaners and even in boring industrial robots :p</p><p>And robot vision is a key aspect in Robotics, Many robots use 3D depth sensors and other sensors such as LIDARs and RADARs to perceive the world. Similiarly 2D cameras are used in robots for various objectives and tasks. Using 2D cameras has its own set of advantages that other sensors simply can’t provide.</p><p>OpenCV is a tool that allows us to process images from those cameras and it enables us to recognize faces, objects and texts and finally what we will be doing in this tutorial series — <em>decode QR Codes</em>. There are so many applications to openCV, just a simple google search will give you an idea of the features and functionalities of openCV.</p><p><strong><em>cv_bridge</em></strong> allows us to use those functionalities and features in our robots that run on ROS. In other words, it bridges the gap between ROS and openCV, allowing us to use and explore a whole array of features related to robot vision.</p><h3>Follow us for Robotics Memes — News — Tips — Projects &amp; More</h3><p><a href="https://www.instagram.com/everythingrobotics/">https://www.instagram.com/everythingrobotics/</a></p><ul><li><a href="https://github.com/dhanuzch">dhanuzch - Overview</a></li><li><a href="https://clubhouse.com/club/the-india-roboticist">Everything Robotics</a></li></ul><h3>What’s next?</h3><p>In the next part of this series, we will be using <em>cv_bridge</em> to display the output of a camera placed in gazebo world.</p><p><a href="https://everythingrobotics.medium.com/using-opencv-with-gazebo-in-robot-operating-system-ros-part-1-display-real-time-video-feed-dc5ebd79e0d9">Using OpenCV with Gazebo in Robot Operating System (ROS) — Part 1 — Display real-time video feed…</a></p><p>Keep flexing on ’em non CS peeps :)</p><p>Bye!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=445889573898" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>