Commit Graph

723 Commits

Author SHA1 Message Date
Kwabena W. Agyeman
98f4dde21f Add new morph function.
The morph function lets you convolve the image with a kernel. It's
decently fast right now. But, in the future we'll have to optimize it by
a lot (unrolling loops, using SIMD instructions, etc.).

Anyway, along with morph I added an edge detection test script showing
how you can use a high pass filter on an image to get all the edges in
it. This is not as good as canny edge dection... but, it's about the
same and fast enough.

We'll need a Hough Transform system in the future to make edge dection
useful. Not sure how that will be implemented... so, that's going to be
far away for now.
2016-02-29 18:04:45 -05:00
Kwabena W. Agyeman
fb8b357c24 Dilate and errode working.
The old code did not actually implement the errode anhd dilate kernels
correctly. However, it migh have been a little faster because it avoided
the boundary problem.

In the future we can optimize all the kernel code to have different loops
for doing the edges of image versus the center. But, for now, this is
good enough. QVGA color tracking with kernels will be slow, but, the
speed can be improved with QQVGA resolution. Using a 3x3 kernel is
plenty fast. Larger ones are slower.

I also added the ability for you to set the threshold for erode and
dialte. This lets you make the kenrel a little bit smarter so that it
won't errode or dilate a pixel unless the threshold is met. Meaning,
you'll be able to use erode to erode an image down to 1 pixel wide
lines.
2016-02-28 16:27:49 -05:00
iabdalkader
d4e1e3d323 Alloc FatFS LFN buffer on stack.
* Saves 512 bytes
2016-02-28 21:54:30 +02:00
iabdalkader
2e7ded5dd4 Add GIF module 2016-02-28 21:34:47 +02:00
iabdalkader
963dd69ca0 Fix typo. 2016-02-28 08:06:32 +02:00
iabdalkader
afa1686940 USE OMV_XCLK_FREQUENCY from OMV board config file. 2016-02-28 04:30:37 +02:00
iabdalkader
8b3b7e6ece Fix skin filter.
* Remove Y from GS threshold.
* Not really fixed, just looks slightly better.
2016-02-28 04:10:56 +02:00
iabdalkader
7e1a4169a7 Add match_descriptor function.
* A single function to match LBP/FREAK descriptors.
2016-02-28 03:39:13 +02:00
iabdalkader
154cb5be69 Change descriptor functions to accept file pointer. 2016-02-28 03:22:07 +02:00
iabdalkader
acafef5207 Revert HaarCascade.
* HaarCascade doesn't really fit into generic descriptor functions.
2016-02-28 02:37:35 +02:00
iabdalkader
67acf7188c Use one load/save function for all descriptors. 2016-02-28 01:38:24 +02:00
Kwabena W. Agyeman
4ed49082a1 Background Subtraction is working!!!
Woot, all the effort to make it so you can manipulate the image buffer
with an image off disk works!

Try out the motion_detection script.
2016-02-27 11:58:37 -05:00
Kwabena W. Agyeman
00ee215e89 Add line op function.
All the work previously has been more or less leading up to supporting
this function. The line op function will open a file and execute a
function pointer on each line of the file opened to modify the frame
buffer.
2016-02-27 09:59:54 -05:00
Kwabena W. Agyeman
1121a6f7df Fixed save image.
It now figures out the file type from the file extension. If no file
extension is given it just saves the file as BMP if its not a JPEG image
or JPEG if it's a JPEG image. If you specify an extension and the file is
not of that type then it will give you an error.

The new test_save.py should run until you reach the JPEG image part
where it quits due to lack of JPEG support natively on OV7725 boards.
Maybe JPEG mode should be supoorted by just compressing pictures?
2016-02-26 22:00:04 -05:00
iabdalkader
2b27d1542f Add save LBP descriptor. 2016-02-26 23:12:15 +02:00
Kwabena W. Agyeman
ac3d1e4373 Add BMP/PNM/JPEG image file loading and saving.
There's not a lot of actual functionality changes from the last commit.
However, switching the basic wrapper library to just long_jump on
failure and moving all the state info to structs required changes to all
the base functions in the last commit. The rest of the changes are to
link in the new functionality and to get the code to compile (usbdbg.c
edits).

