fc2ブログ

OpenCVでテンプレートマッチングを使う

 画像の中に下図のようなスケールがあり、そのスケールの目盛の値をどのように読み取るかを考えている中で、まず数字を画像認識しなくてはならないなと思い、OpenCVでテンプレートマッチングを行ってみました。OpenCVは良く使いますが、テンプレートマッチングは初めてです。ネット上にいろいろ情報があるので、それらを参考にしました。Scale_Image1_210228.png 検証に使ったスケールの画像とそこから切り抜いた数字は以下の通りです。Scale_Image2_210228.png また、実行したPythonコード(scale.py)は以下の通りです。
import cv2
import numpy as np

# Input Image
img = cv2.imread('scale.png',0)

# Template Image
TempFilename = []
TempValname = []
for i in range(9):
TempFilename.append(str(i)+'.png')
TempValname.append('Template'+str(i))
# Image read
TempValname[i] = cv2.imread(TempFilename[i],0)

# Template matching
for i in range(9):
w, h = TempValname[i].shape[::-1] # Template image size

res = cv2.matchTemplate(img, TempValname[i], cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(str(i) + ' -> max_val: ' + str('{:.3f}'.format(max_val)), ', max_loc: ' + str(max_loc))

# Result image
top_left = max_loc
btm_right = (top_left[0]+w, top_left[1]+h)
img_temp = img.copy()
cv2.rectangle(img_temp, top_left, btm_right, 0, 2)
cv2.imwrite('res'+str(i)+'.png',img_temp)
 5行目で入力画像を読み込み、8〜14行目で9個のテンプレート画像(0〜8数字の画像)を読み込みます。17行目から各数字についてテンプレートマッチング(20行目)を行います。今回は、正規化相関係数法(NCC: Normalized Cross Correlation)で類似度を判断しました。OpenCVではcv2.TM_CCOEFF_NORMEDを指定しました。
 22行目の結果は以下の通りでした。数字の0〜8について、最大値(max_val)が1に近いほどマッチングが良いことを表していますが、同じ画像から採取しているので、当然、完全マッチングしていることが分かります。max_locは検出したオブジェクトの左上の座標を表しています。Res_matching_210228.png29行目の結果画像は以下の通りで、問題なく検出できていることが分かりました。Res_Image1_210228.png テンプレートマッチングの類似度の指標として、その他に正規化二乗差分法(cv2.TM_SQDIFF_NORMED)、正規化相互相関法(cv2.TM_CCORR_NORMED)等があります。正規化二乗差分法と正規化相互相関法も試してみましたが、検出結果は同じでした。

 次に一番初めのスケール画像の結果は以下の通りになりました。Res_Image2_210228.png類似度を表す、結果の最大値(max_val)に閾値を設ければ、その数字の有無と画像上の座標を正しく検出できることが良く分かりました。

今回初めてテンプレートマッチングを触ってみましたが、簡単に数字とその画像上の座標を検出できることが分かりました。いろいろと応用が利きそうなので別案件でも使ってみようと思います。
スポンサーサイト



AzureのComputer Visionを使う(4)

 前回の投稿から2か月経ちました。「Azure Cognitive Services」に含まれる「Computer Vision」の光学式文字認識(OCR)機能が日本語に対応したとのネット記事を見つけましたので、早速試してみました。

 実行したPythonコードは以下の通りで、GitHubにあるコードを参考にしました。
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from azure.cognitiveservices.vision.computervision.models import VisualFeatureTypes
from msrest.authentication import CognitiveServicesCredentials

from array import array
import os
from PIL import Image
import sys
import time

# Azure setting
subscription_key = "・・・・・・"
endpoint = "https://azure-computer-vision.cognitiveservices.azure.com/"
computervision_client = ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))

# Image file
local_image_printed_text_path = "./blog0.png"

