May 8 - THE END.

Well, I have officially made it through the semester! I had my presentation last week, and I think it went really well. My app worked great. Now I just have to prepare for my defense this Tuesday and work through finalizing all of my documentation to turn in on Thursday. For your enjoyment, I included two videos below of my app working. Video credit goes to this really cool app I downloaded called AZ Screen Recorder. The video on the left is simulating a user uploading a picture of their lost dog, and the video on the right is simulating a different user finding the same dog, and therefore finding a match.

April 27 - I think I'm done!

After sitting in the lab the other night struggling with getting in-app notifications to work (better than they currently are), I'm thinking that I will leave that to the next person to pick up the project. I have some well-thought out ideas for how to implement it, but need to devote my attention to preparing my presentation and the documentation. That said, I did tune it up a little so that it no longer crashes if the user has no notifications, but tries to check them, and is a little more specific in which records were matched with the one the user just uploaded. I also added the ability to log out. All this in mind, it's time to step away from the app with the understanding it's not perfect, but pretty darn close, and that I can lay out options for the next person to pick up on and improve. Final steps for the semester: crank out the documentation my app so desperately needs, prep the heck out of this presentation, and get ready for my defense. I'm really excited with all I was able to get done on this app this semester, because let me tell you, 14 weeks ago, I did not think I was going to figure it out. Yet here I stand with a fully-functional app. I couldn't be happier, and I'm thrilled to get to share it with everyone else.

April 24 - I found a dog!!

Not that the dog was ever lost, of course. But my app can now successfully find matches, which is pretty darn exciting! Because of that and some other improvements I've made in the last week or so, my progress bar has shot forward - and is almost completely full! Below I have some screenshots of the cool things I've done. The middle screen shows me finding a match of a dog. So the top picture is the photo the user would have just uploaded, and the bottom pictures would be dogs that are close to the one uploaded, not necessarily just the one match. I'm lacking test data at the moment to demonstrate that, but I plan to get some more in there before presentation week. Also from this screen, I added the capability so that when the user taps on the picture of the dog that is theirs, it removes it and the photo they uploaded from the database. After all, once a dog is found, it doesn't need to be in the lost database anymore! If the user does not see a match on the page, he or she can simply hit the back button and they will be taken back to the main screen. Way back from walkthroughs, I had talked about maybe switching up how I had my Alerts screen set up. Well, I actually decided to get rid of it completely. I cleaned up the main page so it only contains the Photo and Browse pages. The Alerts settings are now hiding in the three dots menu up in the top right corner, and looks like the screen on the left. It felt like more of a settings menu-type thing, so I decided to move it. I also generalized the first notification to refer only to being notified when a dog is found, since I did not end up differentiating between lost and found dogs in my database. And finally, the screen on the right shows my notifications! I wasn't sure I was going to have time at the end to get them working, but they kind of are. I say kind of because it's a very rudimentary logic right now. The notifications do not transfer between app sessions; they only show up if you find a match within your session. I have some ideas on how to fix this, so we'll see if I can get around to implementing it this week. I'm so happy with how far this project has come, but I need to stop myself soon. Presentations are coming up soon after all, and I have other final projects and papers to prepare for. Not to mention all the documentation I need to write up!

April 12 - Algorithm calculations are done...

Last night I was able to pull the x and y coordinates from the boxes the user draws and store them into a GlobalVariable class I have so the data can easily be accessed from all Activities in my app. Then, once the user hits the Submit button on the main Photo page, I am able to make all the calculations I need and create a record in my database! Right now though I'm only hard-coding the record number, so I need to find a way to make that dynamic somehow. I also created a DogAttributes class that holds all the information about a dog's record so the data can easily be pulled back in from the database. Three next steps: getting some test data in the database, starting to make comparisons between records to try and find a match, and working on getting the images from my database to display on my Browse page. I'm getting closer!

April 9 - Caution: Long Post Ahead!

Two things to start - One, notice how far ahead my progress bar jumped! I have made a ton of progress, but have failed to keep my blog up to date with said progress, which leads into... Two, this will be a rather long blog post because of all the progress I've made. I have to catch you up on how things are going after my Spring Break to-do list, because, as always, some things have changed, some things have been added, and some things are being placed on a waitlist for the next student who gets this project. I'm also going to stray from my Gantt chart a little bit, so I'll explain that too.

