{"id":23,"date":"2024-05-02T13:26:34","date_gmt":"2024-05-02T11:26:34","guid":{"rendered":"https:\/\/kev-it.fr\/?p=23"},"modified":"2024-05-02T13:26:35","modified_gmt":"2024-05-02T11:26:35","slug":"introduction-a-opencv","status":"publish","type":"post","link":"https:\/\/kev-it.fr\/index.php\/2024\/05\/02\/introduction-a-opencv\/","title":{"rendered":"Introduction \u00e0 OpenCV"},"content":{"rendered":"\n<p>Depuis que j&rsquo;ai vu le film Iron Man, je r\u00eave d&rsquo;avoir un Jarvis \u00e0 ma botte, mais surtout le super casque de son armure !<\/p>\n\n\n\n<p>Je commence une s\u00e9rie d&rsquo;articles sur OpenCV et sur les fonctions de machine learning associ\u00e9e \u00e0 l&rsquo;analyse d&rsquo;image pour creuser ce sujet qui m&rsquo;intrigue. Voyons jusqu&rsquo;o\u00f9 je pourrai aller avec mes maigres comp\u00e9tences en Python \ud83d\ude42<\/p>\n\n\n\n<p>D&rsquo;ailleurs, je n&rsquo;invente rien. Je n&rsquo;ai fait que reprendre les infos et de bouts de code trouv\u00e9s \u00e7a et l\u00e0 sur internet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OpenCV Kesako ?<\/h2>\n\n\n\n<p>OpenCV signifie Open Source Computer Vision. Il s&rsquo;agit d&rsquo;une librairie contenant tout le n\u00e9cessaire (des centaines d&rsquo;algorithmes) pour r\u00e9aliser du traitement d&rsquo;images.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi choisir OpenCV ?<\/h2>\n\n\n\n<p>Et bien, pour plusieurs raisons:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C&rsquo;est LE framework le plus connu et le plus document\u00e9<\/li>\n\n\n\n<li>Il est utilisable dans plusieurs langages : C, Java, Python<\/li>\n\n\n\n<li>Il est gratuit<\/li>\n\n\n\n<li>Il contient plein d&rsquo;algorithmes pr\u00eat \u00e0 l&#8217;emploi (parfait pour un Noob comme moi)<\/li>\n\n\n\n<li>On peut commencer tr\u00e8s facilement commencer avec des scripts Python (m\u00eame si j&rsquo;aurais pr\u00e9f\u00e9r\u00e9 du PowerShell \ud83d\ude09 )<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installation sous Windows (oui je sais, mais je pr\u00e9f\u00e8re Windows)<\/h2>\n\n\n\n<p>La premi\u00e8re \u00e9tape, installer Python 3. <br>Ouvrir un prompt DOS en administrateur et lancer la commande :<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-ea7ded9a3e18b27ce5193bec2302ee57\"><code>winget install Python.Python.3.12<\/code><\/pre>\n\n\n\n<p>Ensuite, on peut fermer la fen\u00eatre DOS puis en ouvrir un nouvelle. C&rsquo;est b\u00eate, mais il faut recharger le contexte pour avoir acc\u00e8s \u00e0 l&rsquo;installation de Python. L\u00e0 on peut entrer dans le vif du sujet :<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-1c1cb461f2fffeb8858ec6727b222705\"><code>pip install opencv-python<\/code><\/pre>\n\n\n\n<p>Et voil\u00e0. On a le strict minimum pour commencer \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Analyser une image<\/h2>\n\n\n\n<p>Commen\u00e7ons par valider que tout est OK. Prenez votre \u00e9diteur de script pr\u00e9f\u00e9r\u00e9 &#8230; Visual Studio Code<br>Vous pouvez l&rsquo;installer \u00e0 l&rsquo;ancienne via le MSI pour via Winget<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9244e4e92859aabf627bb32dda3242cc\"><code>winget install Microsoft.VisualStudioCode<\/code><\/pre>\n\n\n\n<p>Ensuite, vous pouvez cr\u00e9er un r\u00e9pertoire dans lequel vous allez mettre une image JPEG portant le nom \u00ab\u00a0test.jpg\u00a0\u00bb. Puis cr\u00e9er un script dans le m\u00eame r\u00e9pertoire comme suit :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport cv2 as cv\n# load image from disk\nimg = cv.imread(&quot;test.jpg&quot;)\n# Show image in windws with title\ncv.imshow(&quot;Display window&quot;, img)\n# Wait for a keystroke in the window\nk = cv.waitKey(0)\n<\/pre><\/div>\n\n\n<p>Note: Attention au chemin du fichier ! Je n&rsquo;ai pas pr\u00e9cis\u00e9 de chemin dans le script, il faudra donc se placer dans le r\u00e9pertoire pour lancer le script \ud83d\ude09<\/p>\n\n\n\n<p>Et voil\u00e0 ! Normalement, vos image s&rsquo;affiche dans une fen\u00eatre avec le titre fournit. Il suffit de presser une touche \u00e0 l&rsquo;int\u00e9rieur de la fen\u00eatre pour terminer le script.<\/p>\n\n\n\n<p>J&rsquo;entends crier \u00ab\u00a0A l&rsquo;arnaque\u00a0\u00bb dans le fond &#8230;<br>Bon d&rsquo;accord, j&rsquo;ai sorti un bazooka pour tuer une mouche, mais c&rsquo;est maintenant que les choses fun vont commencer !<\/p>\n\n\n\n<p>On commencer par remplacer l&rsquo;image par une photo de groupe avec des visage (phototh\u00e8que perso ou Google image). Puis on va modifier le script comme suit :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport cv2\nimport matplotlib.pyplot as plt\n\nimagePath = '.\/test4.jpg'\nimg = cv2.imread(imagePath)\n\n# On convertit l'image en nuances de gris pour acc\u00e9lerer les traitements\ngray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n\n# On charge un algo tout fait pour d\u00e9tecter les visages\nface_classifier = cv2.CascadeClassifier(\n    cv2.data.haarcascades + &quot;haarcascade_frontalface_default.xml&quot;\n)\n# On ajuste les crit\u00e8res de d\u00e9tection\nface = face_classifier.detectMultiScale(\n    gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(5, 5)\n)\n\n# On dessine un rectangle vert tout moche autour des visages rep\u00e9r\u00e9s (sur l'image originale)\nfor (x, y, w, h) in face:\n    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4)\nimg_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n\n# On affiche le r\u00e9sultat\ncv2.imshow(&quot;Display window&quot;, img)\nk = cv2.waitKey(0) # Wait for a keystroke in the window\n<\/pre><\/div>\n\n\n<p>Et l\u00e0 on commence a avoir les yeux qui brillent !<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"436\" src=\"https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/screen-1024x436.png\" alt=\"\" class=\"wp-image-43\" srcset=\"https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/screen-1024x436.png 1024w, https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/screen-300x128.png 300w, https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/screen-768x327.png 768w, https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/screen.png 1335w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>C&rsquo;est d\u00e9j\u00e0 pas mal, mais est-ce qu&rsquo;on ne pourrait pas faire encore mieux ?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Analyser une vid\u00e9o<\/h2>\n\n\n\n<p>L\u00e0, on va passer dans la cours des grands &#8230; et pourtant c&rsquo;est loin d&rsquo;\u00eatre compliqu\u00e9.<br>Finalement, on va juste changer deux choses dans le script :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On va capturer le flux de la webcam au lieu d&rsquo;un fichier image<\/li>\n\n\n\n<li>On va faire une boucle pour appliquer notre traitement image par image, puis les afficher (vid\u00e9o de sortie)<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport cv2\n\n# On charge l'algo de d\u00e9tection des visages\nface_classifier = cv2.CascadeClassifier(\n    cv2.data.haarcascades + &quot;haarcascade_frontalface_default.xml&quot;\n)\n\n# on prend la premi\u00e8re webcam connect\u00e9e au PC\nvideo_capture = cv2.VideoCapture(0)\n\n# on cr\u00e9\u00e9 une fonction pour sortir le code de d\u00e9tection de visage et de cr\u00e9ation du rectangle (pour une image)\ndef detect_bounding_box(vid):\n    gray_image = cv2.cvtColor(vid, cv2.COLOR_BGR2GRAY)\n    faces = face_classifier.detectMultiScale(gray_image, 1.1, 5, minSize=(40, 40))\n    for (x, y, w, h) in faces:\n        cv2.rectangle(vid, (x, y), (x + w, y + h), (0, 255, 0), 4)\n    return faces\n\n# Notre boucle principale\nwhile True:\n    # On r\u00e9cup\u00e8re le flux vid\u00e9o\n    result, video_frame = video_capture.read()  # read frames from the video\n    if result is False:\n        break  # terminate the loop if the frame is not read successfully\n\n    # On appelle notre fonction de traitement\n    faces = detect_bounding_box(\n        video_frame\n    )  \n\n    # on affiche le r\u00e9sultat (une image)\n    cv2.imshow(\n        &quot;My Face Detection Project&quot;, video_frame\n    ) \n\n    # On arr\u00eate le script en appuyant sur &quot;q&quot;\n    if cv2.waitKey(1) &amp; 0xFF == ord(&quot;q&quot;):\n        break\n\n# on nettoye les ressources\nvideo_capture.release()\ncv2.destroyAllWindows()\n<\/pre><\/div>\n\n\n<p>On touche au but !<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"426\" height=\"240\" src=\"https:\/\/kev-it.fr\/wp-content\/uploads\/2024\/04\/OpenCV-FaceDetection.gif\" alt=\"\" class=\"wp-image-44\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Synth\u00e8se<\/h2>\n\n\n\n<p>Un final, je retient qu&rsquo;on peut s&rsquo;amuser tr\u00e8s rapidement et tr\u00e8s facilement avec OpenCV. <br>Le Python est un grand plus pour la simplicit\u00e9 et l&rsquo;agilit\u00e9, m\u00eame si on n&rsquo;y conna\u00eet quasi-rien &#8230;<br>Mais nous n&rsquo;avons fait qu&rsquo;effleurer le sujet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9f\u00e9rences<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.opencv.org\/4.x\/d1\/dfb\/intro.html\">https:\/\/docs.opencv.org\/4.x\/d1\/dfb\/intro.html<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Depuis que j&rsquo;ai vu le film Iron Man, je r\u00eave d&rsquo;avoir un Jarvis \u00e0 ma botte, mais surtout le super casque de son armure ! Je commence une s\u00e9rie d&rsquo;articles sur OpenCV et sur les fonctions de machine learning associ\u00e9e \u00e0 l&rsquo;analyse d&rsquo;image pour creuser ce sujet qui m&rsquo;intrigue. Voyons jusqu&rsquo;o\u00f9 je pourrai aller avec [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[7,4,5],"class_list":["post-23","post","type-post","status-publish","format-standard","hentry","category-dev","tag-face-detection","tag-opencv","tag-python"],"_links":{"self":[{"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":16,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":700,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/posts\/23\/revisions\/700"}],"wp:attachment":[{"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kev-it.fr\/index.php\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}