#-----------------------------------
# Recognize Printed Text with OCR
#-----------------------------------
# Open local image
local_image_printed_text = open(local_image_printed_text_path, "rb")

print("===== Detect Printed Text with OCR =====")

ocr_result_local = computervision_client.recognize_printed_text_in_stream(local_image_printed_text, language="ja")
for region in ocr_result_local.regions:
for line in region.lines:
#print("Bounding box: {}".format(line.bounding_box))
s = ""
for word in line.words:
s += word.text + ""
print(s)
print()
13、14行目には個人のazure-computer-visionのキーとエンドポイントを設定しました。

 また、日本語のOCRとして、FreeのTesseractが有名ですが、文字認識の実力を相互に比較しました。PythonでTesseractを実装するには「pyocrライブラリ」を利用しました。ネット上に詳しいサイトがありましたので、参考にさせていただきました。

 ブログの文章を画像ファイル(png)にして、実行した結果が以下の通りです。誤認識部分にマーキングしています。

1. 画像ファイルblog0_210223.png1.1. Azure Computer Visionblog0_res_cv_210223.png1.2. Tesseractblog0_res_tr_210223.png
2. 画像ファイルblog1_210223.png2.1. Azure Computer Visionblog1_res_cv_210223.png2.2. Tesseractblog1_res_tr_210223.png
全体的にみて、Azure Computer Visionの方が「意味不明」箇所が多いように思います。
 AI KIT → K灯、川灯T
 Intel → ⅲ
 Python → Pyth。n
 Bootcamp → Bo猷camp
 Visual Studio → Visu引Studio
日本語と英語が混合の文章に弱いのか?、強引に日本語に変換しようという努力?が見られます。実行コードはデフォルト設定(上記の結果はデフォルト設定)、日本語設定を試してみましたが、結果は大きく変わりませんでした。言語を自動で認識しているのでしょう・・。「日本語+英語」の混合設定ができれば改善するかも知れませんが、現時点でその方法を見つけられていません。一方、TessaractはFreeの割には健闘していますね。改めて感心しました。

Azure Computer Visionも日々改善は進むと思いますので、忘れた頃にまた試してみようと思います。

カミュ著『ペスト』を読む

 コロナ禍が続き、直近では都市部の新規感染者が減少し、非常事態宣言がもうすぐ解除されそうですね。休日の繁華街の人口密度も上がっているようですが、まだまだ街中を出歩くのは時期尚早と思い、遠出はせず、近所への外出のみの生活を送っています。

 テレビかネット情報だったか覚えていませんが、カミュの『ペスト』が話題になっており、現在のコロナ禍を乗り切るヒントがあるのではないかと思い、まずはマンガ版を味見しました。

まんがでわかるカミュ『ペスト』 小川仁志(監修), 前山三都里(イラスト) マンガなので内容はスルスルと頭に入ってきました。

 その後、原著も読んでみたいと思い、新潮文庫の宮崎嶺雄氏翻訳の本を購入しました。読んでみた感想は・・・。

マンガであらすじをつかんでいたから良かったものの、非常に読みにくいものでした。
翻訳の日本語が難解過ぎて、1回読んでも頭に入ってこない・・・。
何回も読み返しますが、頭に入らずに、理解できない。これって日本語なんだろうか?

読み進むに連れて、もう読むのをやめようかなと思いましたが、中途半端なことが嫌いな性格なので、結局、訳者の文章ではなく、訳者の単語を自分なりに結びつけて、翻訳の翻訳をして読み進めました。かなりストレスが溜まりましたが、何とか最後まで読み切りました。

本著の解説も翻訳者が書かれていましたが、その解説の日本語はまだ読むに耐えうるものでした。訳者の文章力・翻訳力を疑いましたが、フランス語の原著が難しいのでしょうね。

何はともかく、私にとっては、コロナ禍のヒントはなく、実りの少ない読書でした。やはり、文学は苦手ですね。理系頭なので・・

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: