{"id":79464,"date":"2020-07-18T18:43:14","date_gmt":"2020-07-18T13:13:14","guid":{"rendered":"https:\/\/techvidvan.com\/tutorials\/?p=79464"},"modified":"2020-07-18T18:43:14","modified_gmt":"2020-07-18T13:13:14","slug":"python-project-license-number-plate-recognition","status":"publish","type":"post","link":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/","title":{"rendered":"Python Project &#8211; Automatic License Number Plate Recognition using Deep Learning"},"content":{"rendered":"<p><strong>Deep Learning Project &#8211; Automatic License Number Plate Detection and Recognition<\/strong><\/p>\n<p>This project aims to recognize license number plates. In order to detect license number plates, we will use OpenCV to identify number plates and python pytesseract to extract characters and digits from the number plates.<\/p>\n<p><a href=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2020\/07\/automatic-license-number-plate-detection-and-recognition.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-79467\" src=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/sites\/2\/2020\/07\/automatic-license-number-plate-detection-and-recognition.gif\" alt=\"automatic license number plate detection and recognition\" width=\"903\" height=\"725\" \/><\/a><\/p>\n<h2>Automatic License Number Plate Recognition<\/h2>\n<p>OpenCV is an open-source machine learning library and provides a common infrastructure for computer vision. Whereas Pytesseract is a Tesseract-OCR Engine to read image types and extract the information present in the image.<\/p>\n<h3>Install OpenCV and Pytesseract pip3 python package:<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">pip3 install opencv-python\npip3 install pytesseract\n<\/pre>\n<p>In this python project, to identify the number plate in the input image, we will use following features of openCV:<\/p>\n<ul>\n<li><strong>Gaussian Blur:<\/strong> Here we use a Gaussian kernel to smoothen the image. This technique is highly effective to remove Gaussian noise. OpenCV provides a cv2.GaussianBlur() function for this task.<\/li>\n<li><strong>Sobel:<\/strong> Here we calculate the derivatives from the image. This feature is important for many computer vision tasks. Using derivatives we calculate the gradients, and a high change in gradient indicates a major change in the image. OpenCV provides a cv2.Sobel() function to calculate Sobel operators.<\/li>\n<li><a href=\"https:\/\/docs.opencv.org\/trunk\/d9\/d61\/tutorial_py_morphological_ops.html\">Morphological Transformation<\/a>: These are the operations based on image shapes and are performed on binary images. The basic morphological operations are Erosion, Dilation, Opening, Closing. The different functions provided in OpenCV are:\n<ul>\n<li>cv2.erode()<\/li>\n<li>cv2.dilate()<\/li>\n<li>cv2.morphologyEx()<\/li>\n<\/ul>\n<\/li>\n<li><strong>Contours:<\/strong> Contours are the curves containing all the continuous points of same intensity. These are very useful tools for object recognition. OpenCV provides cv2.findContours() functions for this feature.<\/li>\n<\/ul>\n<h3>Download the project source code<\/h3>\n<p>Before proceeding ahead, please download the source code: <a href=\"https:\/\/techvidvan.com\/tutorials\/download-automatic-license-number-plate-recognition-project-source-code\/\"><strong>Automatic Number Plate Recognition<\/strong><\/a><\/p>\n<p>Now, let&#8217;s dive into the number plate recognition code. Follow the steps below:<\/p>\n<p>1. Imports:<\/p>\n<p>For this project we need numpy and pillow python libraries with openCV and pytesseract<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">import numpy as np\nimport cv2\nfrom PIL import Image\nimport pytesseract as tess\n<\/pre>\n<p>2. Now we will define three functions, to find the unnecessary contours that openCV may identify but it does not have probability of being a number plate.<\/p>\n<p>2.1. The first function to check the area range and width-height ratio:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def ratioCheck(area, width, height):\n    ratio = float(width) \/ float(height)\n    if ratio &lt; 1:\n        ratio = 1 \/ ratio\n    if (area &lt; 1063.62 or area &gt; 73862.5) or (ratio &lt; 3 or ratio &gt; 6):\n        return False\n    return True\n<\/pre>\n<p>2.2. The second function to check average of image matrix:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def isMaxWhite(plate):\n    avg = np.mean(plate)\n    if(avg&gt;=115):\n        return True\n    else:\n         return False\n<\/pre>\n<p>2.3. The third function to check the rotation of contours:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def ratio_and_rotation(rect):\n    (x, y), (width, height), rect_angle = rect\n\n    if(width&gt;height):\n        angle = -rect_angle\n    else:\n        angle = 90 + rect_angle\n\n    if angle&gt;15:\n         return False\n\n    if height == 0 or width == 0:\n        return False\n\n    area = height*width\n    if not ratioCheck(area,width,height):\n        return False\n    else:\n        return True\n<\/pre>\n<p>3. Now we will write a function to clean the identified number plate for preprocessing before feeding to pytesseract:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def clean2_plate(plate):\n    gray_img = cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)\n\n    _, thresh = cv2.threshold(gray_img, 110, 255, cv2.THRESH_BINARY)\n    if cv2.waitKey(0) &amp; 0xff == ord('q'):\n        pass\n    num_contours,hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)\n\n    if num_contours:\n        contour_area = [cv2.contourArea(c) for c in num_contours]\n        max_cntr_index = np.argmax(contour_area)\n\n        max_cnt = num_contours[max_cntr_index]\n        max_cntArea = contour_area[max_cntr_index]\n        x,y,w,h = cv2.boundingRect(max_cnt)\n\n        if not ratioCheck(max_cntArea,w,h):\n            return plate,None\n\n        final_img = thresh[y:y+h, x:x+w]\n        return final_img,[x,y,w,h]\n\n    else:\n        return plate, None\n<\/pre>\n<p>4. In this step, we will take an image input. We will perform Gaussian Blur, Sobel and morphological operations. After we find contours in the image and loop through each contour to identify the number plate. We will then clean the image contour and feed it to pytesseract to recognize the number and characters.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">img = cv2.imread(\"testData\/sample15.jpg\")\nprint(\"Number  input image...\",)\ncv2.imshow(\"input\",img)\n\nif cv2.waitKey(0) &amp; 0xff == ord('q'):\n    pass\nimg2 = cv2.GaussianBlur(img, (3,3), 0)\nimg2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n\nimg2 = cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)    \n_,img2 = cv2.threshold(img2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)\n\nelement = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(17, 3))\nmorph_img_threshold = img2.copy()\ncv2.morphologyEx(src=img2, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img_threshold)\nnum_contours, hierarchy= cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)\ncv2.drawContours(img2, num_contours, -1, (0,255,0), 1)\n\n\nfor i,cnt in enumerate(num_contours):\n\n    min_rect = cv2.minAreaRect(cnt)\n\n    if ratio_and_rotation(min_rect):\n\n        x,y,w,h = cv2.boundingRect(cnt)\n        plate_img = img[y:y+h,x:x+w]\n        print(\"Number  identified number plate...\")\n        cv2.imshow(\"num plate image\",plate_img)\n        if cv2.waitKey(0) &amp; 0xff == ord('q'):\n            pass\n\n        if(isMaxWhite(plate_img)):\n            clean_plate, rect = clean2_plate(plate_img)\n            if rect:\n                fg=0\n                x1,y1,w1,h1 = rect\n                x,y,w,h = x+x1,y+y1,w1,h1\n                # cv2.imwrite(\"clena.png\",clean_plate)\n                plate_im = Image.fromarray(clean_plate)\n                text = tess.image_to_string(plate_im, lang='eng')\n                print(\"Number  Detected Plate Text : \",text)\n<\/pre>\n<h3>Code for Project GUI<\/h3>\n<p>Make a new file gui.py and paste the below code:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">import tkinter as tk\nfrom tkinter import filedialog\nfrom tkinter import *\nfrom PIL import ImageTk, Image\nfrom tkinter import PhotoImage\nimport numpy as np\nimport cv2\nimport pytesseract as tess\ndef clean2_plate(plate):\n    gray_img = cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)\n\n    _, thresh = cv2.threshold(gray_img, 110, 255, cv2.THRESH_BINARY)\n    num_contours,hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)\n\n    if num_contours:\n        contour_area = [cv2.contourArea(c) for c in num_contours]\n        max_cntr_index = np.argmax(contour_area)\n\n        max_cnt = num_contours[max_cntr_index]\n        max_cntArea = contour_area[max_cntr_index]\n        x,y,w,h = cv2.boundingRect(max_cnt)\n\n        if not ratioCheck(max_cntArea,w,h):\n            return plate,None\n\n        final_img = thresh[y:y+h, x:x+w]\n        return final_img,[x,y,w,h]\n\n    else:\n        return plate,None\n\ndef ratioCheck(area, width, height):\n    ratio = float(width) \/ float(height)\n    if ratio &lt; 1:\n        ratio = 1 \/ ratio\n    if (area &lt; 1063.62 or area &gt; 73862.5) or (ratio &lt; 3 or ratio &gt; 6):\n        return False\n    return True\n\ndef isMaxWhite(plate):\n    avg = np.mean(plate)\n    if(avg&gt;=115):\n        return True\n    else:\n        return False\n\ndef ratio_and_rotation(rect):\n    (x, y), (width, height), rect_angle = rect\n\n    if(width&gt;height):\n        angle = -rect_angle\n    else:\n        angle = 90 + rect_angle\n\n    if angle&gt;15:\n        return False\n\n    if height == 0 or width == 0:\n        return False\n\n    area = height*width\n    if not ratioCheck(area,width,height):\n        return False\n    else:\n        return True\n\ntop=tk.Tk()\ntop.geometry('900x700')\ntop.title('Number Plate Recognition')\ntop.iconphoto(True, PhotoImage(file=\"\/home\/shivam\/Dataflair\/Keras Projects_CIFAR\/GUI\/logo.png\"))\nimg = ImageTk.PhotoImage(Image.open(\"logo.png\"))\ntop.configure(background='#CDCDCD')\nlabel=Label(top,background='#CDCDCD', font=('arial',35,'bold'))\n# label.grid(row=0,column=1)\nsign_image = Label(top,bd=10)\nplate_image=Label(top,bd=10)\ndef classify(file_path):\n    res_text=[0]\n    res_img=[0]\n    img = cv2.imread(file_path)\n    img2 = cv2.GaussianBlur(img, (3,3), 0)\n    img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n\n    img2 = cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)    \n    _,img2 = cv2.threshold(img2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)\n\n    element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(17, 3))\n    morph_img_threshold = img2.copy()\n    cv2.morphologyEx(src=img2, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img_threshold)\n    num_contours, hierarchy= cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)\n    cv2.drawContours(img2, num_contours, -1, (0,255,0), 1)\n\n\n    for i,cnt in enumerate(num_contours):\n\n        min_rect = cv2.minAreaRect(cnt)\n\n        if ratio_and_rotation(min_rect):\n\n            x,y,w,h = cv2.boundingRect(cnt)\n            plate_img = img[y:y+h,x:x+w]\n            print(\"Number  identified number plate...\")\n            res_img[0]=plate_img\n            cv2.imwrite(\"result.png\",plate_img)\n            if(isMaxWhite(plate_img)):\n                clean_plate, rect = clean2_plate(plate_img)\n                \n                if rect:\n                    fg=0\n                    x1,y1,w1,h1 = rect\n                    x,y,w,h = x+x1,y+y1,w1,h1\n                    plate_im = Image.fromarray(clean_plate)\n                    text = tess.image_to_string(plate_im, lang='eng')\n                    res_text[0]=text\n                    if text:\n                        break\n    label.configure(foreground='#011638', text=res_text[0]) \n\n    uploaded=Image.open(\"result.png\")\n    im=ImageTk.PhotoImage(uploaded)\n    plate_image.configure(image=im)\n    plate_image.image=im\n    plate_image.pack()\n    plate_image.place(x=560,y=320)\ndef show_classify_button(file_path):\n    classify_b=Button(top,text=\"Classify Image\",command=lambda: classify(file_path),padx=10,pady=5)\n    classify_b.configure(background='#364156', foreground='white',font=('arial',15,'bold'))\n    classify_b.place(x=490,y=550)\ndef upload_image():\n    try:\n        file_path=filedialog.askopenfilename()\n        uploaded=Image.open(file_path)\n        uploaded.thumbnail(((top.winfo_width()\/2.25),(top.winfo_height()\/2.25)))\n        im=ImageTk.PhotoImage(uploaded)\n        sign_image.configure(image=im)\n        sign_image.image=im\n        label.configure(text='')\n        show_classify_button(file_path)\n    except:\n        pass\nupload=Button(top,text=\"Upload an image\",command=upload_image,padx=10,pady=5)\nupload.configure(background='#364156', foreground='white',font=('arial',15,'bold'))\nupload.pack()\nupload.place(x=210,y=550)\n\nsign_image.pack()\nsign_image.place(x=70,y=200)\n\n\nlabel.pack()\nlabel.place(x=500,y=220)\nheading = Label(top,image=img)\nheading.configure(background='#CDCDCD',foreground='#364156')\nheading.pack()\ntop.mainloop()\n<\/pre>\n<h2>Summary<\/h2>\n<p>In this article, we have developed a deep learning project to recognize license number plate.\u00a0We discussed some important features of openCV like Gaussian blur, Sobel operators, Morphological transformations. The application detects number plate text from an image. We have identified and cleaned the number plate using openCV. To identify the number plate digits and characters we used pytesseract.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Deep Learning Project &#8211; Automatic License Number Plate Detection and Recognition This project aims to recognize license number plates. In order to detect license number plates, we will use OpenCV to identify number plates&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":79478,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[210],"tags":[2598,3054,3055,483],"class_list":["post-79464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-learning","tag-deep-learning-project","tag-number-plate-detection-recognition","tag-number-plate-recognition","tag-python-project"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Python Project - Automatic License Number Plate Recognition using Deep Learning - TechVidvan<\/title>\n<meta name=\"description\" content=\"Automatic License Number Plate Detection and Recognition - Work on python with OpenCV to identify number plates &amp; python pytesseract to extract characters and digits\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Project - Automatic License Number Plate Recognition using Deep Learning - TechVidvan\" \/>\n<meta property=\"og:description\" content=\"Automatic License Number Plate Detection and Recognition - Work on python with OpenCV to identify number plates &amp; python pytesseract to extract characters and digits\" \/>\n<meta property=\"og:url\" content=\"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/\" \/>\n<meta property=\"og:site_name\" content=\"TechVidvan\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/TechVidvan\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-18T13:13:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"TechVidvan Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vidvantech\" \/>\n<meta name=\"twitter:site\" content=\"@vidvantech\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TechVidvan Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Python Project - Automatic License Number Plate Recognition using Deep Learning - TechVidvan","description":"Automatic License Number Plate Detection and Recognition - Work on python with OpenCV to identify number plates & python pytesseract to extract characters and digits","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:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/","og_locale":"en_US","og_type":"article","og_title":"Python Project - Automatic License Number Plate Recognition using Deep Learning - TechVidvan","og_description":"Automatic License Number Plate Detection and Recognition - Work on python with OpenCV to identify number plates & python pytesseract to extract characters and digits","og_url":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/","og_site_name":"TechVidvan","article_publisher":"https:\/\/www.facebook.com\/TechVidvan\/","article_published_time":"2020-07-18T13:13:14+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg","type":"image\/jpeg"}],"author":"TechVidvan Team","twitter_card":"summary_large_image","twitter_creator":"@vidvantech","twitter_site":"@vidvantech","twitter_misc":{"Written by":"TechVidvan Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#article","isPartOf":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/"},"author":{"name":"TechVidvan Team","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/person\/e9c26e74dd3d87421f7ada9433b8cd22"},"headline":"Python Project &#8211; Automatic License Number Plate Recognition using Deep Learning","datePublished":"2020-07-18T13:13:14+00:00","mainEntityOfPage":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/"},"wordCount":513,"commentCount":0,"publisher":{"@id":"https:\/\/techvidvan.com\/tutorials\/#organization"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#primaryimage"},"thumbnailUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg","keywords":["deep learning project","number plate detection &amp; recognition","number plate recognition","Python project"],"articleSection":["Machine Learning Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/","url":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/","name":"Python Project - Automatic License Number Plate Recognition using Deep Learning - TechVidvan","isPartOf":{"@id":"https:\/\/techvidvan.com\/tutorials\/#website"},"primaryImageOfPage":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#primaryimage"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#primaryimage"},"thumbnailUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg","datePublished":"2020-07-18T13:13:14+00:00","description":"Automatic License Number Plate Detection and Recognition - Work on python with OpenCV to identify number plates & python pytesseract to extract characters and digits","breadcrumb":{"@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#primaryimage","url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg","contentUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2020\/07\/automatic-license-number-plate-recognition.jpg","width":1200,"height":628,"caption":"automatic license number plate recognition"},{"@type":"BreadcrumbList","@id":"https:\/\/techvidvan.com\/tutorials\/python-project-license-number-plate-recognition\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/techvidvan.com\/tutorials\/"},{"@type":"ListItem","position":2,"name":"Python Project &#8211; Automatic License Number Plate Recognition using Deep Learning"}]},{"@type":"WebSite","@id":"https:\/\/techvidvan.com\/tutorials\/#website","url":"https:\/\/techvidvan.com\/tutorials\/","name":"TechVidvan Blogs","description":"","publisher":{"@id":"https:\/\/techvidvan.com\/tutorials\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/techvidvan.com\/tutorials\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/techvidvan.com\/tutorials\/#organization","name":"TechVidvan","url":"https:\/\/techvidvan.com\/tutorials\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/logo\/image\/","url":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2024\/03\/techvidvan-logo-200x50-1.webp","contentUrl":"https:\/\/techvidvan.com\/tutorials\/wp-content\/uploads\/2024\/03\/techvidvan-logo-200x50-1.webp","width":200,"height":50,"caption":"TechVidvan"},"image":{"@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/TechVidvan\/","https:\/\/x.com\/vidvantech"]},{"@type":"Person","@id":"https:\/\/techvidvan.com\/tutorials\/#\/schema\/person\/e9c26e74dd3d87421f7ada9433b8cd22","name":"TechVidvan Team","description":"The TechVidvan Team delivers practical, beginner-friendly tutorials on programming, Java, Python, C++, DSA, AI, ML, data Science, Android, Flutter, MERN, Web Development, and technology. Our experts are here to help you upskill and excel in today\u2019s tech industry."}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts\/79464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/comments?post=79464"}],"version-history":[{"count":0,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/posts\/79464\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/media\/79478"}],"wp:attachment":[{"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/media?parent=79464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/categories?post=79464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techvidvan.com\/tutorials\/wp-json\/wp\/v2\/tags?post=79464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}