=====Cours===== https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/conf.pdf =====Installations des outils===== Chez vous installer Visual Studio Code: https://code.visualstudio.com/download Logiciel pour visualiser les images, alternative à geeqie: https://nomacs.org/ version portable à installer sur D:\ : https://github.com/nomacs/nomacs/releases/latest/download/nomacs-portable-win.zip régler la langue en anglais Pour relever des coordonnées de pixels dans les images, utiliser Paint. =====Installation OpenCV pour Windows IUT===== taper dans une invite de commande: pip install numpy pip install matplotlib pip install opencv-python --upgrade ne pas installer la version headless qui ne permet pas la visualisation des images pip install opencv-contrib-python-headless pip uninstall opencv-contrib-python-headless Créer un dossier sur R:\lprob...\...\tpvision et y télécharger le fichier suivant: import numpy as np import cv2 import math print("version openCV:"+str( cv2.__version__ )) lancer Visual Studio Code: code ouvrir le dossier que vous venez de créer Run indique qu'il n'y a pas extension python cliquer sur install coté de Python IntelliSense(Pylance) Microsoft python3 Python 3.9.7 import cv2 as cv cv.__version__ '4.7.0' probleme: il faut caster en int les l20 de homographie.py et a completer sur wiki: image=cv.line(image, (int(srcPoints[n][0]),int(srcPoints[n][1])),(int(srcPoints[(n+1)%4][0]),int(srcPoints[(n+1)%4][1])), color, thickness) ====Documentation OpenCV==== https://pypi.org/project/opencv-python/ lien vers documentation openCV: https://docs.opencv.org/4.7.0/ ====TP Prise en main librairie OpenCV via Python===== Nous allons commencer par prendre en main la librairie OpenCV via le langage Python: https://opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_tutorials.html ancienne url: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html Nous utiliserons l'environnement idle3 pour développer et tester. Image à télécharger dans votre dossier de projet {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/messi5.jpg}} =====TP1===== import numpy as np import cv2 import math print("version openCV:"+str( cv2.__version__ )) def trace_carre(u,v,sz): global res cv2.rectangle(res,(u-sz//2,v-sz//2),(u+sz//2,v+sz//2),(0,255,0),1) img = cv2.imread('messi5.jpg') res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) # Draw a diagonal blue line with thickness of 5 px cv2.line(res,(0,0),(511,511),(255,0,0),5) cv2.rectangle(res,(384,0),(510,128),(0,255,0),3) for i in range (10,300,10): print(str(i)) trace_carre(200,100,i) #sauver au format png pour compression sans perte cv2.imwrite('messi5out.png',res) print("fini") import numpy as np import cv2 import math print("version openCV:"+str( cv2.__version__ )) def trace_carre(u,v,sz): global res cv2.rectangle(res,(u-sz//2,v-sz//2),(u+sz//2,v+sz//2),(0,255,0),1) img = cv2.imread('messi5.jpg') res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) # Draw a diagonal blue line with thickness of 5 px cv2.line(res,(0,0),(511,511),(255,0,0),5) cv2.rectangle(res,(384,0),(510,128),(0,255,0),3) for i in range (10,300,10): print(str(i)) trace_carre(200,100,i) u=548; v=342; res[v][u-1]=[255,255,255] res[v][u+1]=[255,255,255] res[v-1][u]=[255,255,255] res[v+1][u]=[255,255,255] res[v][u]=[0,0,255] print(res[v][u] ) for j in range (0,256): for i in range (0,256): d=math.sqrt((i-127)*(i-127)+(j-127)*(j-127)) if d<=128: res[100+j][700+i]=[0,j,i] ballon=res[ 280*2:340*2,330*2:390*2] v1=100 u1=200 for u1 in range(100,810,200): v1=100+int(u1*0.5) res[v1:v1+ballon.shape[0],u1:u1+ballon.shape[1]]=ballon #sauver au format png pour compression sans perte cv2.imwrite('ballon.png',ballon) kernel = np.ones((5,5),np.float32)/25 res2 = cv2.filter2D(res,-1,kernel) res2 = cv2.filter2D(res2,-1,kernel) res2 = cv2.filter2D(res2,-1,kernel) res2 = cv2.filter2D(res2,-1,kernel) blur = cv2.GaussianBlur(img,(5,5),0) cv2.imwrite('blur.png',blur) #sauver au format png pour compression sans perte cv2.imwrite('messi5out.png',res) cv2.imwrite('messi5out2.png',res2) print("fini") =====Détection et comptage d'objets===== Image avant traitement: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/riz.jpg}} import numpy as np import cv2 import math imgcolor = cv2.imread('riz.jpg') img=cv2.cvtColor(imgcolor, cv2.COLOR_BGR2GRAY); print(img[0][0]) print(img[254][0]) #ret,thresh1 = cv2.threshold(img,60,255,cv2.THRESH_BINARY) # find otsu's threshold value with OpenCV function blur = cv2.GaussianBlur(img,(5,5),0) ret, thresh1= cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) kernel = np.ones((3,3),np.uint8) erosion = cv2.erode(thresh1,kernel,iterations = 2) ouverture = cv2.dilate(erosion,kernel,iterations = 1) contours, hierarchy = cv2.findContours(ouverture,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) i=0 for data in contours: print("The contours have this data "+str(data)) rect = cv2.minAreaRect(data) l=rect[1][1] m=rect[1][0] w=max(l,m) h=min(l,m) if h>0: aspect=float(w/h) else: aspect=10000000 area = cv2.contourArea(data) hull = cv2.convexHull(data) hull_area = cv2.contourArea(hull) if hull_area>0: solidity=float(area/hull_area) else: solidity=10000000000 perimeter = cv2.arcLength(data,True) #if i%2==0 : if aspect>1.9 and aspect<6 and area>40 and area<200 and solidity>0.8 and perimeter<45: cv2.drawContours(imgcolor,data,-1,(0,0,255),1) i=i+1 else: cv2.drawContours(imgcolor,data,-1,(0,255,0),1) print("hierarchy "+str(hierarchy )) #cv2.drawContours(imgcolor,contours,-1,(0,255,0),1) print(ret) print ("il y a "+str(i)+ " grains de riz") #sauver au format png pour compression sans perte '''cv2.imwrite('riz_ouverture.png',ouverture) cv2.imwrite('riz_erosion.png',erosion) cv2.imwrite('riz_thresh1.png',thresh1) cv2.imwrite('riz_out.png',img)''' cv2.imwrite('riz_out_contour.png',imgcolor) cv2.imshow('image',imgcolor) cv2.waitKey(0) cv2.destroyAllWindows() print("fini")