Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python
Als ich mich beim Erstellen des obigen Artikels mit OpenCV befasst habe, scheint es, dass ich wirklich verschiedene Dinge tun kann, also habe ich beschlossen, zu versuchen, was ich mir vorerst ausgedacht habe.
Das Verfahren der "Projektionskonvertierung", bei dem das von der Kamera der Visitenkarte aufgenommene Bild so korrigiert wird, als ob es von vorne aufgenommen worden wäre, ist nachstehend zusammengefasst.
Artikel | Inhalt |
---|---|
Maschine | MacBook Air (13-inch, Early 2015) |
Prozessor | 2.2 GHz Intel Core i7 |
Erinnerung | 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 |
Die übliche Front-Miso finden Sie unter der folgenden URL.
Verwenden Sie die Rückseite Ihrer Visitenkarte, die mit einer iPhone-Kamera aufgenommen wurde. (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
#Graustufen
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Binarisierung
ret,th1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
display_cv_image(th1)
Das Ergebnis der Binärisierung ist wie folgt.
python
#Konturextraktion
image, contours, hierarchy = cv2.findContours(th1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#Sortieren Sie nur diejenigen mit einer großen Fläche
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)
Der Umriss wurde korrekt extrahiert und ich konnte ihn in einen roten Rahmen einschließen.
Projiziert jeden Punkt des Rahmens gemäß den entsprechenden Koordinaten.
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)
Das konvertierte Ergebnis lautet wie folgt.
erledigt!
Ich habe versucht, die erkannten Visitenkartenzeichen mithilfe einer Bibliothek namens tesseract-ocr zu orcieren.
Fügen Sie nach dem obigen Quellcode den folgenden Code hinzu.
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"))
Ergebnis ist ...
[Gast halten]
ヽ/Dimension Tour Eröffnungstechnologie
Küstennachrichten ‡
Typ 3 Denki Chief Brancher
Otoshiki Sagi 4 Condyle Gefährliche Ballhandhabungskleidung
Karate erste Stufe
Nisuta
... es gibt Raum für Verbesserungen (Schweiß)
Recommended Posts