Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python
Lorsque j'ai examiné OpenCV lors de la création de l'article ci-dessus, il semble que je puisse vraiment faire diverses choses, j'ai donc décidé d'essayer ce que j'avais proposé pour le moment.
Ainsi, la procédure de «conversion par projection» qui corrige l'image d'une carte de visite prise avec un appareil photo comme si elle était prise de face est résumée ci-dessous.
article | Contenu |
---|---|
Machine | MacBook Air (13-inch, Early 2015) |
Processeur | 2.2 GHz Intel Core i7 |
Mémoire | 8 GB 1600 MHz DDR3 |
Python | 3.6.0 :: Anaconda 4.3.1 (x86_64) |
Jupyter Notebook | 4.2.1 |
OpenCV | 3.3.0-rc |
Veuillez vous référer à l'URL suivante pour le miso avant habituel.
Utilisez le verso de votre carte de visite prise avec un appareil photo iPhone. (IMG_4778.JPG)
python
import cv2
import numpy as np
from IPython.display import display, Image
def display_cv_image(image, format='.png'):
decoded_bytes = cv2.imencode(format, image)[1].tobytes()
display(Image(data=decoded_bytes))
python
img = cv2.imread("IMG_4778.JPG")
display_cv_image(img)
python
#Échelle de gris
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Binarisation
ret,th1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
display_cv_image(th1)
Le résultat de la binarisation est le suivant.
python
#Extraction de contour
image, contours, hierarchy = cv2.findContours(th1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#Trier uniquement ceux qui ont une grande surface
areas = []
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 10000:
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
areas.append(approx)
cv2.drawContours(img,areas,-1,(0,255,0),3)
display_cv_image(img)
Le contour a été extrait correctement et j'ai pu le placer dans un cadre rouge.
Projette chaque point du cadre selon les coordonnées correspondantes.
python
img = cv2.imread("IMG_4778.JPG")
dst = []
pts1 = np.float32(areas[0])
pts2 = np.float32([[600,300],[600,0],[0,0],[0,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(600,300))
display_cv_image(dst)
Le résultat converti est le suivant.
l'a fait!
J'ai essayé d'ORC les caractères de carte de visite reconnus en utilisant une bibliothèque appelée tesseract-ocr.
Ajoutez le code suivant après le code source ci-dessus.
python
import pyocr
from PIL import Image
tools = pyocr.get_available_tools()
tool = tools[0]
print(tool.image_to_string(Image.fromarray(dst), lang="jpn"))
Le résultat est ...
[Invité en attente]
ヽ/Technologie d'ouverture du tour de dimension
Actualités côtières ‡
Chef Brancher Type 3 Denki
Otoshiki Sagi 4 Condyle Vêtements de manipulation de balles dangereuses
Karaté première étape
Nisuta
... il y a place à l'amélioration (transpiration)
Recommended Posts