リアルタイムで目を認識して,認識した時にスクリーンショットを取りたい
Show older comments
パソコンのカメラのリアルタイム表示映像から目を認識させ,認識したら静止画を取得するプログラムを作成しようとしているのですが,
リアルタイム表示で目を認識させるところまでは出来たのですが,そこからどのようにしたらいいか分かりません.
% Create the face detector object.
eyeDetector=vision.CascadeObjectDetector('EyePairBig');
% Create the point tracker object.
pointTracker = vision.PointTracker('MaxBidirectionalError', 2);
% Create the webcam object.
cam = webcam();
% Capture one frame to get its size.
videoFrame = snapshot(cam);
frameSize = size(videoFrame);
% Create the video player object.
videoPlayer = vision.VideoPlayer('Position', [100 100 [frameSize(2), frameSize(1)]+30]);
runLoop = true;
numPts = 0;
frameCount = 0;
while runLoop && frameCount < 400
% Get the next frame.
videoFrame = snapshot(cam);
videoFrameGray = rgb2gray(videoFrame);
frameCount = frameCount + 1;
if numPts < 10
% Detection mode.
bboxeye = eyeDetector.step(videoFrameGray);
if ~isempty(bboxeye)
% Find corner points inside the detected region.
points = detectMinEigenFeatures(videoFrameGray, 'ROI', bboxeye(1, :));
% Re-initialize the point tracker.
xyPoints = points.Location;
numPts = size(xyPoints,1);
release(pointTracker);
initialize(pointTracker, xyPoints, videoFrameGray);
% Save a copy of the points.
oldPoints = xyPoints;
% Convert the rectangle represented as [x, y, w, h] into an
% M-by-2 matrix of [x,y] coordinates of the four corners. This
% is needed to be able to transform the bounding box to display
% the orientation of the face.
bboxPoints = bbox2points(bboxeye(1, :));
% Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4]
% format required by insertShape.
bboxPolygon = reshape(bboxPoints', 1, []);
% Display a bounding box around the detected face.
videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3);
% Display detected corners.
videoFrame = insertMarker(videoFrame, xyPoints, '+', 'Color', 'white');
end
else
% Tracking mode.
[xyPoints, isFound] = step(pointTracker, videoFrameGray);
visiblePoints = xyPoints(isFound, :);
oldInliers = oldPoints(isFound, :);
numPts = size(visiblePoints, 1);
if numPts >= 10
% Estimate the geometric transformation between the old points
% and the new points.
[xform, inlierIdx] = estimateGeometricTransform2D(...
oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
oldInliers = oldInliers(inlierIdx, :);
visiblePoints = visiblePoints(inlierIdx, :);
% Apply the transformation to the bounding box.
bboxPoints = transformPointsForward(xform, bboxPoints);
% Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4]
% format required by insertShape.
bboxPolygon = reshape(bboxPoints', 1, []);
% Display a bounding box around the face being tracked.
videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3);
% Display tracked points.
videoFrame = insertMarker(videoFrame, visiblePoints, '+', 'Color', 'white');
% Reset the points.
oldPoints = visiblePoints;
setPoints(pointTracker, oldPoints);
end
end
% Display the annotated video frame using the video player object.
step(videoPlayer, videoFrame);
% Check whether the video player window has been closed.
runLoop = isOpen(videoPlayer);
end
% Clean up.
clear cam;
release(videoPlayer);
release(pointTracker);
release(eyeDetector);
分かる方がいらっしゃったら教えていただきたいです.
2 Comments
Atsushi Ueno
on 11 May 2021
>(目を)認識したら静止画を取得する
一番外側のループ処理内で「静止画の取得」を実施しています
% Get the next frame.
videoFrame = snapshot(cam);
「目を認識した時」=「認識した特徴点(numPts)が10個以上になった時」の静止画(videoFrame)を取得すれば良いのですね。
Accepted Answer
More Answers (1)
Atsushi Ueno
on 11 May 2021
「目を認識した時」=「認識した特徴点(numPts)が10個以上になった時」に、静止画(videoFrame)を別の変数にコピーする処理です。
else
detectedFrame = videoFrame;
% Tracking mode.
現状のプログラムは、目を認識したら認識モードから追跡モードに移り、特徴点(numPts)が10個未満に減るまで追跡モードの処理を続け、その結果動画が表示されてしまい、目的の静止画情報(videoFrame)はそのまま次のフレームに流れ消えてしまいます。
上記処理を加えれば、目を認識した時の静止画(detectedFrame)が、次に目を認識する時まで保持されています。
3 Comments
Atsushi Ueno
on 11 May 2021
上記だと「目を認識した時」の1フレーム後の静止画をコピーしちゃいますね。1フレームずれても大体期待通りに機能するとは思いますが正確ではないです。
if numPts < 10
detectedFrame = videoFrame;
% Detection mode.
ここに入れておけば、検出モード中は静止画をコピーし続け、「目を認識した時」=「検出モードから追跡モードに移った時」最後にコピーした静止画が残るので、たった1フレーム分ですがこちらの方が正確です。
tsuyoshi tsunoda
on 11 May 2021
Atsushi Ueno
on 12 May 2021
もちろんデータが在るので保存する事は出来ますよ。
私はcomputer vision toolboxを持ってないので動作確認できませんが、関数の仕様を調べてやってみます。
Categories
Find more on Cloud File Storage in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!