[PYTHON] Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: tesseract-ocr edition)

Einführung

Hier werde ich versuchen, Zeichen aus den unter Masami Broadcasting angezeigten Untertiteln zu extrahieren. Da es keinen Hintergrund gibt, scheint dies bei der Binarisierung der Fall zu sein.

Es ist möglich, das Zeichen und die Position mit beträchtlicher Genauigkeit zu ermitteln, indem das Zeichen mit der Google Cloud Vision-API extrahiert wird. Hier werde ich jedoch versuchen, das Zeichen mit anderen Methoden abzurufen.

tesseract-ocr / pyocr

Versuchen Sie zunächst die Zeichenerkennung mit "tesseract" und "pyocr".

Dies ist das Quellbild. sentences.png

Extrahieren Sie die Zeichen und Positionen mit dem folgenden Skript.

import sys

import pyocr
import pyocr.builders

import cv2
from PIL import Image

def imageToText(src):
	tools = pyocr.get_available_tools()
	if len(tools) == 0:
		print("No OCR tool found")
		sys.exit(1)

	tool = tools[0]

	dst = tool.image_to_string(
		Image.open(src),
		lang='jpn',
		builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6)
	)
	return dst	

if __name__ == '__main__':
	img_path = sys.argv[1]

	out = imageToText(img_path)

	img = cv2.imread(img_path)
	sentence = []
	for d in out:
		sentence.append(d.content)
		cv2.rectangle(img, d.position[0], d.position[1], (0, 0, 255), 2)

	print("".join(sentence).replace("。","。\n"))

	cv2.imshow("img", img)
	cv2.imwrite("output.png ", img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()

Artikel 25 Alle Bürger haben das Recht auf ein gesundes und kulturell minimales Leben.
Die beiden Länder müssen sich bemühen, die soziale Wohlfahrt, die soziale Sicherheit und die öffentliche Gesundheit in allen Lebensbereichen zu verbessern und zu fördern.
(Recht auf Bildung und Verfahren zu erhalten]Artikel 26 Alle Bürger haben das Recht auf eine gleichberechtigte Ausbildung entsprechend ihren Fähigkeiten, wie dies gesetzlich vorgesehen ist.
2 Alle Bürger sind verpflichtet, dass ihre Kinder eine gesetzlich vorgeschriebene normale Ausbildung erhalten.
Die Schulpflicht ist kostenlos.
[Rechte und Pflichten der Arbeit, Standards der Arbeitsbedingungen und Verbot des Kindesmissbrauchs] Artikel 27 Alle Bürger haben das Recht und die Verpflichtung zur Arbeit.
2 Standards für Löhne, Arbeitszeiten, Ruhezeiten und andere Arbeitsbedingungen sind gesetzlich festgelegt.
3 Kinder dürfen dies nicht benutzen.
Recht der Arbeitnehmer auf Organisation und Gruppenaktion] Artikel 28 Das Recht auf Vereinigung der Arbeitnehmer und das Recht auf Gruppenverhandlungen und andere Gruppenaktionen sind gewährleistet.
Eigentumsrechte] Artikel 29 Eigentumsrechte werden nicht verletzt.
2 Der Inhalt der Eigentumsrechte ist gesetzlich so festgelegt, dass er dem Gemeinwohl entspricht.
3 Privateigentum kann mit gerechter Entschädigung für die Öffentlichkeit genutzt werden.

--Charakterposition output.png

Im Bild von nur Zeichen, die aus Word oder HTML erhalten wurden, können die Zeichen selbst erhalten werden, aber die genaue Position der Zeichen scheint schwierig zu erhalten zu sein. Was ich hier möchte, ist die Position in Satzeinheiten, aber selbst wenn ich sie mit dem Parameter "tesseract_layout = 6" anpasse, scheint es, dass ich sie nur in Zeicheneinheiten erhalten kann.

Methode

output.png

range.png

Ich habe versucht, durch Binärisierung und Hough-Konvertierung linear zu extrahieren, aber ich werde versuchen, OCR durch ROI (einen Teil des Bildes ausschneiden) nur für den Teil anzuwenden, in dem Untertitel wahrscheinlich einmal erscheinen.

Ich fragte mich, ob ich nur die grauen Untertitel in der Gegend extrahieren könnte, aber es fällt mir schwer zu wissen, was ich wahrscheinlich tun werde, weil ich unter Menschen leide: Schrei:

Entwicklung von

import sys

import cv2
import os
import numpy as np

import pyocr
import pyocr.builders

from PIL import Image, ImageDraw, ImageFont

import time

def process(src):
	kernel = np.ones((3,3),np.uint8)
	gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

	o_ret, o_dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
	dst = cv2.morphologyEx(o_dst, cv2.MORPH_OPEN, kernel)
	return cv2.bitwise_not(dst)

def imageToText(tool, src):
	tmp_path = "temp.png "

	cv2.imwrite(tmp_path, src)
	dst = tool.image_to_string(
		Image.open(tmp_path),
		lang='jpn',
		builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6)
	)

	sentence = []
	for item in dst:
		sentence.append(item.content)

	return "".join(sentence)


