MATLAB Answers

hu
0

QRコードを追跡する​プログラムを完成させ​たいです。

Asked by hu
on 18 Sep 2019
大学生の初心者です。
QRコードの切り出しシンボルを認識、追跡するプログラム https://jp.mathworks.com/matlabcentral/fileexchange/71090-qr-code-reader-example
この二つを合わせて、qrコードの切り出しシンボルを追跡するプログラムを作成したいと思っています。
QRのプログラムは反応が遅く見切れるとプログラムが終了されてしまいます。
赤色追跡のプログラムは、動きますがこのプログラムの追跡する部分を利用して、赤色オブジェクトの部分をQRに差し替えようとしましたが、うまくいきません
赤色追跡のプログラムのオブジェクトを変更させる方法や、他にqrを追跡する方法があればアドバイスをお願いします。
% Capture the video frames using the videoinput function
% You have to replace the resolution & your installed adaptor name.
vid = videoinput( 'winvideo',1, 'YUY2_320x240');
% Set the properties of the video object
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 5;
%start the video aquisition here
start(vid)
% Set a loop that stop after 100 frames of aquisition
while(vid.FramesAcquired<=200)
% Get the snapshot of the current frame
data = getsnapshot(vid);
% Now to track red objects in real time
% we have to subtract the red component
% from the grayscale image to extract the red components in the image.
diff_im = imsubtract(data(:,:,1), rgb2gray(data));
%Use a median filter to filter out noise
diff_im = medfilt2(diff_im, [3 3]);
% Convert the resulting grayscale image into a binary image.
diff_im = im2bw(diff_im,0.18);
% Remove all those pixels less than 300px
diff_im = bwareaopen(diff_im,300);
% Label all the connected components in the image.
bw = bwlabel(diff_im, 8);
%imshow(bw)
[Centroid, bw2, flag, width, bbox] = detectFinder(bw);
markers = Centroid(logical(flag),:);
% 歪補正用アライメントパターン検出
bwa = imclearborder(bw);
bwa = bwpropfilt(bwa, 'EulerNumber', [0, 0]);
bwa = imfill(bwa, 'holes');
stats = regionprops(bwa, 'Area', 'Centroid');
area = [stats.Area];
[mv, i] = min(area);
alp = stats(i).Centroid;
% ファインダの位置可視化用マスク
bwf = imfill(bw2, 'holes');
% アライメントパターンの位置可視化用マスク
bwl = bwlabel(bwa);
bwl = bwl == i;
bwlf = bwf | bwl;
mask3 = repmat(bwlf, [1 1 3]);
imgf = img;
% ファインダ&アライメントパターン以外の輝度値を落とす
imgf(~mask3) = imgf(~mask3) * 0.2;
imshow(data)
hold on
%This is a loop to bound the red objects in a rectangular box.
for object = 1:length(stats)
bb = stats(object).BoundingBox;
bc = stats(object).Centroid;
rectangle('Position',bb,'EdgeColor','r','LineWidth',2)
plot(bc(1),bc(2), '-m+')
%a=text(bc(1)+15,bc(2), strcat('X: ', num2str(round(bc(1))), ' Y: ', num2str(round(bc(2)))));
%set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
end
hold off
end
% Both the loops end here.
% Stop the video aquisition.
stop(vid);
% Flush all the image data stored in the memory buffer.
flushdata(vid);
% Clear all variables
clear all
sprintf('%s','That was all about Image tracking, Guess that was pretty easy :) ')
cam = webcam();
% Capture one frame to get its size.
for i=1:100
img = snapshot(cam);
% 2値化
bw = imbinarize(rgb2gray(img));
%imshow(bw)
[Centroid, bw2, flag, width, bbox] = detectFinder(bw);
markers = Centroid(logical(flag),:);
% 歪補正用アライメントパターン検出
bwa = imclearborder(bw);
bwa = bwpropfilt(bwa, 'EulerNumber', [0, 0]);
bwa = imfill(bwa, 'holes');
stats = regionprops(bwa, 'Area', 'Centroid');
area = [stats.Area];
[mv, i] = min(area);
alp = stats(i).Centroid;
% ファインダの位置可視化用マスク
bwf = imfill(bw2, 'holes');
% アライメントパターンの位置可視化用マスク
bwl = bwlabel(bwa);
bwl = bwl == i;
bwlf = bwf | bwl;
mask3 = repmat(bwlf, [1 1 3]);
imgf = img;
% ファインダ&アライメントパターン以外の輝度値を落とす
imgf(~mask3) = imgf(~mask3) * 0.2;
imshow(imgf)
end
clear('cam');

  0 Comments

Sign in to comment.

0 Answers