リアルタイムで撮影し​た画像から文字認識を​行い、画像を表示する

16 views (last 30 days)
竣 齊藤
竣 齊藤 on 8 Sep 2021
Commented: 竣 齊藤 on 19 Sep 2021
はじめに、PCのカメラを用いて成分表示が英語で記載されているものを撮影を行います。撮影した成分表示の画像の中に、添付した画像のwordの列の英単語があったとき、日本語訳とその日本語訳のイラストの画像を表示するプログラムを作成しています。
img = imread('使用写真.jpg');
results = ocr(img);
Ninshikimoji = lower(results.Words);
Ninshikiwaku = results.WordBoundingBoxes;
Jisho = readtable('allergy.xlsx','ReadRowNames',true);
word = categorical(Jisho.word);
Mininshiki = blanks(0);
for n = 1:size(Ninshikimoji,1)
if any(word == Ninshikimoji{n})
Shoukai = Jisho{Ninshikimoji{n},:};
% 追加箇所:ここから
img = insertObjectAnnotation(img,'rectangle',Ninshikiwaku(n,:),Shoukai{:},'font','Yu Gothic Bold');
%img = insertText(img,Ninshikiwaku(n,[1 2]),Shoukai{:},'font','fonts-japanese-gothic','AnchorPoint','LeftBottom');
x = Ninshikiwaku(n,1); y = Ninshikiwaku(n,2); w = Ninshikiwaku(n,3); h = Ninshikiwaku(n,4);
logo = imresize(imread([Shoukai{:} '.png']),0.3);
img((y-h):(y-h+size(logo,1)-1),(x+w):(x+w+size(logo,2)-1),:) = logo;
% 追加箇所:ここまで
else
Mininshiki = [Mininshiki ' ' Ninshikimoji{n}];
end
end
imshow(img);
現状は、前にMATLAB ANSWERSでご教授して頂き、すでに保存されている成分表示が英語で記載されている画像から、添付したExcelの画像のwordの列の英単語があった時に既存の写真内に日本語訳と日本語訳に対応するイラストの画像を表示するところまでは完了しました。
今回ご教授して頂きたい点は、すでに保存されている画像ではなく、リアルタイム撮影で取得した画像を用いてプログラムを実行するという点となります。
ご教授の程、よろしくお願い致します。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 8 Sep 2021
必要なToolboxは、Computer Vision Toolbox (既にocrで使っている) 、MATLAB Support Package for USB Webcamsです。
このドキュメントのプログラムを参考に(パクって)組み合わせるとこんな感じです。(動かせないのでデバッグしていません)
cam = webcam();
videoFrame = snapshot(cam);
frameSize = size(videoFrame);
videoPlayer = vision.VideoPlayer('Position', [100 100 [frameSize(2), frameSize(1)]+30]);
runLoop = true;
while runLoop
videoFrame = snapshot(cam);
results = ocr(videoFrame);
Ninshikimoji = lower(results.Words);
Ninshikiwaku = results.WordBoundingBoxes;
Jisho = readtable('allergy.xlsx','ReadRowNames',true);
word = categorical(Jisho.word);
Mininshiki = blanks(0);
for n = 1:size(Ninshikimoji,1)
if any(word == Ninshikimoji{n})
Shoukai = Jisho{Ninshikimoji{n},:};
videoFrame = insertObjectAnnotation(videoFrame,'rectangle',Ninshikiwaku(n,:),Shoukai{:},'font','Yu Gothic Bold');
x = Ninshikiwaku(n,1); y = Ninshikiwaku(n,2); w = Ninshikiwaku(n,3); h = Ninshikiwaku(n,4);
logo = imresize(imread([Shoukai{:} '.png']),0.3);
videoFrame((y-h):(y-h+size(logo,1)-1),(x+w):(x+w+size(logo,2)-1),:) = logo;
else
Mininshiki = [Mininshiki ' ' Ninshikimoji{n}];
end
end
step(videoPlayer, videoFrame);
runLoop = isOpen(videoPlayer);
end
clear cam;
release(videoPlayer);
  4 Comments
Atsushi Ueno
Atsushi Ueno on 16 Sep 2021
Edited: Atsushi Ueno on 16 Sep 2021
VideoFrame(y:(y+size(logo,1)-1),(x+w):(x+w+size(logo,2)-1),:) = logo;
たぶん「認識枠の左上座標(y) < 認識枠の高さ(h)」だからです。とりあえず上記の座標演算からhを除けばエラーは出なくなるはずです。
アレルギー食物の画像を表示する位置をより良くしようとして、認識枠の左上x座標にはw(幅)を足して、認識枠の左上y座標からはh(高さ)を引く事をしました。この事がエラーの原因だと思います。
あと認識枠が画像の端にあって、貼り付けるロゴがはみ出す場合も現状のコードではエラーになります。その場合は貼り付けるロゴの「はみ出さない部分だけ」の座標を計算して貼り付ける必要があります(めんどい)
「画像データの任意位置に別の画像を貼り付ける(上記はみ出しの処理もしてくれる)」便利な関数があれば良いんですけどね。画像関連のToolboxを探せばあるかもしれません。
竣 齊藤
竣 齊藤 on 19 Sep 2021
ご教授して頂きありがとうございます。

Sign in to comment.

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!