def createTextImage(src, sentence, px, py, color=(8,8,8), fsize=28):

	tmp_path = "src_temp.png "
	cv2.imwrite(tmp_path, src)

	img = Image.open(tmp_path)
	draw = ImageDraw.Draw(img)

	font = ImageFont.truetype("./IPAfont00303/ipag.ttf", fsize)
	draw.text((px, py), sentence, fill=color, font=font)
	img.save(tmp_path)
	return cv2.imread(tmp_path)



if __name__ == '__main__':

	tools = pyocr.get_available_tools()
	if len(tools) == 0:
		print("No OCR tool found")
		sys.exit(1)

	tool = tools[0]

	cap = cv2.VideoCapture('one_minutes.mp4')

	cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
	cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
	fps = cap.get(cv2.CAP_PROP_FPS)

	telop_height = 50

	fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
	writer = cv2.VideoWriter('extract_telop_text.mp4',fourcc, fps, (cap_width, cap_height + telop_height))

	start = time.time()
	count = 0
	try :
		while True:
			if not cap.isOpened():
				break

			if cv2.waitKey(1) & 0xFF == ord('q'):
				break

			ret, frame = cap.read()

			if frame is None:
				break

			telop = np.zeros((telop_height, cap_width, 3), np.uint8)
			telop[:] = tuple((128,128,128))

			gray_frame = process(frame)
			roi = gray_frame[435:600, :]
			txt = imageToText(tool, roi)

			images = [frame, telop]

			frame = np.concatenate(images, axis=0)
			font = cv2.FONT_HERSHEY_SIMPLEX

			seconds = round(count/fps, 4)

			cv2.putText(frame, "{:.4f} [sec]".format(seconds), 
						(cap_width - 250, cap_height + telop_height - 10), 
						font, 
						1, 
						(0, 0, 255), 
						2, 
						cv2.LINE_AA)

			writer.write(createTextImage(frame, txt, 20, cap_height + 10))
			count += 1

			print("{}[sec]".format(seconds))

	except cv2.error as e:
		print(e)	

	writer.release()
	cap.release()

	print("Done!!! {}[sec]".format(round(time.time() - start,4)))

Ergänzung

――Ich verwende PIL anstelle von openCV, um japanische Zeichen zu schreiben, aber wenn ich die Daten übergebe, speichere ich die Bilddatei vorübergehend. Aus diesem Grund dauerte die Erstellung des Videos mehr als 10 Minuten: heat_smile: Gibt es einen guten Weg: enttäuscht_relieved:

Beispiel)


tmp_path = "src_temp.png "
#Geben Sie die in openCV verwendeten Bilddaten aus
cv2.imwrite(tmp_path, src)

#Daten mit PIL lesen
img = Image.open(tmp_path)
  1. Schwarzweißbild
  2. Binarisierungsverarbeitung nach Otsu-Formel
  3. Rauschunterdrückung durch Öffnungsvorgang (Schrumpfen-> Vergrößern)
  4. Invertieren Sie das Bild
def process(src):
	kernel = np.ones((3,3),np.uint8)
	gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

	o_ret, o_dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
	dst = cv2.morphologyEx(o_dst, cv2.MORPH_OPEN, kernel)
	return cv2.bitwise_not(dst)

Ergebnis

extract_telop_text.gif

Kampe stört die Charaktererkennung ein wenig, aber ich denke, es kann bis zu einem gewissen Grad gelesen werden.

abschließend

Versuchen wir als Nächstes die Zeichenerkennung mithilfe der Google Cloud Vision-API. Ich habe Demo von https://cloud.google.com/vision/ ausprobiert, aber die Genauigkeit ist immer noch hoch. demo.png

Hilfreicher Link

Recommended Posts

Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: tesseract-ocr edition)
Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: Google Cloud Vision API)
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, Spieler- und Fertigkeitsnamen aus Sportartikeln zu extrahieren
Ich habe versucht, Ansibles Module-Linux-Edition zusammenzufassen
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, der CPython Extra Edition ein Post-Inkrement hinzuzufügen
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Ich habe versucht zu debuggen.
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, Dropout zu erklären
Ich habe versucht, verschiedene Informationen von Remote-PC aus Python von WMI Library zu extrahieren
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, englische Untertitel mit Udemy gewaltsam ins Japanische zu übersetzen
jupyter ich habe es berührt
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Modellversion)
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 1/3 zuerst von MNIST zu machen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
Ich habe versucht, die Videowiedergabezeit anzuzeigen (OpenCV: Python-Version)
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Pytorchs Datensatz zu erklären
Ich habe Watson Voice Authentication (Speech to Text) ausprobiert.
Ich habe Teslas API berührt
Ich habe versucht, Aufgaben bei Sellerie in die Warteschlange zu stellen
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, den Abschnitt zu schätzen.
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
Mayungos Python Learning Episode 2: Ich habe versucht, Zeichen mit Variablen zu löschen