0

以下は、どこかからダウンロードしたソースコードです。赤色のオブジェクトを検出し、その中心座標を表示できます。

a = imaqhwinfo;
[camera_name, camera_id, format] = getCameraInfo(a);


% Capture the video frames using the videoinput function
% You have to replace the resolution & your installed adaptor name.
vid = videoinput(camera_name, camera_id, format);

% Set the properties of the video object
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 1;

%start the video aquisition here
start(vid)

% Set a loop that stop after 100 frames of aquisition
while(vid.FramesAcquired<=100)

% 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.17);

% 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);

% Here we do the image blob analysis.
% We get a set of properties for each labeled region.
stats = regionprops(bw, 'BoundingBox', 'Centroid');

% Display the image
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)))));
    %disp(' X-Coordinate   Y-cordinate')
    %x=gallery('uniformdata',[5 3],0);
    %disp(x)
    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 :) ')

問題は、目の瞳孔を検出したいので、画像内の黒色を検出する必要があることですが、コードを変更して黒色を検出できるように変更する方法がわかりません。それで、これに何か考えはありますか?私を助けてください、ありがとうございます。

4

1 に答える 1

4
diff_im = imsubtract(data(:,:,1), rgb2gray(data));

アルゴリズムがカラー データの赤のコンポーネントを抽出する場所です。そこで、いくつかの変更を加える必要があります。

赤のコンポーネントを抽出する代わりに (コードのコメントで指摘されているように)、グレースケールを続行できます。

diff_im = rgb2gray(data);

しかし、これは白い物体を見つけることにつながると思います。この問題に対処するには、ブロブ分析を変更するか、入力を反転するだけです。次のようになると思います。

diff_im = imcomplement(rgb2gray(data));

ただし、Image Processing Toolbox にアクセスできないため、ここではテストできません。自分でテストできますか?

イメージ パッケージを使用してオクターブでテストする

テストに使用した写真はこちらにあります

% Get the snapshot of the current frame
  data = imread('child-eye1-560x372.jpg');

% 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 = rgb2gray(data);
  imwrite(diff_im,'diff_im.jpg');
%Use a median filter to filter out noise
  diff_im = medfilt2(diff_im, [3 3]);
  imwrite(diff_im,'diff_im_filt1.jpg');
% Convert the resulting grayscale image into a binary image.
  diff_im = im2bw(diff_im,0.17);
  imwrite(diff_im,'diff_im_filt2.jpg');

これらは単なるフィルタリング手順であり、ブロブ分析機能はオクターブでは利用できません。結果の画像は次のとおりです。

child-eye1-560x372.jpg diff_im.jpg diff_im_filt1.jpg diff_im_filt2.jpg

のフィルター値im2bwを 0.07 に下げると、結果はさらに良くなります。 diff_im_filt2b.jpg

ご覧のとおり、プロセスのこの部分は問題ないようです。最後の画像はバイナリであるため、大きな大きなブロブを見つけるのはそれほど難しくありません。以前のように、自分でテストすることはできません...

問題はアルゴリズムにあるのではなく、提供するデータにあるのかもしれません。画像に小さな黒い塊が多数ある場合、アルゴリズムはそれらをすべて検出し、結果に含めます。

于 2012-05-08T22:03:30.920 に答える