Hi,
I am testing out my camera on face tracking and detection. When I run the code below, my video player will always hang at the first frame of streaming but the framecount is still increasing. After that, I will receive an error: Error using vision.VideoPlayer/step Changing the size on input 1 is not allowed without first calling the release() method.
% Create the face detector object.
faceDetector = vision.CascadeObjectDetector();% Create the point tracker object.
pointTracker = vision.PointTracker('MaxBidirectionalError', 2);% Create the webcam object.
%Connect camera and select mode format7 mode0
%let vid be the vid capture from the camera
vid = videoinput('pointgrey', 1, 'F7_Mono8_1024x4608_Mode0');%vid = videoinput('pointgrey', 1, 'Mono8_1024x768');
src = getselectedsource(vid);%src.FrameRate = '30';
src.FrameRatePercentage = 100;vid.ReturnedColorspace = 'grayscale';vid.FramesPerTrigger = inf;% Capture one frame to get its size.
videoFrame = getsnapshot(vid);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.
videoFrameGray = getsnapshot(vid); %videoFrameGray = rgb2gray(videoFrame);
frameCount = frameCount + 1; if numPts < 10 % Detection mode.
bbox = faceDetector.step(videoFrameGray); if ~isempty(bbox) % Find corner points inside the detected region.
points = detectMinEigenFeatures(videoFrameGray, 'ROI', bbox(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(bbox(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, oldInliers, visiblePoints] = estimateGeometricTransform(... oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4); % 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
- It is an omnidirectional camera
- It is grayscale on Matlab Pointgrey hardware
Thanks
Best Answer