<< Chapter < Page | Chapter >> Page > |
We round the angle to 0, 45, 90 and 135. With a specific angle value, we examine the maxima within the range of three pixel values in that direction (vertically, horizontally or diagonally). By picking up the maxima and discarding non maxima points, the edge will be one pixel wide. In order to enhance the detection, we use hysteresis thresholding.
Non-maximum suppression
s = padarray(s,[1 1]);theta1 = padarray(theta1,[1 1]);for k = 2:(size(m,1)+1)
for l = 2:(size(m,1)+1)if ((theta1(k,l) == 90)&&(s(k,l)== max(max(s(k+1,l),s(k,l)),...
s(k-1,l))))mge(k,l) = s(k,l);
elseif ((theta1(k,l) == 0)&&(s(k,l)== max(max(s(k,l+1),...
s(k,l)),s(k,l-1))))mge(k,l) = s(k,l);
elseif ((theta1(k,l) == 135)&&(s(k,l) == max(max(s(k+1,l+1),...
s(k,l)),s(k-1,l-1))))mge(k,l) = s(k,l);
elseif ((theta1(k,l) == 45)&&(s(k,l) == max(max(s(k+1,l-1),...
s(k,l)),s(k-1,l+1))))mge(k,l) = s(k,l);
endend
end
Hysteresis thresholding
% Hysteresis Thresholding
% Hysteresis is one way of solving this problem. Instead of choosing a single% threshold, two thresholds thigh and tlow are used.
high = 105;low = 35;
tmg = mge;% find the edge to be discarted
index1 = find(mge<=low);
tmg(index1) = 0;for i = 3:(size(m,1)-2)
for j = 3:(size(m,1)-2)% neighbors in a 3*3 region around it have gradient magnitudes
% greater than threshold high ,keep the edgeif (mge(i,j)<high&&mge(i,j)>low)
if ((mge(i-1:i+1,j-1:j+1)>high) == zeros(3))
tmg(i,j)=0;% If non of pixel (x; y)'s neighbors have high gradient
% magnitude but at least one falls between low and high,% search the 5*5 region to see if any of these pixels have
% a magnitude greater than high. If so, keep the edge.elseif ((mge(i-1:i+1,j-1:j+1)>low) ~= [0 0 0;0 1 0;0 0 0])if ((mge(i-2:i+2,j-2:j+2)>high) == zeros(5))
tmg(i,j)=0;end
endend
endend
After calibration, we are set up in the new coordinate system, which is the white paper region. We will detect drum stick position in this region.
To detect the position of drum stick, we used template matching. Since the stick head is black that has a high contrast from its surroundings (paper is white), we build a simple square template filled with black pixels. This template serves as a filter that helps us to find the position of stick head. We did 2D convolution between this template filter and the snapshot from the video. Euclidean distance is used to find the matching part. Below is a how we did template matching step by step:
Template matching code
i=0;
while(i<100)
% trigger fun: start logging nowtrigger(vid)
frame = getsnapshot(vid); % record the current frameflushdata(vid);
delete(vid);Im = double(frame);
Im = Im/max(max(Im)); % normalize the image%%%%%%%%%%%%%%%%%%%%Processing Im%%%%%%%%%%%%%%%%%%
for m = 1:size(Im,1)-N+1for n = 1:size(Im,2)-N+1
diff = sum(sum(Im(m:m+N-1,n:n+N-1)-temp));if diff<best_error
loc_x = m+N/2;loc_y = n+N/2;
endend
endloc_y = loc_y-calib(1);
loc_x = loc_x-calib(2);position(i,1) = loc_x;position(i,2) = loc_y;
%%%%%%%%%%%%%%%%%%%%EndProcessing%%%%%%%%%%%%%%%%%%imshow(Im);
hold onrectangle('Position',[size(Im,1)-loc_x,loc_y,N,N])i=i+1;
end
Notification Switch
Would you like to follow the 'Virtual drum kit' conversation and receive update notifications?