MouseTrap Dev Help/mousetrap internals
From Foss2Serve
Revision as of 23:00, 19 March 2013 by Heidi.ellis (Talk | contribs)
Contents |
The MouseTrap Program
Here is a complete dissection of the hierarchy done by gnome: http://gnome-mousetrap.sourcearchive.com/documentation/0.3plus-psvn17-2ubuntu1/main.html
Definitions
- Haar wavelet
- First proposed by Alfred Haar, the Haar wavelet is a series of square-shaped functions that when shown together form a basis otherwise known as a wavelet family and expressed in terms of an orthonormal function basis. For more information, see: [[1]]
- Haar-like features
- Uses adjacent rectangular regions in a specified detection window, sums up the pixel intensities and calculates the difference between those sums. They are called Haar-like features because they are computed using similar coeffients in the Haar wavelet transforms. These regions can then be concatenated with boosted classifiers into a classifier cascade to cross reference these regions with other positive samples to form a model for object detection. For more information, see [[2]] [[3]]
- Boosted Classifiers
- The result of increasing the accuracy of a classifier cascade through the means of positive object recognition of scaled images.
- Boosting
- Attempts to produce new classifiers that are better able to predict examples for which the current ensemble's performance is poor. [[4]]
- Classifier Cascade
- Proposed by Paul Viola and refined by Rainer Lienhart, a classifier cascade
- ROI (Region of Interest)
- This is usually a subset of the original frame represented as a rectangle. It is most often compared to a classifier cascade to determine a positive match.
- Ocvfw (OpenCV FrameWork)
- A MouseTrap in house framework that manages OpenCV methods and includes functions to initiate the camera and detect further Haar-like features.
- Optical flow
- Detecting the pattern of motion of moving objects. [[5]] [[6]]
- Lucas-Kanade method
- Differential method to estimate optical flow, it combines several nearby pixels to resolve the ambiguity of the optical flow equation [[7]].
- Singleton
- Restricts the instantiation of a class to one object so coordination over program actions can be achieved.
MouseTrap Structure
This section provides an overview of the structure of the MouseTrap project. Below is a figure showing the directory structure of the MouseTrap code:
MouseTrap is split into two main pieces:
- app which contains the actual MouseTrap application
- ocvfw which contains the code related to cv and is responsible for controlling the actual graphics
The 'app directcory contains the following three areas of functionality:
- 'addons - these are classes that
- cpu - checks the CPU usage (not sure why)
- handler
The app directory also contains the following four files:
- commons - contains python functions common across MouseTrap. Currently there is only one.
- environment - contains information about mousetrap needed by the system including the process id, version, name of the data directory, etc.
- debug - contains functions to support debugging of mousetrap including creating a log and writting to the log
- main
OpenCV Framework (ocvfw)
- This is the wrapper around OpenCV
- View diagram here: [[8]]
ocvfw/ _ocv.py
- Contains three classes:
OcvfwBase: direct copy of backends/ OcvfwBase OcvfwPython: direct copy of backends/ OcvfwPython OcvfwCtypes: direct copy of backends/ OcvfwCtypes
ocvfw/ idm
- Detects features based on an xml file
ctypesopencv
- This is used instead of the python bindings for OpenCV
pocv.py
- Returns an instance of the idm
ocvfw/ haars
- Used thousands of samples to concatenate an xml file to predict features
dev/ camera
- checks for gtk
- loads the camera backend
- sets Camera as a singleton with backend as the base
- Class Capture
- first gets a region of interest and then matches it against a haar classifier
- Sets all variables associated with video capture
- Methods:
set_async(fps, async): sets the frames per second and whether the image should have asynchronous querying. If it is true, then it will set a gobject timeout of the specified frames per second sync(): Synchronizes the Capture image with the Camera image set_camera(key, value): sets the Camera object with key and value specified image(new_img): sets the self.__image variable to specified value resize(width, height, copy): manipulates the self.__image variable and resizes it using cv.Resize() and width and height given, will not replace the self.__image if copy is True. to_gtk_buff(): Converts image to gtkImage and returns it points(): returns self.__graphics["point"], a list with rectangles that have been added? rectangles(): returns self.__graphics["rect"], a list with rectangles that have been added show_rectangles(rectangles): draws the rectangles onto the self.__image original(): returns the Capture object with the self.__image_orig image, setting the Capture to the original image rect(*args): uses the args (a rectangle) to get a sub-part of the self.__image using cv.GetSubRect() flip(flip): flip is a string that can contain 'hor' 'ver' or 'both' to use cv.Flip() to manipulate the self.__image. Returns self.__image color(new_color, channel, copy): if new_color is true it will set the image to the new channel provided. If copy is set, it will only manipulate a new image and keep the existing image as is. change(size, color, flip): will set self.__color_set to the new color value and set self.__flip to the new flip value. Does not currently support the change in image size. add(graphic): has checks to see if the capture is locked or if the graphic exists already. Otherwise it will add the graphic passed to it to the image using set_lkpoint() remove(label): removes a graphic object from self.__graphics[] by its label. get_area(haar_csd, roi, orig): uses the haartraining file (haar_csd) to it will use get_haar_points() or get_haar_roi_points() depending whether roi is set. It can also get the area within an area using the roi and setting the origin point. message(message): does nothing, just pass lock(): sets the self.__lock to true, which is used in add() and remove() unlock(): sets self.__lock to false is_locked(): returns self.__lock
- Classes
Graphic() init(): x and y stored in a list coords[x, y] size: list [width, height] type: could be a point label: string color: rgb color or tuple follow: used for optical flow parent: what is the parent class is_point(): checks if type is true
Point(): contains a graphic and additional variables and methods init(): graphic(**args) __ocv: opencv attribute last: opencv attribute diff: difference between two points abs_diff: difference between original and current rel_diff: difference between last and current orig: an opencv Point objec set_opencv(opencv): updates the current attributes, updates the points in abs_diff and rel_diff and sets self.__ocv to opencv given opencv(): returns the graphic object with the opencv attributes (__ocv)
backend
- link to image on how the backend distributes variables ["]
- Contains three classes:
backend/ OcvfwBase
- sets image variables
- Methods:
set(key, value): sets the key (image variables) to the value specified lk_swap(set): switches the boolean of the Lucas-Kanade points, if true, it will append current to last new_image(size, num, ch): Will CreatImage(size, depth, channel) using a Size(width, height), depth and channel set_camera_idx(idx): sets the global var self.idx to specified idx number wait_key(num): uses cv WaitKey() and inputs number specified start_camera(params): grabs the video capture and sets it as a global variable query_image: grabs the first frame and creates self.img, the pyramids and grey images for optical flow. Uses wait_key(). returns true set_lkpoint(point): uses cv.Point, sets the self.img_lkpoints image, uses dev/ camera.set_opencv() to manipulate the graphic object (made my Mousetrap), sets the ["current"] using FindCornerSubPix() and if ["last"] exists, it appends current, appends point to ["points"] clean_lkpoints(): sets self.img_lkpoints current, last and points to empty show_lkpoints(): calculates the optical flow and assigns it to the ["current"] lkpoints if it resolves. Recursively goes through ["points"] and draws them, then sets ["current"] back to points swap_lkpoints(): only after the new points were shown, swap prev with original and current with last
backend/ OcvfwPython
- inherits from OcvfwBase
- imports global and local variables from Commons.hg (highgui related variables) and Commons.cv(Opencv) variables
- has the ability to get_motion_points but is not used
- has the ability to add_message to the image shown but is not used
- Methods:
get_haar_roi_points: finds regions of interest within the entire frame image and returns the matches against the classifier cascade using the HaarDetectObjects() OpenCV function. get_haar_points: resizes the image by 1.5
backend/ OcvfwCtypes
- imports global and local variables from Commons.hg (highgui), Commons.cv(which is a CV common lib), and OcvfwBase
Files affected by OpenCV 2.4.3 upgrade
- main.py
- ocvfw
- _ocv.py
- ocvfw/ idm
- eyes.py
- finger.py
- forehead.py
- color.py
- commons.py
- ocvfw/ dev
- camera.py
- ocvfw/ backends
- OcvfwBase.py
- OcfwCtypes.py
- OcvfwPython.py