I'll start by reviewing my to-do list from Spring Break, and go from there.
1. Turns out my hopes were mostly right - after I included the code to allow the user to crop the picture once taking or uploading, my memory issues disappeared! I discovered this cool little function that allows me to scale the bitmap to any size, so I can enlarge it for the purposes of drawing squares around the head, eyes, and nose, and then scale it down again for storage purposes. Very cool stuff.
2. The tiny and sideways picture issue was mostly resolved after cropping the picture. I was still getting a huge black border around the picture, and after going into the layout file, I discovered the width of the "canvas" was being set based on the parent object's width rather than the content's width. Easy fix there.
3. Memory issue gone! At least for now anyway. Right now I'm able to have 6 pictures loaded on the page at once, as shown in the screenshot below. These pictures are all hard-coded in, so it will be interesting to see if the memory issue comes back once I dynamically load the pictures from my database (which I am so close to getting to, and will talk about later).
4. I took four different sets of pictures and threw them into Publisher. After cropping and sizing each, I drew some squares and did some calculations by hand. I don't think my algorithm is precise enough to find matches, but I think it can definitely get me close, which is really all I need. I will be extremely happy if my app can narrow down the possibilities to a few dogs. The big test will be coding the algorithm into my app and actually testing it. I know you're all sitting on the edge of your seat waiting for that day. Don't worry, I'll definitely keep you posted, maybe even throwing a party if it ends up working (well).

Now to the things that have nothing to do with my Spring Break to-do list. I am officially talking to my database! Well, not me exactly, but my app is. I have successfully gotten people to create accounts and log in with those accounts. Super duper exciting. I don't have any log out capabilities yet, but I'm thinking that may be something that's left to the next person. On this same track, I can send a picture to, and pull a picture back from, the database. It's kind of tricky how it works - you have to encode the bitmap as a string, and then decode it when it comes back. Huge shoutout to Google for helping me out with that one. Finally, per a suggestion from Dr. McVey and Dr. Pankratz, I added the ability on the box drawing screen to feather the box after it's been drawn. That is to say that the user can use the arrow buttons I've provided to move the box around one pixel at a time. This could prove to be very important for my algorithm.

I think that's it for what I've accomplished in the last couple weeks. As far as changing up my Gantt chart, here's what I'm thinking. Since the algorithm has taken up a bit more time than I was initially thinking, and I'd really like to devote some serious time to documenting for the next student, I'm going to forego the notification mechanism for now. I have the UI in place for it, but not sure I have the time to make it work well. If I find some time, I'll give it a go, otherwise it shouldn't be difficult for the next person to pick up. Finally, like I just mentioned, I want to add a significant bar for documentation. Having come into a project in the middle of someone else's working on it, I know how frustrating it can be to get caught up to speed, and I want to avoid that as much as possible for the next lucky dog-finder.

Long story short - I'm really excited about how far the project has come, and excited for the few things I want to finish up yet. I also can't believe there are only two weeks until our presentations. Here's to a productive last stretch for me and my classmates!

March 17 - Spring Break To-Do List

Spring Break is just around the corner, so I figured I would meet up with Dr. Pankratz before I headed home to talk through some ideas. After chatting, I decided to change some things I was originally planning on doing, add in some extra things, and leave out some features for a version two. Here's what I hope to work on over the next week or so:

1. Once the user either takes or uploads a photo, make them responsible for cropping it. This could take some of the burden off me in the backend, as well as maybe solve some of the memory issues I'm running into. After a very quick Google search, I may have found some GitHub code I can borrow.
2. Figure out why my pictures are tiny and sideways when being loaded into the app. I'm hoping this may resolve itself after I have the user crop the picture for me, but I have a feeling that I'll have to do some debugging here as well.
3. Work on the memory issue for my app's Browse page. Like I mentioned in my last post, I found a huge article in Android's documentation that should help with that, so I'll do some reading.
4. Make some progress with my algorithm. After talking to Dr. Pankratz, we decided that the unique identifier code may not be the best approach from the viewpoint of, say, trying to pull back all of the white dogs. There would be a lot of parsing necessary if I went that route. Instead, we're thinking it may be better to have separate fields in my database for each of the measurements. I want to get some pictures into Publisher so I can start manually making measurements to see just how different these ratios actually are.

It's a pretty long list, but I'm feeling good about the direction I'm headed. Here's to a hopefully productive Spring Break!

March 9 - I can draw squares!

I'm giving myself a pretty good chunk of my progress bar because I can now take or upload pictures, and draw squares on those pictures! Now, it's not perfect by any means, and I've got a long way to go with it, but it's something! I found some code on GitHub (which I will cite in the comments in my code) and need to adapt it. When I upload a picture, it doesn't fill the entire canvas provided, which I think is throwing off the point where the initial touch to draw the square is. Also, when I take a picture, for some reason it always makes it super tiny and rotates it. So there is some work to be done there. I've also found a better Image Grid display tutorial than the one I mentioned a few posts ago, but I'm currently getting a weird memory error, so I've got some investigating to do there. I'm almost positive that it will be fixed when I figure out how to appropriately crop the picture, but I found a page from the Android documentation I can refer to as well. I've also done some thinking on my algorithm to determine the unique identifier code for each picture, but I'll wait until my next blog post to detail that.

March 6 - Not Too Much to Report

