リアルタイムで撮影した画像から文字認識を行い、画像を表示する
16 views (last 30 days)
Show older comments
はじめに、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の列の英単語があった時に既存の写真内に日本語訳と日本語訳に対応するイラストの画像を表示するところまでは完了しました。
今回ご教授して頂きたい点は、すでに保存されている画像ではなく、リアルタイム撮影で取得した画像を用いてプログラムを実行するという点となります。
ご教授の程、よろしくお願い致します。
0 Comments
Accepted Answer
Atsushi Ueno
on 8 Sep 2021
このドキュメントのプログラムを参考に(パクって)組み合わせるとこんな感じです。(動かせないのでデバッグしていません)
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
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を探せばあるかもしれません。
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!