Next I'll work on a function which abstracts the problem of opening an
image up and executing a line by line function op on it. I already
worked the code out for that. But, it's not in this commit to keep
things streamlined.
2016-02-25 22:26:56 -05:00
iabdalkader
6d1044ffcf Up the max size of integral images to QVGA.
* With the new integral moving window we can support face detection,
  keypoints and template matching on QVGA frames. However, it was only
  implemented and tested for face detection.

* Increasing the max integral frame now for easier testing.
2016-02-26 03:27:24 +02:00
iabdalkader
c43906eb3d Fix FREAK's mean_intensity function.
* Using imlib_integral_lookup for lookups.
* Rounding errors caused the patch not be rectangular.
2016-02-26 01:47:22 +02:00
iabdalkader
074cf9d5e4 Add pointer to matching keypoint to kp_t struct.
* This way we don't need to allocate the array of matching keypoints
and risk running out of memory due to fragmentation. So all or nothing.
2016-02-26 01:44:23 +02:00
iabdalkader
1b27383c9d Allocate kpts until GC is almost out of memory
* Keep allocating keypoints until GC is out of memory.
2016-02-26 00:50:46 +02:00
iabdalkader
5ff5419bf1 Return empty list if no blobs were found.
* Fixes #81
2016-02-26 00:47:31 +02:00
iabdalkader
3e4c2c2f3b Fix keypoint bug.
* Set keypoint descriptor to zero, bug was introduced when switching to arrays.
2016-02-26 00:26:37 +02:00
iabdalkader
b15c0c6bc0 Fix formatting. 2016-02-26 00:26:20 +02:00
iabdalkader
5c6056f875 Add file format strings 2016-02-25 11:52:10 +02:00
Kwabena W. Agyeman
d8ac8f9408 Fix swap bug.
The code clearly did not swap mins and maxes.
2016-02-24 19:07:57 -05:00
iabdalkader
f34a7e30d7 Use fb_alloc to allocate corners.
* Leaves more heap memory for keypoints.
2016-02-24 06:30:14 +02:00
Kwabena W. Agyeman
4df0b5044b Add top level file open function.
Fimrware will now automatically detect the appropriate file type and read
in that file type correctly.

Working on tying on of this stuff togheter next. It's getting a little
bit too complicated to deal with error cases. Need to add error message
function layer.
2016-02-23 21:26:43 -05:00
iabdalkader
c3936f4322 Fix FAST/FREAK ROI. 2016-02-24 00:38:48 +02:00
iabdalkader
4d7db778fb Remove angle from keypoint.
* Not really used right now and saves 4 bytes per keypoint.
2016-02-23 20:43:33 +02:00
iabdalkader
3a747ef952 Use arrays in FAST/FREAK keypoints.
* Using arrays for FAST/FREAK keypoints, this saves some memory
allocated for intermediate data.
2016-02-23 18:19:49 +02:00
iabdalkader
7a22cb3e5c Extract keypoints in one step.
* Make find_keypoints extract FAST keypoints.
2016-02-23 00:55:54 +02:00
iabdalkader
93d3885a3c Set keypoints threshold range between 0 and 100. 2016-02-22 20:31:24 +02:00
iabdalkader
9d02e2a42a Make match_lbp accept roi and extract second LBP. 2016-02-22 19:41:16 +02:00
iabdalkader
473b8025bf Fix assertion in find_features. 2016-02-22 19:39:26 +02:00
iabdalkader
015181588a Fix assertion in find_features. 2016-02-22 19:35:11 +02:00
iabdalkader
ddcb170af0 Cleanup py_image.c
* Code cleanups in py_image.c
2016-02-22 19:17:14 +02:00
iabdalkader
124a31772c Rename helper functions. 2016-02-22 18:47:35 +02:00
iabdalkader
5860695f5d Move helper functions to new files. 2016-02-22 18:41:50 +02:00
iabdalkader
0f48c12a89 Replace all mp_map_lookup()s with helper functions. 2016-02-22 18:35:00 +02:00
iabdalkader
4bcdb251a3 Update MP branch 2016-02-22 18:02:59 +02:00
iabdalkader
93dc73c7f2 Fix arg to get_rectangle_kw. 2016-02-22 18:00:20 +02:00
iabdalkader
4c63721efa Use default roi when calling save_image 2016-02-22 17:55:26 +02:00
Kwabena W. Agyeman
901716b878 Made grayscale read/writing fast.
RGB565 reading and writing is going to be slow. But, grayscale is going
to be going as fast as the system can go.

