ocr-orderid3 / flann.py
ethanrom's picture
Upload 26 files
2ed1ac5
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import cv2
import os
FONTS_FOLDER = "fonts"
NUM_IMAGES_PER_FONT = 5
def generate_images(text):
images = []
for font_file in os.listdir(FONTS_FOLDER):
font_path = os.path.join(FONTS_FOLDER, font_file)
for i in range(NUM_IMAGES_PER_FONT):
img = generate_text_image(text, font_path)
images.append((img, font_file))
return images
def generate_text_image(text, font_path, fontsize=None):
if not fontsize:
fontsize = int(np.random.normal(loc=50, scale=10))
font = ImageFont.truetype(font_path, fontsize)
text_size = font.getsize(text)
img = Image.new('RGB', text_size, color='black')
draw = ImageDraw.Draw(img)
draw.text((0, 0), text, font=font, fill='white')
noise = np.random.normal(loc=0, scale=10, size=(img.size[1], img.size[0]))[..., np.newaxis]
noise = np.tile(noise, [1, 1, 3])
img = Image.fromarray(np.clip(np.array(img) + noise, 0, 255).astype(np.uint8), 'RGB')
return np.array(img)
def flann_matching_alt(generated_images, query_image, num_trees=5, num_checks=50):
query_image_gray = cv2.cvtColor(query_image, cv2.COLOR_BGR2GRAY)
generated_images_gray = []
for img, _ in generated_images:
generated_images_gray.append(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
sift = cv2.SIFT_create()
index_params = dict(algorithm=0, trees=num_trees)
search_params = dict(checks=num_checks)
flann = cv2.FlannBasedMatcher(index_params, search_params)
query_kp, query_desc = sift.detectAndCompute(query_image_gray, None)
if query_desc is None:
return []
matching_results = []
for i, (img, font_file) in enumerate(generated_images):
kp, desc = sift.detectAndCompute(generated_images_gray[i], None)
if desc is not None:
matches = flann.knnMatch(query_desc, desc, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
matching_img = cv2.drawMatches(query_image_gray, query_kp, generated_images_gray[i], kp, good_matches, None, flags=2)
# Calculate percentage match
num_query_kp = len(query_kp)
num_matches = len(good_matches)
match_percent = 100 * num_matches / num_query_kp
matching_results.append((matching_img, font_file, match_percent))
return matching_results
def flann_matching(generated_images, query_image, num_trees=5, num_checks=50):
query_image_gray = cv2.cvtColor(query_image, cv2.COLOR_BGR2GRAY)
generated_images_gray = []
for img, _ in generated_images:
generated_images_gray.append(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
sift = cv2.SIFT_create()
index_params = dict(algorithm=0, trees=num_trees)
search_params = dict(checks=num_checks)
flann = cv2.FlannBasedMatcher(index_params, search_params)
query_kp, query_desc = sift.detectAndCompute(query_image_gray, None)
generated_kp = []
generated_desc = []
for img in generated_images_gray:
kp, desc = sift.detectAndCompute(img, None)
generated_kp.append(kp)
generated_desc.append(desc)
matching_results = []
for i, (img, font_file) in enumerate(generated_images):
matches = flann.knnMatch(query_desc, generated_desc[i], k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])
matching_img = cv2.drawMatchesKnn(query_image_gray, query_kp, img, generated_kp[i], good_matches, None, flags=2)
# Calculate percentage match
num_query_kp = len(query_kp)
num_matches = len(good_matches)
match_percent = 100*num_matches/num_query_kp
matching_results.append((matching_img, font_file, match_percent))
return matching_results
def flann_matching_3(generated_images, query_image, num_trees=5, num_checks=50):
query_image_gray = cv2.cvtColor(query_image, cv2.COLOR_BGR2GRAY)
generated_images_gray = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img, _ in generated_images]
sift = cv2.SIFT_create()
index_params = dict(algorithm=0, trees=num_trees)
search_params = dict(checks=num_checks)
flann = cv2.FlannBasedMatcher(index_params, search_params)
query_kp, query_desc = sift.detectAndCompute(query_image_gray, None)
if query_desc is None:
return []
matching_results = []
for i, (img, font_file) in enumerate(generated_images):
kp, desc = sift.detectAndCompute(generated_images_gray[i], None)
if desc is None:
continue
matches = flann.knnMatch(query_desc, desc, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
if len(good_matches) < 10:
continue
src_pts = np.float32([query_kp[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
if M is None:
continue
h, w = query_image_gray.shape
dst_img = cv2.warpPerspective(img, M, (w, h))
dst_gray = cv2.cvtColor(dst_img, cv2.COLOR_BGR2GRAY)
orb = cv2.ORB_create()
kp1, desc1 = sift.detectAndCompute(query_image_gray, None)
kp2, desc2 = sift.detectAndCompute(dst_gray, None)
if desc1 is None or desc2 is None:
continue
matches = flann.knnMatch(desc1, desc2, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
if len(good_matches) < 10:
continue
matching_img = cv2.drawMatches(query_image_gray, kp1, dst_gray, kp2, good_matches, None, flags=2)
# Calculate percentage match
num_query_kp = len(kp1)
num_matches = len(good_matches)
match_percent = 100 * num_matches / num_query_kp
matching_results.append((matching_img, font_file, match_percent))
return matching_results
def flann_matching_4(generated_images, query_image, num_trees=5, num_checks=50):
query_image_gray = cv2.cvtColor(query_image, cv2.COLOR_BGR2GRAY)
generated_images_gray = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img, _ in generated_images]
sift = cv2.SIFT_create()
index_params = dict(algorithm=0, trees=num_trees)
search_params = dict(checks=num_checks)
flann = cv2.FlannBasedMatcher(index_params, search_params)
query_kp, query_desc = sift.detectAndCompute(query_image_gray, None)
if query_desc is None:
return []
matching_results = []
for img, font_file in generated_images:
generated_image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kp, desc = sift.detectAndCompute(generated_image_gray, None)
if desc is None:
continue
matches = flann.knnMatch(query_desc, desc, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
matching_img = cv2.drawMatches(query_image_gray, query_kp, generated_image_gray, kp, good_matches, None, flags=2)
# Calculate percentage match
num_query_kp = len(query_kp)
num_matches = len(good_matches)
match_percent = 100 * num_matches / num_query_kp
matching_results.append((matching_img, font_file, match_percent))
return matching_results