{"id":1440,"date":"2023-09-21T09:22:39","date_gmt":"2023-09-21T09:22:39","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1440"},"modified":"2023-09-21T09:22:45","modified_gmt":"2023-09-21T09:22:45","slug":"cpp-opencv-guide-advanced-computer-vision","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/","title":{"rendered":"C++ and OpenCV: A Guide to Advanced Computer Vision"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Brief on the Significance of Computer Vision Applications<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Computer vision stands as one of the most revolutionary technologies in the modern day. It is the realm of artificial intelligence that equips machines with the ability to &#8216;see&#8217; and interpret the world similar to the human visual system. From simple tasks like image and video recognition to complex undertakings such as autonomous driving, facial recognition, and augmented reality, the applications of computer vision are vast and growing. It&#8217;s enabling industries like healthcare to detect diseases through medical imaging, retail sectors to enhance customer experiences, and the security domain to ensure robust surveillance. With its wide-ranging implications, computer vision is becoming the cornerstone of the future technological landscape.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Synergy between C++ and OpenCV and its Importance in Real-world Applications<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV, which stands for Open Source Computer Vision Library, is arguably the most potent and popular library for computer vision tasks. Written primarily in C++, it offers a plethora of functionalities that make the development of computer vision applications both efficient and accessible. But why C++? The language&#8217;s performance-centric architecture, combined with its object-oriented nature, ensures that computer vision applications are both fast and scalable. This is particularly crucial for real-time applications, such as video analysis or robotics, where processing speed is paramount.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The synergy between C++ and OpenCV is not merely incidental. OpenCV&#8217;s API, tailored for C++, takes advantage of the language&#8217;s features to provide a seamless programming experience. This synergy amplifies when dealing with intensive tasks like 3D reconstruction, image stitching, or deep learning-based vision tasks. Many real-world applications, from facial recognition systems in smartphones to augmented reality apps and even industrial quality checks, leverage this synergy. It\u2019s this union that ensures developers can craft optimized, robust, and high-performance vision applications ready for the challenges of the modern world.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting Up the Environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Getting started with OpenCV in C++ requires a properly configured environment. By ensuring the software is correctly installed and verified, you can eliminate potential roadblocks down the road.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Installing OpenCV on Windows, Linux, and Mac<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Windows<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Download<\/strong>: Visit the official OpenCV website and download the Windows version of OpenCV.<\/li>\n\n\n\n<li><strong>Extract<\/strong>: Once downloaded, extract the zip file to a location of your choice, e.g., <code>C:\\opencv<\/code>.<\/li>\n\n\n\n<li><strong>Environment Variables<\/strong>: Add the OpenCV <code>bin<\/code> directory to your system&#8217;s PATH, typically found under <code>C:\\opencv\\build\\x64\\vc15\\bin<\/code> (the exact path might differ based on your OpenCV version and Visual Studio version).<\/li>\n\n\n\n<li><strong>Configuration with IDE<\/strong>: If you&#8217;re using Microsoft Visual Studio, you&#8217;ll need to:\n<ul class=\"wp-block-list\">\n<li>Configure project properties to point to OpenCV directories for header files and libraries.<\/li>\n\n\n\n<li>Add library dependencies such as <code>opencv_world430d.lib<\/code> (for debug mode).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Linux<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Package Manager<\/strong>: On many distributions, OpenCV can be installed directly using the package manager, e.g., <code>sudo apt-get install libopencv-dev<\/code> for Debian-based systems.<\/li>\n\n\n\n<li><strong>Building from Source<\/strong>: For the latest version or specific configurations, you might prefer building OpenCV from source. This process typically involves:\n<ul class=\"wp-block-list\">\n<li>Cloning the OpenCV GitHub repository.<\/li>\n\n\n\n<li>Using CMake to configure and generate build files.<\/li>\n\n\n\n<li>Compiling using <code>make<\/code> and installing with <code>make install<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Remember to set the <code>PKG_CONFIG_PATH<\/code> if you install it in a non-default location.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Mac<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Homebrew<\/strong>: The easiest way is to use Homebrew. After installing Homebrew, you can install OpenCV using the command <code>brew install opencv<\/code>.<\/li>\n\n\n\n<li><strong>Building from Source<\/strong>: Just like Linux, you can also build OpenCV from source using CMake and the provided instructions on the OpenCV website.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verifying the Installation<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After you&#8217;ve installed OpenCV, it&#8217;s crucial to verify that everything is working correctly:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Simple Test Program<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a basic C++ program that reads and displays an image using OpenCV.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    cv::Mat image = cv::imread(<span class=\"hljs-string\">\"path_to_image.jpg\"<\/span>);\r\n    <span class=\"hljs-keyword\">if<\/span> (image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error loading image!\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n    cv::imshow(<span class=\"hljs-string\">\"Test Image\"<\/span>, image);\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Compile and Run<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use your development environment to compile and run the program. If everything is set up correctly, the program should display the test image without any errors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integrating OpenCV with C++ IDE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To seamlessly develop OpenCV applications using C++, a proper integration with your preferred Integrated Development Environment (IDE) is crucial. The setup process ensures that your IDE recognizes OpenCV libraries and headers, allowing you to compile and run your projects without hitches.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting up Visual Studio for OpenCV<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Visual Studio<\/strong> is one of the most popular IDEs for C++ development on Windows. Here&#8217;s how to set it up:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create a New Project<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Start Visual Studio and create a new C++ project.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Project Properties<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Right-click on the project in the Solution Explorer and select <strong>Properties<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Configuration Properties<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Navigate to <strong>Configuration Properties<\/strong> &gt; <strong>VC++ Directories<\/strong>.<\/li>\n\n\n\n<li><strong>Include Directories<\/strong>: Add the <code>include<\/code> directory of your OpenCV installation, typically something like <code>C:\\opencv\\build\\include<\/code>.<\/li>\n\n\n\n<li><strong>Library Directories<\/strong>: Add the <code>lib<\/code> directory of your OpenCV installation, for instance, <code>C:\\opencv\\build\\x64\\vc15\\lib<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Linker Settings<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Navigate to <strong>Configuration Properties<\/strong> &gt; <strong>Linker<\/strong> &gt; <strong>Input<\/strong>.<\/li>\n\n\n\n<li><strong>Additional Dependencies<\/strong>: Add the OpenCV library files you need, e.g., <code>opencv_world430.lib<\/code> (the exact name might vary based on your OpenCV version).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Debug vs Release<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Make sure to switch and set up both Debug and Release configurations if necessary. Typically, OpenCV provides libraries for both, with debug libraries having a &#8216;d&#8217; suffix, like <code>opencv_world430d.lib<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Copying DLLs<\/strong>:\n<ul class=\"wp-block-list\">\n<li>For your application to run outside Visual Studio, ensure you copy the required OpenCV DLLs from the <code>bin<\/code> directory (like <code>opencv_world430.dll<\/code>) to your project&#8217;s output directory.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Configuring CMake and Makefile for Linux\/Mac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For those working in <strong>Linux\/Mac<\/strong> environments, using <strong>CMake<\/strong> is a common way to generate makefiles that know how to compile and link against OpenCV libraries:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Install CMake<\/strong>: If not already installed, you can obtain CMake from the official website or use package managers (<code>apt<\/code> for Linux or <code>brew<\/code> for Mac).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CMakeLists.txt<\/strong>: In your project directory, create a <code style=\"font-size: 16px; background-color: rgb(255, 255, 255);\">CMakeLists.txt<\/code> file.Add the following content, adjusting paths if necessary:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CMake\" data-shcb-language-slug=\"cmake\"><span><code class=\"hljs language-cmake\"><span class=\"hljs-keyword\">cmake_minimum_required<\/span>(VERSION <span class=\"hljs-number\">3.0<\/span>)\r\n<span class=\"hljs-keyword\">project<\/span>(YourProjectName)\r\n\r\n<span class=\"hljs-keyword\">find_package<\/span>(OpenCV REQUIRED)\r\n<span class=\"hljs-keyword\">include_directories<\/span>(<span class=\"hljs-variable\">${OpenCV_INCLUDE_DIRS}<\/span>)\r\n\r\n<span class=\"hljs-keyword\">add_executable<\/span>(YourProjectName main.cpp)\r\n<span class=\"hljs-keyword\">target_link_libraries<\/span>(YourProjectName <span class=\"hljs-variable\">${OpenCV_LIBS}<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CMake<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cmake<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Generate Makefile and Build<\/strong>: In the terminal, navigate to your project directory. Run the following commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">mkdir build\r\n<span class=\"hljs-built_in\">cd<\/span> build\r\ncmake ..\r\nmake<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Run Your Application<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After successfully building, you can run your application with <code>.\/YourProjectName<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remember, the exact paths and library names might vary based on the version of OpenCV you&#8217;ve installed and your system setup. Always refer to official documentation or your installation paths in case of discrepancies. With your IDE set up and integrated with OpenCV, you&#8217;re primed to develop and deploy high-performance computer vision applications using C++.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Basic Image Handling in C++<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the fundamental tasks in computer vision is to handle images\u2014be it reading, displaying, or saving them. Thankfully, OpenCV provides intuitive functions to manage these tasks efficiently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reading, Displaying, and Writing Images<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>imread()<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Function to read an image from a file.<\/li>\n\n\n\n<li>Syntax: <code>cv::Mat imread(const String&amp; filename, int flags = IMREAD_COLOR)<\/code>\n<ul class=\"wp-block-list\">\n<li><code>filename<\/code>: Name of the file to be loaded.<\/li>\n\n\n\n<li><code>flags<\/code>: Flags to determine the color type of a loaded image:\n<ul class=\"wp-block-list\">\n<li><code>cv::IMREAD_COLOR<\/code> (default): Loads the image in the BGR 8-bit format.<\/li>\n\n\n\n<li><code>cv::IMREAD_GRAYSCALE<\/code>: Loads the image in grayscale.<\/li>\n\n\n\n<li>Other flags are available for more specific needs.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>imshow()<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Function to display an image in a window.<\/li>\n\n\n\n<li>Syntax: <code>void imshow(const String&amp; winname, InputArray mat)<\/code>\n<ul class=\"wp-block-list\">\n<li><code>winname<\/code>: Name of the window.<\/li>\n\n\n\n<li><code>mat<\/code>: Image to be shown.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>imwrite()<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Function to save an image to a specified file.<\/li>\n\n\n\n<li>Syntax: <code>bool imwrite(const String&amp; filename, InputArray img, const std::vector&lt;int&gt;&amp; params = std::vector&lt;int&gt;())<\/code>\n<ul class=\"wp-block-list\">\n<li><code>filename<\/code>: Name of the file where the image should be saved.<\/li>\n\n\n\n<li><code>img<\/code>: Image to be saved.<\/li>\n\n\n\n<li><code>params<\/code>: Additional parameters (like compression for JPEG images).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Basic Image Viewer<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The following C++ code showcases a simple image viewer that reads an image, displays it, and saves a grayscale version:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-comment\">\/\/ Check for valid command line arguments<\/span>\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Read the image<\/span>\r\n    cv::Mat image = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>]);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Check if the image was loaded successfully<\/span>\r\n    <span class=\"hljs-keyword\">if<\/span>(image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Display the image<\/span>\r\n    cv::imshow(<span class=\"hljs-string\">\"Original Image\"<\/span>, image);\r\n    \r\n    <span class=\"hljs-comment\">\/\/ Convert the image to grayscale<\/span>\r\n    cv::Mat grayscaleImage;\r\n    cv::cvtColor(image, grayscaleImage, cv::COLOR_BGR2GRAY);\r\n    \r\n    <span class=\"hljs-comment\">\/\/ Save the grayscale image<\/span>\r\n    cv::imwrite(<span class=\"hljs-string\">\"grayscale_image.jpg\"<\/span>, grayscaleImage);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Display the grayscale image<\/span>\r\n    cv::imshow(<span class=\"hljs-string\">\"Grayscale Image\"<\/span>, grayscaleImage);\r\n    \r\n    <span class=\"hljs-comment\">\/\/ Wait until a key is pressed<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    \r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To use this viewer, compile the program and then run it, providing the path to an image as a command-line argument.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Color Spaces<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the realm of computer vision and image processing, a color space is a specific way to represent colors as tuples of numbers, typically as three or four values or color components. OpenCV, being a powerful tool, supports a wide variety of color spaces. Understanding these spaces is essential for certain tasks, such as object detection, image segmentation, and more.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">BGR to Grayscale, HSV, LAB<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>BGR<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The default color space in OpenCV for images.<\/li>\n\n\n\n<li>Stands for Blue, Green, and Red channels.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Grayscale<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Represents an image in shades of gray. Each pixel is a single value, representing the brightness of the image at that point.<\/li>\n\n\n\n<li>Useful for reducing computation (single channel instead of three) and for certain algorithms like edge detection.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>HSV<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Stands for Hue, Saturation, and Value (or brightness).<\/li>\n\n\n\n<li>Useful in scenarios like object tracking or segmentation, as hue represents the color, which remains almost unchanged under different lighting conditions.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>LAB (or Lab)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Designed to be perceptually uniform, closely approximating human vision.<\/li>\n\n\n\n<li><code>L<\/code> stands for luminance, <code>a<\/code> and <code>b<\/code> for the color components.<\/li>\n\n\n\n<li>Useful in various applications, including color-based object recognition, due to its characteristic of decoupling intensity from color information.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Color Space Conversion Application<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the image<\/span>\r\n    cv::Mat image = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>]);\r\n    <span class=\"hljs-keyword\">if<\/span>(image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Convert to Grayscale<\/span>\r\n    cv::Mat grayscale;\r\n    cv::cvtColor(image, grayscale, cv::COLOR_BGR2GRAY);\r\n    cv::imshow(<span class=\"hljs-string\">\"Grayscale\"<\/span>, grayscale);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Convert to HSV<\/span>\r\n    cv::Mat hsv;\r\n    cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);\r\n    cv::imshow(<span class=\"hljs-string\">\"HSV\"<\/span>, hsv);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Convert to LAB<\/span>\r\n    cv::Mat lab;\r\n    cv::cvtColor(image, lab, cv::COLOR_BGR2Lab);\r\n    cv::imshow(<span class=\"hljs-string\">\"LAB\"<\/span>, lab);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    \r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When you run this program with an image path as an argument, you&#8217;ll see the original image transformed into each of these color spaces. This application provides a visual sense of how different color spaces represent the same image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s important to note that these transformations don&#8217;t merely rearrange the colors in the original image. Instead, they mathematically recalculate pixel values to represent the same colors in different ways, suited to specific applications in computer vision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Image Processing Techniques: Filters and Blurring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Filtering is a crucial image processing technique that helps in modifying or enhancing an image. Blurring, a form of filtering, is utilized to reduce noise and details in an image. OpenCV provides several methods to perform blurring, which can be specifically tailored to the task at hand.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Filters and Blurring Methods<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>blur()<\/code><\/strong>:\n<ul class=\"wp-block-list\">\n<li>Also known as Averaging.<\/li>\n\n\n\n<li>This function smoothens the image by averaging the pixel values inside a rectangular region.<\/li>\n\n\n\n<li>Syntax: <code>cv::blur(src, dst, Size(k, k))<\/code> where <code>k<\/code> is the size of the kernel (odd integer).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>GaussianBlur()<\/code><\/strong>:\n<ul class=\"wp-block-list\">\n<li>Uses a Gaussian filter for blurring.<\/li>\n\n\n\n<li>The pixel&#8217;s new value is derived from its neighbors, giving more weight to those closer to it based on a Gaussian function.<\/li>\n\n\n\n<li>Syntax: <code>cv::GaussianBlur(src, dst, Size(k, k), sigmaX, sigmaY)<\/code>. The values <code>sigmaX<\/code> and <code>sigmaY<\/code> indicate the standard deviation in the X and Y directions. Often, only <code>sigmaX<\/code> is specified, and <code>sigmaY<\/code> is set to zero.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>medianBlur()<\/code><\/strong>:\n<ul class=\"wp-block-list\">\n<li>Replaces each pixel&#8217;s value with the median of its neighboring pixels.<\/li>\n\n\n\n<li>Especially effective against salt-and-pepper noise.<\/li>\n\n\n\n<li>Syntax: <code>cv::medianBlur(src, dst, k)<\/code> where <code>k<\/code> is the size of the kernel (odd integer greater than 1).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Removing Noise from an Image<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the noisy image<\/span>\r\n    cv::Mat noisyImage = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>]);\r\n    <span class=\"hljs-keyword\">if<\/span>(noisyImage.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n    cv::imshow(<span class=\"hljs-string\">\"Noisy Image\"<\/span>, noisyImage);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Apply averaging blur<\/span>\r\n    cv::Mat averageBlurred;\r\n    cv::blur(noisyImage, averageBlurred, cv::Size(<span class=\"hljs-number\">5<\/span>,<span class=\"hljs-number\">5<\/span>));\r\n    cv::imshow(<span class=\"hljs-string\">\"Averaging Blur\"<\/span>, averageBlurred);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Apply Gaussian blur<\/span>\r\n    cv::Mat gaussianBlurred;\r\n    cv::GaussianBlur(noisyImage, gaussianBlurred, cv::Size(<span class=\"hljs-number\">5<\/span>,<span class=\"hljs-number\">5<\/span>), <span class=\"hljs-number\">0<\/span>);\r\n    cv::imshow(<span class=\"hljs-string\">\"Gaussian Blur\"<\/span>, gaussianBlurred);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Apply median blur<\/span>\r\n    cv::Mat medianBlurred;\r\n    cv::medianBlur(noisyImage, medianBlurred, <span class=\"hljs-number\">5<\/span>);\r\n    cv::imshow(<span class=\"hljs-string\">\"Median Blur\"<\/span>, medianBlurred);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    \r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When this program is executed with a noisy image path as an argument, it will display the original image along with its blurred versions. You can visually compare the results to determine the effectiveness of each method for a specific type of noise. In general, while averaging and Gaussian blur are effective for general noise reduction and smoothing, median blur often excels at removing speckled noise, like salt-and-pepper artifacts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Image Thresholding<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Thresholding is a fundamental image processing technique used to segment objects from the background or to segment regions of interest within an image. By setting a threshold value, pixel intensities below (or above) this value can be changed, effectively creating a binary image where the foreground and background are clearly distinguished.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Thresholding Methods<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Binary Thresholding<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Pixels with intensity values above a certain threshold are set to a maximum value (usually 255 for 8-bit images), and those below are set to 0.<\/li>\n\n\n\n<li>Syntax: <code>cv::threshold(src, dst, thresh, maxValue, cv::THRESH_BINARY)<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Adaptive Thresholding<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Rather than a single global threshold value, adaptive thresholding computes the threshold for smaller regions, allowing for variations in lighting or foreground density.<\/li>\n\n\n\n<li>Syntax: <code>cv::adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Otsu&#8217;s Thresholding<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Automatically determines the optimal threshold value by maximizing the variance between two classes of pixels (foreground and background).<\/li>\n\n\n\n<li>Syntax: <code>cv::threshold(src, dst, 0, maxValue, cv::THRESH_BINARY | cv::THRESH_OTSU)<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Extracting a Feature from an Image<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s consider an example where we want to extract a printed feature (like a logo or text) from a scanned document.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the image<\/span>\r\n    cv::Mat image = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>], cv::IMREAD_GRAYSCALE);\r\n    <span class=\"hljs-keyword\">if<\/span>(image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n    cv::imshow(<span class=\"hljs-string\">\"Original Image\"<\/span>, image);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Binary Thresholding<\/span>\r\n    cv::Mat binaryThresholded;\r\n    cv::threshold(image, binaryThresholded, <span class=\"hljs-number\">127<\/span>, <span class=\"hljs-number\">255<\/span>, cv::THRESH_BINARY);\r\n    cv::imshow(<span class=\"hljs-string\">\"Binary Thresholding\"<\/span>, binaryThresholded);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Adaptive Thresholding<\/span>\r\n    cv::Mat adaptiveThresholded;\r\n    cv::adaptiveThreshold(image, adaptiveThresholded, <span class=\"hljs-number\">255<\/span>, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, <span class=\"hljs-number\">11<\/span>, <span class=\"hljs-number\">2<\/span>);\r\n    cv::imshow(<span class=\"hljs-string\">\"Adaptive Thresholding\"<\/span>, adaptiveThresholded);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Otsu's Thresholding<\/span>\r\n    cv::Mat otsuThresholded;\r\n    cv::threshold(image, otsuThresholded, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, cv::THRESH_BINARY | cv::THRESH_OTSU);\r\n    cv::imshow(<span class=\"hljs-string\">\"Otsu's Thresholding\"<\/span>, otsuThresholded);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    \r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When executed, this program will showcase the original scanned document and its thresholded versions. Depending on the document and its lighting conditions, one of the thresholding methods may prove to be more effective in cleanly extracting the printed feature. In general:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Binary thresholding is simple and fast but might not be ideal if the lighting isn&#8217;t consistent across the image.<\/li>\n\n\n\n<li>Adaptive thresholding is great for images with varying illumination.<\/li>\n\n\n\n<li>Otsu&#8217;s thresholding works well when there&#8217;s a clear bimodal distribution of pixel intensities, making it ideal for many scanned documents with a clear distinction between the text (or logo) and the background.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Image Transformations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Image transformations are fundamental in image processing for tasks like repositioning, scaling, or warping images. Based on their properties and the number of points required to derive the transformation matrix, they can be classified into affine and non-affine (or projective) transformations.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Affine vs. Non-Affine Transformations<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Affine Transformations<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Preserves collinearity (points on a straight line remain on a straight line) and ratios of distances (e.g., midpoints of line segments remain midpoints).<\/li>\n\n\n\n<li>Common operations: translation, rotation, scaling, and shear.<\/li>\n\n\n\n<li>Requires 3 pairs of control points to derive the transformation matrix.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Non-Affine (Projective) Transformations<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Does not preserve parallelism, length, and angle.<\/li>\n\n\n\n<li>Useful for creating perspective effects.<\/li>\n\n\n\n<li>Requires 4 pairs of control points to derive the transformation matrix.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Implementing Image Warp and Perspective Change<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the image<\/span>\r\n    cv::Mat image = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>]);\r\n    <span class=\"hljs-keyword\">if<\/span>(image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n    cv::imshow(<span class=\"hljs-string\">\"Original Image\"<\/span>, image);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Affine Transformation: Image Warp<\/span>\r\n    cv::Point2f source_points&#91;] = { {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>}, {image.cols - <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">0<\/span>, image.rows - <span class=\"hljs-number\">1<\/span>} };\r\n    cv::Point2f destination_points&#91;] = { {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">50<\/span>}, {image.cols - <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">50<\/span>, image.rows - <span class=\"hljs-number\">50<\/span>} };\r\n\r\n    cv::Mat affineMatrix = cv::getAffineTransform(source_points, destination_points);\r\n    cv::Mat warpedImage;\r\n    cv::warpAffine(image, warpedImage, affineMatrix, image.size());\r\n    cv::imshow(<span class=\"hljs-string\">\"Warped Image (Affine Transformation)\"<\/span>, warpedImage);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Non-Affine Transformation: Perspective Change<\/span>\r\n    cv::Point2f source_corners&#91;] = { {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>}, {image.cols - <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">0<\/span>, image.rows - <span class=\"hljs-number\">1<\/span>}, {image.cols - <span class=\"hljs-number\">1<\/span>, image.rows - <span class=\"hljs-number\">1<\/span>} };\r\n    cv::Point2f destination_corners&#91;] = { {<span class=\"hljs-number\">30<\/span>, <span class=\"hljs-number\">30<\/span>}, {image.cols - <span class=\"hljs-number\">60<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">0<\/span>, image.rows - <span class=\"hljs-number\">60<\/span>}, {image.cols - <span class=\"hljs-number\">1<\/span>, image.rows - <span class=\"hljs-number\">30<\/span>} };\r\n\r\n    cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(source_corners, destination_corners);\r\n    cv::Mat perspectiveImage;\r\n    cv::warpPerspective(image, perspectiveImage, perspectiveMatrix, image.size());\r\n    cv::imshow(<span class=\"hljs-string\">\"Perspective Change (Non-Affine Transformation)\"<\/span>, perspectiveImage);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n    \r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this code:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong>affine transformation<\/strong> is applied to create a warp effect. This is achieved by specifying source points and their corresponding points in the transformed image.<\/li>\n\n\n\n<li>A <strong>non-affine transformation<\/strong> creates a perspective change. It uses four pairs of points to define a transformation that provides a kind of 3D effect.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Running this program will help visualize how these transformations modify the original image. While the given values in the control points produce a noticeable effect, you can modify them to see other kinds of transformations or subtle changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feature Detection &amp; Matching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When working with images, especially in applications like image stitching, augmented reality, and object recognition, identifying and matching similar parts or features between images becomes crucial. This process of identifying significant and repeatable parts in an image is termed feature detection, while the process of defining these parts in a way that can be compared and matched is feature description.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Introduction to Keypoints and Descriptors<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Keypoints<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Keypoints are select points in an image that are found to be significant or unique. They typically represent corners, edges, or other interesting parts.<\/li>\n\n\n\n<li>A good keypoint is one that can be reliably detected in multiple images, even with variations in perspective, illumination, or other changes.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Descriptors<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Descriptors define the keypoint in terms of its local neighborhood. By capturing the essence of the keypoint, it allows for comparisons and matching.<\/li>\n\n\n\n<li>A descriptor might use attributes like the gradient, orientation, or color around the keypoint to provide a characteristic fingerprint or signature.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Brief on Features in an Image<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In the context of computer vision and image processing, a &#8220;feature&#8221; refers to a piece of information about the content within an image. This information is typically about a structure or pattern in the image, such as edges, corners, or textures.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Features can be of different types:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Edges<\/strong>: Abrupt changes in intensity or color. These can be detected using operators like Sobel, Canny, etc.<\/li>\n\n\n\n<li><strong>Corners<\/strong>: Points in the image with high variation in intensity in multiple directions. Harris and Shi-Tomasi are popular corner detectors.<\/li>\n\n\n\n<li><strong>Blobs<\/strong>: Regions of the image that differ in properties, like brightness or color, compared to their surroundings. The Laplacian of Gaussian or Difference of Gaussians methods can be used to detect blobs.<\/li>\n\n\n\n<li><strong>Ridges<\/strong>: Similar to edges but represent lines rather than boundaries.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A good feature, in the context of keypoint detection and matching, is one that can be detected in multiple images irrespective of transformations like rotation, scaling, and partial occlusion. The repeatability and distinctiveness of features make them pivotal in tasks like object recognition, panorama stitching, and 3D reconstruction.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Popular Feature Detection Algorithms<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In computer vision, various algorithms are devised to detect and describe features in an image. Some of the algorithms focus more on speed, while others emphasize accuracy and robustness to image transformations. Here&#8217;s a brief introduction to some popular feature detection algorithms:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">FAST (Features from Accelerated Segment Test)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nature<\/strong>: Corner detection.<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: Extremely fast and is suitable for real-time applications.<\/li>\n\n\n\n<li><strong>Method<\/strong>: Considers a circle of 16 pixels around the corner candidate. If a set number of contiguous pixels are all brighter or darker than the center by a certain threshold, then it&#8217;s classified as a corner.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">SIFT (Scale-Invariant Feature Transform)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nature<\/strong>: Keypoint detection and descriptor.<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: Robust to image scaling, rotation, and affine transformation. Provides distinctive keypoints.<\/li>\n\n\n\n<li><strong>Method<\/strong>: Involves a series of steps \u2013 scale-space extrema detection, keypoint localization, orientation assignment, and keypoint descriptor.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">ORB (Oriented FAST and Rotated BRIEF)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nature<\/strong>: Combined keypoint detector and descriptor.<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: Efficient and fast. Can be used in real-time applications. Binary descriptor, hence faster to compare.<\/li>\n\n\n\n<li><strong>Method<\/strong>: Uses FAST for keypoint detection and BRIEF (Binary Robust Independent Elementary Features) for description. Incorporates orientation information.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Detecting Corners with FAST<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s implement a simple example where we detect corners in an image using the FAST algorithm with OpenCV:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the image<\/span>\r\n    cv::Mat image = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>], cv::IMREAD_GRAYSCALE);\r\n    <span class=\"hljs-keyword\">if<\/span>(image.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Detect FAST keypoints<\/span>\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::KeyPoint&gt; keypoints;\r\n    cv::FAST(image, keypoints, <span class=\"hljs-number\">20<\/span>, <span class=\"hljs-literal\">true<\/span>);  <span class=\"hljs-comment\">\/\/ 20 is the threshold for FAST<\/span>\r\n\r\n    <span class=\"hljs-comment\">\/\/ Draw the keypoints on the image<\/span>\r\n    cv::Mat keypointsImage;\r\n    cv::drawKeypoints(image, keypoints, keypointsImage, cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);\r\n    cv::imshow(<span class=\"hljs-string\">\"FAST Keypoints\"<\/span>, keypointsImage);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When executed, this program detects and visualizes corners in the provided image using the FAST algorithm. The red circles on the displayed image indicate detected corners. Adjusting the threshold can increase or decrease the sensitivity of the detector.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Feature Matching Techniques<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After detecting and describing features in images, the next step in many computer vision applications is to match these features across different images. This process is essential in scenarios like object recognition, image stitching, and 3D reconstruction. Here are two widely used matchers:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">BFMatcher (Brute-Force Matcher)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nature<\/strong>: It computes the distance between every descriptor in one image and every descriptor in another image.<\/li>\n\n\n\n<li><strong>Distance Types<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>cv::NORM_L2<\/code>: Used for SIFT and SURF<\/li>\n\n\n\n<li><code>cv::NORM_HAMMING<\/code>: Used for ORB, BRIEF, BRISK, etc. if they are binary descriptors<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: Simple and easy to use. Suitable for small datasets.<\/li>\n\n\n\n<li><strong>Drawback<\/strong>: Not efficient for large datasets due to its brute-force nature.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">FLANN (Fast Library for Approximate Nearest Neighbors) based Matcher<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nature<\/strong>: Uses algorithms optimized for fast nearest neighbor search in large datasets.<\/li>\n\n\n\n<li><strong>Method<\/strong>: It is a collection of hierarchical clustering and tree-based algorithms optimized for fast nearest neighbor search.<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: Faster and more scalable than BFMatcher for large datasets.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Matching Features Between Two Images<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">This example will use ORB for feature detection and description, and then apply BFMatcher to match features between two images:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">3<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image1_path&gt; &lt;image2_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the images<\/span>\r\n    cv::Mat img1 = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>], cv::IMREAD_GRAYSCALE);\r\n    cv::Mat img2 = cv::imread(argv&#91;<span class=\"hljs-number\">2<\/span>], cv::IMREAD_GRAYSCALE);\r\n    <span class=\"hljs-keyword\">if<\/span>(img1.empty() || img2.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read one or both images. Check the paths and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Detect ORB keypoints and descriptors<\/span>\r\n    cv::Ptr&lt;cv::ORB&gt; orb = cv::ORB::create();\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::KeyPoint&gt; keypoints1, keypoints2;\r\n    cv::Mat descriptors1, descriptors2;\r\n    orb-&gt;detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);\r\n    orb-&gt;detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Use BFMatcher to match the ORB descriptors<\/span>\r\n    <span class=\"hljs-function\">cv::BFMatcher <span class=\"hljs-title\">matcher<\/span><span class=\"hljs-params\">(cv::NORM_HAMMING)<\/span><\/span>;\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::DMatch&gt; matches;\r\n    matcher.match(descriptors1, descriptors2, matches);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Draw the matches<\/span>\r\n    cv::Mat imgMatches;\r\n    cv::drawMatches(img1, keypoints1, img2, keypoints2, matches, imgMatches);\r\n    cv::imshow(<span class=\"hljs-string\">\"ORB Feature Matches\"<\/span>, imgMatches);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Wait for a key press and then close<\/span>\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When executed, this program detects, describes, and matches ORB features between two provided images. The resulting image showcases lines connecting matching features between the two input images. Adjusting parameters in the ORB detector or the matcher can refine the matching results.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Object Detection<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Cascade Classifier<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Object detection is the task of finding instances of objects in images or videos. Among various techniques, Cascade Classifiers, especially Haar cascades, are popular for real-time object detection due to their efficiency.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Introduction to Haar Cascades<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>What are Haar Cascades?<\/strong>\n<ul class=\"wp-block-list\">\n<li>Haar cascades are machine learning-based classifiers that are trained to detect objects for which they have been trained. The name is derived from Haar-like features used during the training process.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>How do they work?<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Haar Features<\/strong>: These are specific simple structured features (like edges, lines, and rectangles) that the cascade classifier uses to detect objects. These features are computed very rapidly using the integral image representation.<\/li>\n\n\n\n<li><strong>Cascade<\/strong>: Instead of applying all the learned features on a region, they&#8217;re applied one by one in stages (cascades). If a region fails the first stage, it&#8217;s discarded, and subsequent features aren&#8217;t tried on this region. This cascade mechanism ensures speedy object detection by not wasting time on non-promising regions.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Training and Application<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Haar cascades need to be trained using positive images (containing the object) and negative images (not containing the object).<\/li>\n\n\n\n<li>Once trained, the classifier can rapidly detect objects in images.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Face and Eye Detection<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a simple example using OpenCV&#8217;s pre-trained Haar cascades for face and eye detection:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;image_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the image<\/span>\r\n    cv::Mat img = cv::imread(argv&#91;<span class=\"hljs-number\">1<\/span>]);\r\n    <span class=\"hljs-keyword\">if<\/span>(img.empty()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't read the image. Check the path and try again.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load the Haar cascades<\/span>\r\n    cv::CascadeClassifier face_cascade, eye_cascade;\r\n    face_cascade.load(<span class=\"hljs-string\">\"path_to_opencv\/data\/haarcascades\/haarcascade_frontalface_default.xml\"<\/span>);\r\n    eye_cascade.load(<span class=\"hljs-string\">\"path_to_opencv\/data\/haarcascades\/haarcascade_eye.xml\"<\/span>);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Convert image to grayscale<\/span>\r\n    cv::Mat gray;\r\n    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Detect faces<\/span>\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Rect&gt; faces;\r\n    face_cascade.detectMultiScale(gray, faces, <span class=\"hljs-number\">1.1<\/span>, <span class=\"hljs-number\">4<\/span>);\r\n\r\n    <span class=\"hljs-comment\">\/\/ For each detected face, detect eyes<\/span>\r\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">auto<\/span> &amp;face : faces) {\r\n        cv::rectangle(img, face, cv::Scalar(<span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n\r\n        cv::Mat faceROI = gray(face);\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Rect&gt; eyes;\r\n        eye_cascade.detectMultiScale(faceROI, eyes, <span class=\"hljs-number\">1.1<\/span>, <span class=\"hljs-number\">4<\/span>);\r\n\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">auto<\/span> &amp;eye : eyes) {\r\n            <span class=\"hljs-function\">cv::Point <span class=\"hljs-title\">eye_center<\/span><span class=\"hljs-params\">(face.x + eye.x + eye.width\/<span class=\"hljs-number\">2<\/span>, face.y + eye.y + eye.height\/<span class=\"hljs-number\">2<\/span>)<\/span><\/span>;\r\n            <span class=\"hljs-keyword\">int<\/span> radius = cvRound((eye.width + eye.height)*<span class=\"hljs-number\">0.25<\/span>);\r\n            cv::circle(img, eye_center, radius, cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Display the result<\/span>\r\n    cv::imshow(<span class=\"hljs-string\">\"Face and Eye Detection\"<\/span>, img);\r\n    cv::waitKey(<span class=\"hljs-number\">0<\/span>);\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This example detects faces and eyes in the provided image. It utilizes OpenCV&#8217;s pre-trained classifiers, so ensure that the paths to these XML files are correctly set. The resulting image displays rectangles around detected faces and circles around detected eyes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deep Learning with OpenCV<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV, with its <code>dnn<\/code> module, supports a variety of deep learning frameworks, making it easy to run pre-trained models without needing to rely on heavy deep learning frameworks. Object detection using deep learning models provides high accuracy compared to traditional computer vision methods.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Using dnn module for object detection:<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Supported Frameworks<\/strong>: The <code>dnn<\/code> module in OpenCV supports a variety of deep learning frameworks, including TensorFlow, Caffe, Torch\/PyTorch, and Darknet.<\/li>\n\n\n\n<li><strong>Models<\/strong>: There are various pre-trained models available like SSD (Single Shot MultiBox Detector), Faster R-CNN, YOLO (You Only Look Once), and others. These models have been trained on large datasets like COCO, ImageNet, and can detect multiple objects across various classes.<\/li>\n\n\n\n<li><strong>Advantage<\/strong>: By using OpenCV&#8217;s <code>dnn<\/code> module, one can achieve real-time object detection without relying on heavy dependencies or needing GPU acceleration.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Real-time Object Detection with Pre-trained Models<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a simple example to perform real-time object detection using a pre-trained MobileNet SSD model with OpenCV:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    <span class=\"hljs-comment\">\/\/ Load pre-trained MobileNet SSD model and configuration<\/span>\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> model = <span class=\"hljs-string\">\"path_to_mobilenet_iter_73000.caffemodel\"<\/span>;\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> config = <span class=\"hljs-string\">\"path_to_deploy.prototxt\"<\/span>;\r\n    cv::dnn::Net net = cv::dnn::readNetFromCaffe(config, model);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Use webcam for real-time detection<\/span>\r\n    <span class=\"hljs-function\">cv::VideoCapture <span class=\"hljs-title\">cap<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">0<\/span>)<\/span><\/span>;\r\n    <span class=\"hljs-keyword\">if<\/span> (!cap.isOpened()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't open the webcam.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\r\n        cv::Mat frame;\r\n        cap &gt;&gt; frame;\r\n\r\n        <span class=\"hljs-comment\">\/\/ Prepare the frame for the neural network<\/span>\r\n        cv::Mat blob = cv::dnn::blobFromImage(frame, <span class=\"hljs-number\">0.007843<\/span>, cv::Size(<span class=\"hljs-number\">300<\/span>, <span class=\"hljs-number\">300<\/span>), <span class=\"hljs-number\">127.5<\/span>);\r\n        net.setInput(blob);\r\n\r\n        <span class=\"hljs-comment\">\/\/ Forward pass<\/span>\r\n        cv::Mat detection = net.forward();\r\n\r\n        <span class=\"hljs-comment\">\/\/ Process the detection<\/span>\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; detection.size&#91;<span class=\"hljs-number\">2<\/span>]; i++) {\r\n            <span class=\"hljs-keyword\">float<\/span> confidence = detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">2<\/span>);\r\n            <span class=\"hljs-keyword\">if<\/span> (confidence &gt; <span class=\"hljs-number\">0.2<\/span>) {  <span class=\"hljs-comment\">\/\/ Threshold for confidence<\/span>\r\n                <span class=\"hljs-keyword\">int<\/span> classId = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">1<\/span>));\r\n                <span class=\"hljs-keyword\">int<\/span> left = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">3<\/span>) * frame.cols);\r\n                <span class=\"hljs-keyword\">int<\/span> top = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">4<\/span>) * frame.rows);\r\n                <span class=\"hljs-keyword\">int<\/span> right = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">5<\/span>) * frame.cols);\r\n                <span class=\"hljs-keyword\">int<\/span> bottom = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(detection.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, i, <span class=\"hljs-number\">6<\/span>) * frame.rows);\r\n\r\n                <span class=\"hljs-comment\">\/\/ Draw bounding box for detected object<\/span>\r\n                cv::rectangle(frame, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n            }\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ Display the frame with detections<\/span>\r\n        cv::imshow(<span class=\"hljs-string\">\"Real-time Object Detection\"<\/span>, frame);\r\n\r\n        <span class=\"hljs-comment\">\/\/ Exit on pressing 'q'<\/span>\r\n        <span class=\"hljs-keyword\">if<\/span> (cv::waitKey(<span class=\"hljs-number\">1<\/span>) == <span class=\"hljs-string\">'q'<\/span>) <span class=\"hljs-keyword\">break<\/span>;\r\n    }\r\n\r\n    cap.release();\r\n    cv::destroyAllWindows();\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Make sure to provide the correct paths for the pre-trained model and its configuration file. Adjust the confidence threshold as needed. In this example, the MobileNet SSD model is used, which provides a balance between accuracy and speed, making it suitable for real-time applications.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video Analysis with OpenCV<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Reading and Writing Videos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Videos are essentially sequences of frames. OpenCV provides utilities to easily read and manipulate video streams. Two primary classes for this purpose are <code>VideoCapture<\/code> and <code>VideoWriter<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VideoCapture:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It&#8217;s a class in OpenCV designed to provide an easy way to capture videos or sequences of images.<\/li>\n\n\n\n<li>Can be used to capture videos from file or directly from a webcam.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">VideoWriter:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allows writing videos frame by frame, which can be especially useful when we want to save the output after some processing.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s delve into a basic video player, which reads a video file and displays it.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Code example: Building a Basic Video Player<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;video_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Create a VideoCapture object to read from video file<\/span>\r\n    <span class=\"hljs-function\">cv::VideoCapture <span class=\"hljs-title\">cap<\/span><span class=\"hljs-params\">(argv&#91;<span class=\"hljs-number\">1<\/span>])<\/span><\/span>;\r\n    <span class=\"hljs-keyword\">if<\/span>(!cap.isOpened()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't open the video file.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Get the video frame width, height, and frames per second (FPS)<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span> width = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(cap.get(cv::CAP_PROP_FRAME_WIDTH));\r\n    <span class=\"hljs-keyword\">int<\/span> height = <span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(cap.get(cv::CAP_PROP_FRAME_HEIGHT));\r\n    <span class=\"hljs-keyword\">double<\/span> fps = cap.get(cv::CAP_PROP_FPS);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Create a window to display the video<\/span>\r\n    cv::namedWindow(<span class=\"hljs-string\">\"Basic Video Player\"<\/span>, cv::WINDOW_NORMAL);\r\n    cv::resizeWindow(<span class=\"hljs-string\">\"Basic Video Player\"<\/span>, width, height);\r\n\r\n    <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\r\n        cv::Mat frame;\r\n        <span class=\"hljs-keyword\">bool<\/span> success = cap.read(frame);  <span class=\"hljs-comment\">\/\/ Read a frame<\/span>\r\n\r\n        <span class=\"hljs-keyword\">if<\/span> (!success) {  <span class=\"hljs-comment\">\/\/ If end of video or error in reading frame<\/span>\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ Display the frame<\/span>\r\n        cv::imshow(<span class=\"hljs-string\">\"Basic Video Player\"<\/span>, frame);\r\n\r\n        <span class=\"hljs-comment\">\/\/ Wait for a short while (1\/fps) before displaying the next frame<\/span>\r\n        <span class=\"hljs-keyword\">if<\/span> (cv::waitKey(<span class=\"hljs-keyword\">static_cast<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(<span class=\"hljs-number\">1000.0<\/span> \/ fps)) == <span class=\"hljs-number\">27<\/span>) {  <span class=\"hljs-comment\">\/\/ Exit on pressing 'Esc' key<\/span>\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Release the VideoCapture object and close all windows<\/span>\r\n    cap.release();\r\n    cv::destroyAllWindows();\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This program initializes a video stream from a given file and displays the video frame by frame, creating a basic video player. The video will play at approximately its original frame rate due to the <code>waitKey<\/code> timing mechanism.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Background Subtraction and Foreground Detection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Background subtraction is a widely used approach to detect moving objects in videos from static cameras. The idea is to extract the moving objects by subtracting the current frame from a background model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV provides several background subtraction methods, and two of the most common are:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>MOG2 (Mixture of Gaussians 2)<\/strong>: This method uses multiple Gaussian distributions to model each pixel&#8217;s background. It adapts well to varying lighting conditions.<\/li>\n\n\n\n<li><strong>KNN (K-nearest Neighbors)<\/strong>: It uses K-nearest neighbors to decide whether a pixel is part of the background or not. It can also adapt to varying lighting conditions.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Code Example: Detecting Moving Objects in a Video using MOG2 and KNN<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;video_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Create a VideoCapture object to read from video file<\/span>\r\n    <span class=\"hljs-function\">cv::VideoCapture <span class=\"hljs-title\">cap<\/span><span class=\"hljs-params\">(argv&#91;<span class=\"hljs-number\">1<\/span>])<\/span><\/span>;\r\n    <span class=\"hljs-keyword\">if<\/span>(!cap.isOpened()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't open the video file.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Create background subtractor objects<\/span>\r\n    cv::Ptr&lt;cv::BackgroundSubtractor&gt; mog2 = cv::createBackgroundSubtractorMOG2();\r\n    cv::Ptr&lt;cv::BackgroundSubtractor&gt; knn = cv::createBackgroundSubtractorKNN();\r\n\r\n    cv::namedWindow(<span class=\"hljs-string\">\"Original Video\"<\/span>, cv::WINDOW_NORMAL);\r\n    cv::namedWindow(<span class=\"hljs-string\">\"MOG2 Foreground\"<\/span>, cv::WINDOW_NORMAL);\r\n    cv::namedWindow(<span class=\"hljs-string\">\"KNN Foreground\"<\/span>, cv::WINDOW_NORMAL);\r\n\r\n    <span class=\"hljs-keyword\">while<\/span>(<span class=\"hljs-literal\">true<\/span>) {\r\n        cv::Mat frame, fgMaskMOG2, fgMaskKNN;\r\n\r\n        <span class=\"hljs-keyword\">bool<\/span> success = cap.read(frame);\r\n        <span class=\"hljs-keyword\">if<\/span> (!success) {\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ Apply background subtraction to get the foreground masks<\/span>\r\n        mog2-&gt;apply(frame, fgMaskMOG2);\r\n        knn-&gt;apply(frame, fgMaskKNN);\r\n\r\n        <span class=\"hljs-comment\">\/\/ Display the frames and masks<\/span>\r\n        cv::imshow(<span class=\"hljs-string\">\"Original Video\"<\/span>, frame);\r\n        cv::imshow(<span class=\"hljs-string\">\"MOG2 Foreground\"<\/span>, fgMaskMOG2);\r\n        cv::imshow(<span class=\"hljs-string\">\"KNN Foreground\"<\/span>, fgMaskKNN);\r\n\r\n        <span class=\"hljs-keyword\">if<\/span>(cv::waitKey(<span class=\"hljs-number\">30<\/span>) == <span class=\"hljs-number\">27<\/span>) {  <span class=\"hljs-comment\">\/\/ Exit on pressing 'Esc' key<\/span>\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n    }\r\n\r\n    cap.release();\r\n    cv::destroyAllWindows();\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this example, the video&#8217;s moving objects are detected and highlighted using both the MOG2 and KNN methods. You can visually compare the effectiveness of each method side by side. Depending on the specific video and the objects of interest, one method might perform better than the other. Adjusting the parameters of the background subtractors can also fine-tune the results.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Optical Flow Analysis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Optical flow is the pattern of apparent motion of objects, surfaces, and edges in a visual scene caused by the relative motion between an observer and a scene. It provides useful information about the motion of objects and can be used for various applications such as tracking, motion analysis, and more.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Lucas-Kanade Method<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">One of the well-known methods for sparse optical flow computation is the <strong>Lucas-Kanade method<\/strong>. It computes optical flow for a sparse feature set (in our example, corners detected using Shi-Tomasi method).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Code Example: Tracking Motion Vectors in Videos using Lucas-Kanade Method<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;video_path&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-function\">cv::VideoCapture <span class=\"hljs-title\">cap<\/span><span class=\"hljs-params\">(argv&#91;<span class=\"hljs-number\">1<\/span>])<\/span><\/span>;\r\n    <span class=\"hljs-keyword\">if<\/span>(!cap.isOpened()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't open the video file.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    cv::Mat oldFrame, oldGray;\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point2f&gt; oldCorners;\r\n\r\n    <span class=\"hljs-comment\">\/\/ Parameters for Shi-Tomasi corner detection<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span> maxCorners = <span class=\"hljs-number\">100<\/span>;\r\n    <span class=\"hljs-keyword\">double<\/span> qualityLevel = <span class=\"hljs-number\">0.3<\/span>;\r\n    <span class=\"hljs-keyword\">double<\/span> minDistance = <span class=\"hljs-number\">7<\/span>;\r\n    <span class=\"hljs-keyword\">int<\/span> blockSize = <span class=\"hljs-number\">7<\/span>;\r\n\r\n    cap &gt;&gt; oldFrame;\r\n    cv::cvtColor(oldFrame, oldGray, cv::COLOR_BGR2GRAY);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Detect corners in the first frame<\/span>\r\n    cv::goodFeaturesToTrack(oldGray, oldCorners, maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Color for optical flow<\/span>\r\n    <span class=\"hljs-function\">cv::Scalar <span class=\"hljs-title\">color<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>)<\/span><\/span>;  <span class=\"hljs-comment\">\/\/ Green<\/span>\r\n\r\n    <span class=\"hljs-keyword\">while<\/span>(<span class=\"hljs-literal\">true<\/span>) {\r\n        cv::Mat frame, gray;\r\n        cap &gt;&gt; frame;\r\n\r\n        <span class=\"hljs-keyword\">if<\/span>(frame.empty()) {\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n\r\n        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);\r\n\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point2f&gt; newCorners;\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;uchar&gt; status;\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">float<\/span>&gt; err;\r\n\r\n        <span class=\"hljs-comment\">\/\/ Calculate optical flow using Lucas-Kanade method<\/span>\r\n        cv::calcOpticalFlowPyrLK(oldGray, gray, oldCorners, newCorners, status, err);\r\n\r\n        <span class=\"hljs-comment\">\/\/ Draw the motion vectors<\/span>\r\n        <span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-keyword\">size_t<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; oldCorners.size(); i++) {\r\n            <span class=\"hljs-keyword\">if<\/span>(status&#91;i]) {\r\n                cv::line(frame, oldCorners&#91;i], newCorners&#91;i], color, <span class=\"hljs-number\">2<\/span>);\r\n                cv::circle(frame, newCorners&#91;i], <span class=\"hljs-number\">5<\/span>, color, <span class=\"hljs-number\">-1<\/span>);\r\n            }\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ Display the result<\/span>\r\n        cv::imshow(<span class=\"hljs-string\">\"Optical Flow - Lucas-Kanade\"<\/span>, frame);\r\n\r\n        <span class=\"hljs-keyword\">if<\/span>(cv::waitKey(<span class=\"hljs-number\">30<\/span>) == <span class=\"hljs-number\">27<\/span>) {  <span class=\"hljs-comment\">\/\/ Exit on pressing 'Esc' key<\/span>\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ Update the previous frame and corners<\/span>\r\n        oldGray = gray.clone();\r\n        oldCorners = newCorners;\r\n    }\r\n\r\n    cap.release();\r\n    cv::destroyAllWindows();\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This code captures the apparent motion of corners detected in the video using the Lucas-Kanade method. The motion vectors highlight the direction and magnitude of the motion, and the points of interest (corners) are shown with circles. This visualization provides a clear understanding of object and scene dynamics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Advanced OpenCV Functions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Machine Learning with OpenCV<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV&#8217;s machine learning module, <code>ml<\/code>, is a set of classes and functions that helps integrate traditional machine learning algorithms into computer vision applications. It contains a wide array of tools for supervised and unsupervised learning, including SVMs, Decision Trees, k-means clustering, and more.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Introduction to OpenCV\u2019s Machine Learning Module (ml)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>ml<\/code> module in OpenCV is essentially a lightweight machine learning library that&#8217;s designed to address computer vision needs. It doesn\u2019t replace other machine learning frameworks like TensorFlow, PyTorch, or scikit-learn, but it&#8217;s suitable for simple tasks, especially when you want to stick to OpenCV for both vision and learning tasks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some of the notable algorithms included are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>StatModel<\/strong>: The base class for all algorithms. Provides general functionality.<\/li>\n\n\n\n<li><strong>NormalBayesClassifier<\/strong>: Implements the naive Bayes classifier.<\/li>\n\n\n\n<li><strong>KNearest<\/strong>: Implements the K-Nearest Neighbors algorithm.<\/li>\n\n\n\n<li><strong>SVM (Support Vector Machines)<\/strong><\/li>\n\n\n\n<li><strong>DTrees (Decision Trees)<\/strong><\/li>\n\n\n\n<li><strong>RTrees (Random Trees)<\/strong><\/li>\n\n\n\n<li><strong>Boost<\/strong>: Implements the Boosting algorithm.<\/li>\n\n\n\n<li><strong>ANN_MLP<\/strong>: Implements Artificial Neural Networks with a Multi-Layer Perceptron architecture.<\/li>\n\n\n\n<li><strong>LogisticRegression<\/strong><\/li>\n\n\n\n<li><strong>EM (Expectation Maximization)<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Code Example: Simple Pattern Recognition using SVM<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s consider a basic pattern recognition task using SVM (Support Vector Machines) to distinguish between two classes of 2D points.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    <span class=\"hljs-comment\">\/\/ Prepare training data: 2D points<\/span>\r\n    <span class=\"hljs-function\">cv::Mat <span class=\"hljs-title\">trainData<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">2<\/span>, CV_32F)<\/span><\/span>;\r\n    <span class=\"hljs-function\">cv::Mat <span class=\"hljs-title\">labels<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">1<\/span>, CV_32S)<\/span><\/span>;\r\n\r\n    trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>) = <span class=\"hljs-number\">501<\/span>; trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1<\/span>) = <span class=\"hljs-number\">10<\/span>; labels.at&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(<span class=\"hljs-number\">0<\/span>) = <span class=\"hljs-number\">1<\/span>;\r\n    trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>) = <span class=\"hljs-number\">255<\/span>; trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">1<\/span>) = <span class=\"hljs-number\">10<\/span>; labels.at&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(<span class=\"hljs-number\">1<\/span>) = <span class=\"hljs-number\">-1<\/span>;\r\n    trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">0<\/span>) = <span class=\"hljs-number\">501<\/span>; trainData.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">1<\/span>) = <span class=\"hljs-number\">255<\/span>; labels.at&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(<span class=\"hljs-number\">2<\/span>) = <span class=\"hljs-number\">-1<\/span>;\r\n    <span class=\"hljs-comment\">\/\/ ... &#91;Fill the remaining data similarly]<\/span>\r\n\r\n    <span class=\"hljs-comment\">\/\/ Setup SVM parameters<\/span>\r\n    cv::Ptr&lt;cv::ml::SVM&gt; svm = cv::ml::SVM::create();\r\n    svm-&gt;setType(cv::ml::SVM::C_SVC);\r\n    svm-&gt;setKernel(cv::ml::SVM::LINEAR);\r\n    svm-&gt;setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, <span class=\"hljs-number\">100<\/span>, <span class=\"hljs-number\">1e-6<\/span>));\r\n\r\n    <span class=\"hljs-comment\">\/\/ Train the SVM<\/span>\r\n    svm-&gt;train(trainData, cv::ml::ROW_SAMPLE, labels);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Predict a new sample<\/span>\r\n    <span class=\"hljs-function\">cv::Mat <span class=\"hljs-title\">sample<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, CV_32F)<\/span><\/span>;\r\n    sample.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>) = <span class=\"hljs-number\">300<\/span>; sample.at&lt;<span class=\"hljs-keyword\">float<\/span>&gt;(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1<\/span>) = <span class=\"hljs-number\">40<\/span>;\r\n    <span class=\"hljs-keyword\">float<\/span> response = svm-&gt;predict(sample);\r\n\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Predicted class for (300, 40) is: \"<\/span> &lt;&lt; response &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this code, we trained an SVM on a set of 2D points and used it to predict the class of a new sample point. SVM provides a powerful way to classify data, especially when the patterns are complex. In practice, you&#8217;d typically use more data and possibly more features, but this example demonstrates the basic usage of SVM in OpenCV&#8217;s <code>ml<\/code> module.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Augmented Reality with OpenCV<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Augmented Reality (AR)<\/strong> is a technology that overlays computer-generated content on the real world, enhancing the user&#8217;s perception and interaction with the environment. In simpler terms, AR integrates and overlays digital information on the user&#8217;s real environment in real-time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV, being a comprehensive library for computer vision, offers tools and functionalities that can be leveraged to implement basic AR applications. One of the foundational steps for AR is detecting a known pattern (like a marker or an object) and estimating its pose (position and orientation). Once the pose is determined, we can overlay and render virtual objects on it.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Code Example: Overlaying Virtual Objects on the Real World<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we&#8217;ll overlay a virtual 3D cube on a known marker (a chessboard pattern in our case). We&#8217;ll utilize OpenCV&#8217;s camera calibration and pose estimation functions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/opencv.hpp&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;opencv2\/aruco.hpp&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> argc, <span class=\"hljs-keyword\">char<\/span>** argv)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">if<\/span>(argc != <span class=\"hljs-number\">2<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Usage: \"<\/span> &lt;&lt; argv&#91;<span class=\"hljs-number\">0<\/span>] &lt;&lt; <span class=\"hljs-string\">\" &lt;camera_calibration.yml&gt;\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Load camera parameters from file<\/span>\r\n    <span class=\"hljs-function\">cv::FileStorage <span class=\"hljs-title\">fs<\/span><span class=\"hljs-params\">(argv&#91;<span class=\"hljs-number\">1<\/span>], cv::FileStorage::READ)<\/span><\/span>;\r\n    cv::Mat cameraMatrix, distCoeffs;\r\n    fs&#91;<span class=\"hljs-string\">\"camera_matrix\"<\/span>] &gt;&gt; cameraMatrix;\r\n    fs&#91;<span class=\"hljs-string\">\"distortion_coefficients\"<\/span>] &gt;&gt; distCoeffs;\r\n    fs.release();\r\n\r\n    <span class=\"hljs-function\">cv::VideoCapture <span class=\"hljs-title\">cap<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">0<\/span>)<\/span><\/span>;  <span class=\"hljs-comment\">\/\/ Open the default camera<\/span>\r\n    <span class=\"hljs-keyword\">if<\/span>(!cap.isOpened()) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cerr<\/span> &lt;&lt; <span class=\"hljs-string\">\"Error: Couldn't open the camera.\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">-1<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ Chessboard parameters<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span> chessboardRows = <span class=\"hljs-number\">6<\/span>;\r\n    <span class=\"hljs-keyword\">int<\/span> chessboardCols = <span class=\"hljs-number\">9<\/span>;\r\n    <span class=\"hljs-keyword\">float<\/span> squareSize = <span class=\"hljs-number\">0.025f<\/span>;  <span class=\"hljs-comment\">\/\/ in meters<\/span>\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point3f&gt; objectPoints;\r\n    <span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; chessboardRows; i++) {\r\n        <span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-keyword\">int<\/span> j = <span class=\"hljs-number\">0<\/span>; j &lt; chessboardCols; j++) {\r\n            objectPoints.push_back(cv::Point3f(j * squareSize, i * squareSize, <span class=\"hljs-number\">0<\/span>));\r\n        }\r\n    }\r\n\r\n    cv::Mat frame;\r\n    <span class=\"hljs-keyword\">while<\/span>(<span class=\"hljs-literal\">true<\/span>) {\r\n        cap &gt;&gt; frame;\r\n\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point2f&gt; imagePoints;\r\n        <span class=\"hljs-keyword\">bool<\/span> found = cv::findChessboardCorners(frame, {chessboardCols, chessboardRows}, imagePoints);\r\n\r\n        <span class=\"hljs-keyword\">if<\/span> (found) {\r\n            cv::Mat rvec, tvec;\r\n            <span class=\"hljs-keyword\">bool<\/span> valid = cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec);\r\n\r\n            <span class=\"hljs-keyword\">if<\/span> (valid) {\r\n                <span class=\"hljs-comment\">\/\/ Render a 3D cube on top of the detected chessboard<\/span>\r\n                <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point3f&gt; cubePoints = {\r\n                    {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">0<\/span>}, {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">0<\/span>},\r\n                    {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">-3<\/span> * squareSize}, {<span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">-3<\/span> * squareSize}, {<span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">-3<\/span> * squareSize}, {<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">3<\/span> * squareSize, <span class=\"hljs-number\">-3<\/span> * squareSize}\r\n                };\r\n                <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;cv::Point2f&gt; projectedPoints;\r\n                cv::projectPoints(cubePoints, rvec, tvec, cameraMatrix, distCoeffs, projectedPoints);\r\n\r\n                <span class=\"hljs-comment\">\/\/ Draw the cube edges<\/span>\r\n                <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">4<\/span>; i++) {\r\n                    cv::line(frame, projectedPoints&#91;i], projectedPoints&#91;(i + <span class=\"hljs-number\">1<\/span>) % <span class=\"hljs-number\">4<\/span>], cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n                    cv::line(frame, projectedPoints&#91;i + <span class=\"hljs-number\">4<\/span>], projectedPoints&#91;<span class=\"hljs-number\">4<\/span> + (i + <span class=\"hljs-number\">1<\/span>) % <span class=\"hljs-number\">4<\/span>], cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n                    cv::line(frame, projectedPoints&#91;i], projectedPoints&#91;i + <span class=\"hljs-number\">4<\/span>], cv::Scalar(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">2<\/span>);\r\n                }\r\n            }\r\n        }\r\n\r\n        cv::imshow(<span class=\"hljs-string\">\"Augmented Reality with OpenCV\"<\/span>, frame);\r\n\r\n        <span class=\"hljs-keyword\">if<\/span>(cv::waitKey(<span class=\"hljs-number\">1<\/span>) == <span class=\"hljs-number\">27<\/span>) {  <span class=\"hljs-comment\">\/\/ Exit on pressing 'Esc' key<\/span>\r\n            <span class=\"hljs-keyword\">break<\/span>;\r\n        }\r\n    }\r\n\r\n    cap.release();\r\n    cv::destroyAllWindows();\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this code, we first detect the corners of a chessboard pattern. Using the known 3D locations of these corners (assuming the chessboard is flat and on the ground plane) and their 2D locations in the image, we compute the camera&#8217;s pose relative to the chessboard. We then project the 3D points of a cube onto the image using this pose, thereby overlaying a virtual cube on the real chessboard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This example is quite rudimentary and real-world AR applications might employ more sophisticated methods, possibly involving multiple libraries or platforms. But it offers a glimpse into the possibilities of AR using OpenCV.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCV, being an open-source library, is constantly evolving with contributions from the global developer community. This means that as time progresses, even more features and optimizations will become available. By combining the speed and efficiency of C++ with the rich functionalities of OpenCV, one can create powerful computer vision applications that are optimized for performance.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Brief on the Significance of Computer Vision Applications Computer vision stands as one of the most revolutionary technologies in the modern day. It is the realm of artificial intelligence that equips machines with the ability to &#8216;see&#8217; and interpret the world similar to the human visual system. From simple tasks like image and video [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[18,9,4],"tags":[],"class_list":["post-1440","post","type-post","status-publish","format-standard","category-artificial-intelligence","category-cplusplus","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C++ and OpenCV: A Guide to Advanced Computer Vision<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++ and OpenCV: A Guide to Advanced Computer Vision\" \/>\n<meta property=\"og:description\" content=\"Introduction Brief on the Significance of Computer Vision Applications Computer vision stands as one of the most revolutionary technologies in the modern day. It is the realm of artificial intelligence that equips machines with the ability to &#8216;see&#8217; and interpret the world similar to the human visual system. From simple tasks like image and video [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-21T09:22:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-21T09:22:45+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"C++ and OpenCV: A Guide to Advanced Computer Vision\",\"datePublished\":\"2023-09-21T09:22:39+00:00\",\"dateModified\":\"2023-09-21T09:22:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/\"},\"wordCount\":4477,\"commentCount\":0,\"articleSection\":[\"Artificial Intelligence\",\"C++\",\"Programming Languages\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/\",\"name\":\"C++ and OpenCV: A Guide to Advanced Computer Vision\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2023-09-21T09:22:39+00:00\",\"dateModified\":\"2023-09-21T09:22:45+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-opencv-guide-advanced-computer-vision\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C++ and OpenCV: A Guide to Advanced Computer Vision\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++ and OpenCV: A Guide to Advanced Computer Vision","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/","og_locale":"en_US","og_type":"article","og_title":"C++ and OpenCV: A Guide to Advanced Computer Vision","og_description":"Introduction Brief on the Significance of Computer Vision Applications Computer vision stands as one of the most revolutionary technologies in the modern day. It is the realm of artificial intelligence that equips machines with the ability to &#8216;see&#8217; and interpret the world similar to the human visual system. From simple tasks like image and video [&hellip;]","og_url":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/","article_published_time":"2023-09-21T09:22:39+00:00","article_modified_time":"2023-09-21T09:22:45+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"C++ and OpenCV: A Guide to Advanced Computer Vision","datePublished":"2023-09-21T09:22:39+00:00","dateModified":"2023-09-21T09:22:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/"},"wordCount":4477,"commentCount":0,"articleSection":["Artificial Intelligence","C++","Programming Languages"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/","url":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/","name":"C++ and OpenCV: A Guide to Advanced Computer Vision","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2023-09-21T09:22:39+00:00","dateModified":"2023-09-21T09:22:45+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/cpp-opencv-guide-advanced-computer-vision\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"C++ and OpenCV: A Guide to Advanced Computer Vision"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1440"}],"version-history":[{"count":15,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1440\/revisions"}],"predecessor-version":[{"id":1455,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1440\/revisions\/1455"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}