If Omnivision has just reversed the byte order of data sent to the
camera we wouldn't have this problem for RGB565.
2016-02-21 21:24:57 -05:00
iabdalkader
4e5b200bdf Make keypoints_match return the % of matching kpts.
* Change keypoints_match to return the percentage of matching keypoints.
2016-02-22 03:31:15 +02:00
Kwabena W. Agyeman
ccd6078c04 Add BMP and P2/3/5/6 file format support.
Added BMP file format reading and writing support code and modified the
ppm code to match. Upper level glue code has been left intact to be
altered in future commits.

Tested save() and ppm writing functionality still works. More
comprehensive tests coming soon.

... Kinda concerend that standard image file formats might not cut it for
the speed we'd like to have when using image files in function calls. I
think only grayscale is going to be fast. All other formats require a
lot of prep work.

I think I may modify some of this low level stuff in the future to
autodetect if an entire grayscale image can be read in or written out
in one go to speed that stuff up.
2016-02-21 17:24:32 -05:00
iabdalkader
43dc87d43e Fix HQVGA resolution. 2016-02-21 23:05:07 +02:00
iabdalkader
032a6e3e4d Make Haar detector work on ROIs. 2016-02-21 23:01:34 +02:00
iabdalkader
1d4b95353a Fix Iris bounding box. 2016-02-21 22:39:14 +02:00
iabdalkader
50e53c91bc Change Iris detector to work on a single region.
* This allows the detector to work on ROIs detected by the eye Haar
  cascade, which improves the accuracy and speed of the detection.
2016-02-21 20:38:01 +02:00
iabdalkader
e18058f27c Update MP branch.
* Add new qstrs.
2016-02-21 03:46:17 +02:00
Kwabena W. Agyeman
c3cfb117d0 Add frame differencing functions.
The negate function gives you the ability to negate an image before
running difference on it. The difference function will subtract two images
from each other and return the abs() of the result.

I believe it would have been optimal to work on the RGB565 image in the
LAB color space. However, since we don't have an inverse LAB lut this is
not possible. If we could replace LAB with YUV then that would free up
space to have an inverse YUV table (YUV->RGB).
2016-02-20 20:29:19 -05:00
Kwabena W. Agyeman
140ceb3b77 Fixed bug in centroid and added tests.
Stuff works. Yay! Moving on to other things now.
2016-02-20 16:04:59 -05:00
Kwabena W. Agyeman
88d9c02a1b Draw keypoints now accepts lists.
Made draw keypoints accept lists of (x, y, angle) tuples. I did this so
it could be used to show object rotation easily.
2016-02-20 16:04:59 -05:00
iabdalkader
767b0d99b9 Update MicroPython branch 2016-02-20 20:12:02 +02:00
Kwabena W. Agyeman
0606f5be44 Added binary image functions.
Pixels, centroid, orientation, along with the basic binary tool kit
functions like and/or/xor.
2016-02-20 11:46:26 -05:00
iabdalkader
db5464948b Use fb_alloc in dilate, erode and median. 2016-02-20 17:48:42 +02:00
iabdalkader
f3e85e1dbb Add fb_free_all.
* Free all blocks allocated on fb ram
2016-02-20 17:41:21 +02:00
iabdalkader
84ff228384 Fix RGB skin filter 2016-02-20 06:16:22 +02:00
Ibrahim Abd Elkader
e72e55802c Merge pull request #73 from kwagyeman/master
Fix set pixel.
2016-02-20 06:03:48 +02:00
Kwabena W. Agyeman
b01adfee26 Fixed up drawing code and scripts along with drawing code.
Set pixel works too now.
2016-02-19 22:55:50 -05:00
iabdalkader
015f924096 Fix BW filter to handle RGB. 2016-02-20 04:22:03 +02:00
Kwabena W. Agyeman
a035aae493 Fixed set pixel. 2016-02-19 21:05:02 -05:00
iabdalkader
a4ea3e0e20 Add filter functions
* Filter functions bypass the default line processing in sensor.c, and pre-process lines.
* Processing is done on the fly, i.e. filters are called from after each line is received.
2016-02-20 03:58:40 +02:00
iabdalkader
a40101e3e0 Fix indent. 2016-02-20 01:26:18 +02:00
iabdalkader
8d47b7b9b2 Add helper functions to lookup color and int. 2016-02-20 01:24:29 +02:00
iabdalkader
e31e504f64 Update MP branch 2016-02-19 17:02:45 +02:00
Kwabena W. Agyeman
bcd5151412 New drawing functions.
All the drawing functions have been updated to handle automatic clipping
when drawing offscren and work with both grayscale and RGB565.
Additionally, all functions now accept color arguments.

