From df8bec3b3e77675db36da361c29e1bcd1825346d Mon Sep 17 00:00:00 2001 From: "DSTO\\pivatom" Date: Tue, 18 Dec 2018 10:58:10 +1030 Subject: [PATCH] Move pixel shift to separate method. Change upper_skin --- GestureRecognition/SimpleHandRecogniser.py | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/GestureRecognition/SimpleHandRecogniser.py b/GestureRecognition/SimpleHandRecogniser.py index 1827d9e..03a966a 100644 --- a/GestureRecognition/SimpleHandRecogniser.py +++ b/GestureRecognition/SimpleHandRecogniser.py @@ -26,27 +26,25 @@ class SimpleHandRecogniser(HandRecogniser): """ Segments the hand from the rest of the image to get a threshold. """ - # Need to shift red pixels so they can be 0-20 rather than 250-~20 - self.img_hsv[:,:,0] = self.img_hsv[:,:,0] + 30 - self.img_hsv[:,:,0] = np.where(self.img_hsv[:,:,0] > 179, self.img_hsv[:,:,0] - 179, self.img_hsv[:,:,0]) - self.img_hsv = cv2.GaussianBlur(self.img_hsv,(5,5),0) lower_skin = (0, 0, 153) - upper_skin = (50, 153, 255) + upper_skin = (45, 153, 255) # Only need mask, as we can just use this to do the hand segmentation. self.mask = cv2.inRange(self.img_hsv, lower_skin, upper_skin) + # Apply another blur to rmeove any small holes/noise + self.mask = self.__denoise(self.mask) ret, self.mask = cv2.threshold(self.mask, 50, 255, cv2.THRESH_BINARY) def __denoise(self, image): """ Applies a 5x5 gaussian blur to remove noise from the image. """ - image = cv2.GaussianBlur(image,(5,5),0) + return cv2.GaussianBlur(image,(5,5),0) - def __calc_circle(self, image, radius_percent = 0.55): + def __calc_circle(self, image, radius_percent = 0.52): """ Calculates the equation of the circle (radius, centre) from a given threshold image, so that the circle is the center of gravity of the @@ -91,15 +89,24 @@ class SimpleHandRecogniser(HandRecogniser): return radius, centre + def __shift_pixels(self, image, shift_radius): + image[:,:,0] = image[:,:,0] + shift_radius + return np.where(image[:,:,0] > 179, image[:,:,0] - 179, image[:,:,0]) + def get_gesture(self): """ Calculates the actual gesture, returning the number of fingers seen in the image. """ - if not self.img: + if self.img is None: return 0 self.img_hsv = cv2.cvtColor(self.img, cv2.COLOR_BGR2HSV) + + # Need to shift red pixels so they can be 0-20 rather than 250-~20 + self.img_hsv = self.__shift_pixels(self.img_hsv, 30) + + self.img_hsv = self.__denoise(self.img_hsv) self.__segment_image() radius, centre = self.__calc_circle(self.mask)