Shape identification is not a trivial thing, so if you want to straight up identify the shapes in an arbitrary position on your form, it's actually going to be fairly challenging. Google is your best bet here as smarter folks than I have written entire documents on how to do it. Here's a place to start...
http://stackoverflow.com/questions/1...ion-algorithms
If at all possible, I think Plater's suggestion might be the way to go. If there was a way for you to ensure the scanned image would be the same way every time, you could start making assumptions as to where things would be.
Off the top of my head, a good way to do this might be to include reference lines on your form, perhaps some lines that denote the outer boundaries. Your program could analyze the first few rows/columns of pixel data to find the bounds, then work under the assumption that everything inside those bounds is at preset offsets from the origin.
This is probably the simplest method but it will fail if your scan is at an angle or the paper is crumpled.
A more complex approach would be to have the check-boxes very clearly differentiated from the background and scan for gaps, then make assumptions as to what the gaps mean. Like, if you had a row of circles, one line of that might look like this..
If this is treated the same was as open/close bracket matching is, you should be able to tell where the circles are and blocks of several filled pixels together would be your filled circle. Of course, you'll need to process the row data all together so you know where the top/bottom edges of the circles are too.
I hope this gives you some ideas!