I've also updated the example scripts with the new functions and tested
them out to make sure they work.

Additionally, I wrote a test suite for the drawing functions to make
sure they work.
2016-02-18 22:40:12 -05:00
iabdalkader
04a2e89fd5 Optimize JPEG stack usage 2016-02-18 17:55:45 +02:00
Kwabena W. Agyeman
f9ae24f3a0 Reverted commands back to old argument format. 2016-02-17 23:50:08 -05:00
Kwabena W. Agyeman
dd6a322646 Added basic image querying functions.
Now you can get the width/height/format along with size. Additionally, I
fixed up get and set pixel.
2016-02-17 23:04:23 -05:00
iabdalkader
5aa3555a36 Add enable/disable JPEG to USB commands. 2016-02-18 04:12:53 +02:00
iabdalkader
da15b6a915 * Allow fb compression to be enabled/disabled.
* This allows reading RGB images on PC if needed.
2016-02-18 04:01:41 +02:00
iabdalkader
8fd89db5fe Add Hardware/Software JPEG flags to sensor flags.
* Not used right now.
2016-02-18 03:26:41 +02:00
iabdalkader
31679cab9a Allow Haar detector to accept ROIs. 2016-02-17 22:36:57 +02:00
iabdalkader
61f98e6c21 Cleanup old integral image code. 2016-02-17 20:34:21 +02:00
iabdalkader
dc86780578 Use FB_PIXELS() to get a pointer to fb pixels. 2016-02-17 20:32:50 +02:00
iabdalkader
6460fefa15 Fix old integral image lookup 2016-02-17 20:32:33 +02:00
iabdalkader
d658608061 Fix FB_PIXELS() macro.
* If bpp > 2 (means JPEG image) return pixels + bpp (bpp stores image size in JPEG mode)
* If bpp <= 2 (means GS or RGB image) return pixels + w * h * bpp.
2016-02-17 20:27:58 +02:00
iabdalkader
d2ac2c63a8 Use fb_alloc to alloc/free integral images. 2016-02-17 20:06:31 +02:00
iabdalkader
c2e6d96c27 Remove unused xalloc include 2016-02-17 20:01:05 +02:00
iabdalkader
d3d7e5dc39 Use typdef's for sensor enum and structs. 2016-02-17 19:46:45 +02:00
iabdalkader
d639df0bfe Cleanup sensor.h comments. 2016-02-17 19:08:56 +02:00
iabdalkader
c809ec1b53 Add comment about cropping. 2016-02-17 18:49:51 +02:00
iabdalkader
33e552b276 Add DMA2D to sthal's Makefile 2016-02-17 18:48:20 +02:00
iabdalkader
5fdaf08cac Increase heap size by 256 bytes. 2016-02-17 18:47:33 +02:00
iabdalkader
c1bf4ad33d Add one pass standard deviation function. 2016-02-17 18:46:46 +02:00
iabdalkader
027641e51e Improved Haar detector.
* Use a scanning factor proportional to the current scale.
* Use the new integral moving window to allow two integral images
  (sum and sum squared) for fast mean, variance and standard deviation.