It seems that all of my classes decided they wanted large-ish projects due in the same week, so I have not made much progress at all. However, I did find some time to do research on how users might be able to draw shapes with a touch event. I found some code that I briefly tried to implement in its own separate project, but it didn't really work. I'm not giving up on it yet though because I haven't given it much effort, and I want to try to add it into a copy of my existing project to see if that might make it easier. It looks like all I need to do is add a custom DrawingView and add some additional touch events. I'm hoping it won't be too intense, because I'd really like to get it working before walkthroughs this week. If I do get it working before Thursday, you can expect a very excited blog post from me!

February 28 - A Near-Complete Skeleton

The progress bar is slowly but surely moving along. This week I mostly finished the skeleton of my app. You can check out some more screenshots below. The only thing left to get up is my Browse tab, which I plan on using an external library from GitHub for. It's a really nice way of laying out pictures, rather than trying to create a custom ListView (you can check it out here). Other than that, my skeleton is pretty much complete! Next steps, according to my Gantt chart, are getting users to be able to draw and resize rectangles on the dog pictures they upload to help with my calculations. I have yet to actually figure out how I will use those calculations in my unique identifier code idea, but that's on the docket. Oh yes, and something else I played with this week was my database - I can write sample strings to my database now! This is the first step in getting users accounts to stick as well as storing the pictures (and their codes, once I get there). Overall, I'm really excited with how things are moving along!

February 21 - Slow and Steady

I'm chugging along. This week I started coding my app, and I'm happy to report that I have a skeleton! I have a login screen and my main app screen with the 3 tabs coded (not that you can do anything with them yet). I have a couple screenshots below so you can see what they look like. After going back to review my Gantt chart I found that I am on schedule, and if I have some extra time this week I might start investigating the database API a little early so I can get an idea of how I will keep track of my users' accounts. I also want to start thinking about how I will determine the unique identifier code for each picture. Until next weekend!

February 16 - App Mockups

Today in class I got some feedback on these mockups so I've got some changes to make, but if you have any other feedback for me, feel free to shoot me an email!

February 13 - Time to Pivot

My progress bar has crept forward, thanks to a meeting with Dr. Pankratz this week. We spent some time talking about how I might identify a dog's face. This is where the pivoting comes in. We've decided that it might be better to forego the OpenCV library and instead utilize some user input. After users upload or take a photo, the app will ask them to draw some shapes on the picture - one around the entire face, each of the eyes, and the mouth. This way I should be able to calculate some measurement ratios. Along with those ratios, I also plan to ask the user some questions about the dog, such as color, size, ear type, etc. During class this week I plan to get some input from the others about what features might be useful. Using both the responses to those questions and the numbers provided by the picture, I would like to create some kind of unique identifier code that holds the important characteristics of that picture and store them together in a database. I'm not sure how exactly I will decide that code, but I'll keep you posted. Like I mentioned in my last post, I've also been working on some mockups for how I'd like my app to look. I'm finishing them up this weekend, so I'll post the images on my blog here, hopefully by the end of tomorrow. I want to bring the mockups in to class on Tuesday as well to get some feedback from everyone. I'm feeling much less overwhelmed after meeting with Dr. Pankratz, so I'm eager to get going - the trouble is finding the time!

February 7 - Not enough hours in the day

As you can see, the progress bar hasn't moved since my last entry. After a week of making very little progress on my project, I've decided that time management is going to be key for me this semester. My other three classes also have a pretty demanding workload, so it's going to be very important for me to budget out my time. That said, I'm going to get my Gantt chart up this week so I have some concrete milestones to work against. Hopefully that will help keep me on track. I spent the last week trying to run the Image Processing sample app from OpenCV, but have yet to get it to successfully run. It turns out that OpenCV uses something called NDK, which essentially means that it uses embedded C++ code within the Java code that is required for Android mobile app development. I've decided that it might be worth stepping away from error after error I keep getting while trying to run the sample app and instead learn more about this NDK thing. I'm also going to split up my focus a bit - I have all semester to get the facial recognition to work, so I want to start mocking up some sample screens, figure out the general flow of how I want my app to work, and get some of that coded up. Goal for next week: step away from the errors for a while and start thinking about the app itself.

January 29 - Woof Woof!

I have officially received my Senior Capstone project, and right now, I'm a little overwhelmed. The idea of using facial recognition on dogs is a little intimidating. I didn't have any idea where to start, so I went straight to Google. Researching facial recognition has become my first priority since I think this will be the most time-consuming part of the project. OpenCV seems to be a good place to begin. I have a little bit of experience coding Android mobile apps, so I think that's the platform I'm going to go with. I downloaded the SDK for OpenCV and Android, so my next step is trying to run a couple of the sample apps that were included. I've also started to collect some pictures of dogs from my friends - not that I'll have anything to test them with yet! My large-scale final product is exactly that - large - so I've also started to try and break it down into manageable smaller tasks to help ease the overwhelmed feeling. After only having 3 days to think and plan I'm already starting to feel better. I'm excited to see where this semester takes me!

A quick note: at the beginning of this blog entry you see a blue bar. This will serve as a visual representation of my self-evaluated progress throughout the semester. Right now it's not very full, but hopefully you'll see it fill in the coming weeks!