* Higher FPS and more accurate detection.
2016-02-17 18:43:47 +02:00
iabdalkader
b7b4153367 Add integral moving window.
* A new integral image implementation that uses a moving window.
* Integral image is computed in steps, each shift computes n new lines.
* This only requires (image_width * (feature_height+1) * 4) bytes.
* Allows Haar detector to run on QVGA, and allows a second squared
  integral image for standard deviation calculations.
2016-02-17 18:43:09 +02:00
iabdalkader
c043ebc233 Update qstrs 2016-02-17 18:16:15 +02:00
iabdalkader
0904f0bb6b Fix FB_PIXELS()
* Return fb->pixels+fb->bpp when JPEG is enabled.
2016-02-17 05:28:28 +02:00
iabdalkader
db667c061f Rename fb_stack to fb_alloc and call init0 in main 2016-02-17 05:24:17 +02:00
Ibrahim Abd Elkader
cfa9b6e440 Merge pull request #67 from kwagyeman/master
Add framebuffer alloc functions.
2016-02-17 05:07:34 +02:00
Kwabena W. Agyeman
024b16d475 Added some helper stuff.
The alloc functions allow you to use the framebuffer as a storage space.
It's very simple but effective. You can alloc which puts some memory on a
stack... and then when you're done you can free which pops the stack.
Pops (frees) must be done in reverse order of pushes (allocs).

In general, functions should call the init code before using the stack.
It could be in a bad state.

Also, I added some wrappers for file system functions to make that stuff
easier. This will be used in the future.
2016-02-16 21:31:35 -05:00
Ibrahim Abd Elkader
983f1783e3 Merge pull request #66 from kwagyeman/master
Update lookup tables and scripts.
2016-02-17 03:57:51 +02:00
Kwabena W. Agyeman
88f37014f1 Finished updating tables.
With new RGB565<->RGB888 scaling. This included redoing the LAB/YUV/XYZ
tables. I translated the table gen code to python also and added
comments as to where the math came from.

And yes, I tested and compared the tables to make sure they weren't
borken. The tables are slightly different... but, if look at the
progression of values loosely you'll see the triplets are very close to
each other when doing a compare. This is to be expected given I used a
slightly better scaling algo.
2016-02-16 19:37:19 -05:00
Ibrahim Abd Elkader
e3b76ebabb Merge pull request #65 from kwagyeman/master
* Move image macros to imlib.c.
* Add prefix to image macros.
* Add RGB LUT, and gen_rgb2rgb.py  script.
2016-02-16 17:24:48 +02:00
Kwabena W. Agyeman
6699ea4d0e Added RGB LUT.
And modified the rainbow table so that the RGB888 to RGB565 translation
is done using a rounding technique versus hard floor. This is also used
for the RGB565<->RGB888 LUTs.

Additionally, I added a bunch of stuff to the image library to make
working with images easier. I will using these helpers in the future.

Finally, I cleaned up trailing space in the font stuff (pet peeve).
2016-02-15 22:12:25 -05:00
Ibrahim Abd Elkader
42db630564 Merge pull request #64 from kwagyeman/master
Fixed up point and rect.
2016-02-15 04:58:46 +02:00
Kwabena W. Agyeman
67b9a815b3 Switch int to int16_t. 2016-02-14 21:54:55 -05:00
Kwabena W. Agyeman
0384d43304 Fixed up point and rect.
Point didn't need many changes. However, for rect I made the merge
function alot better so it won't alloc while merging, just free.
Additionally, I added a function to get the intersecting rectangle of an
image. This will be used for all functions that accept a subimg
argument. This function allows the user to basically pass any wild and
crazy rect they want and the function will find the intersecting area (if
it exists) and return just that to operate on. This is good for "do what
I mean" functionality versus "do what I say".
2016-02-14 21:13:55 -05:00