StereoClickApp is an amazing application. I am trying to find out the 3D coordinates of the corners of a flat chessboard pattern and the distance between the two corners using this app. I believe that the 3D coordinates (of the same landmark point clicked on the two digital images) are in world coordinate system. Every time, the distance between the two corners measured using this app is different.
It would be a great help if you could let me know how this application works (in terms of 3D coordinates)? Thanks in advance.
I assume you have properly calibrated your stereo camera system beforehand (using IVT/examples/CalibrationApp)?
If so, the only problem is that it is hardly possible to accurately click the precise corner positions. This is the only reason for differing results. You can print the clicked coordinates to see that already the clicked 2D coordinates differ. Note that already one pixel difference in 2D, in particular in horizontal direction, can cause quite big displacements in 3D - depending on your stereo setup.
For chessboard corners you should use ImageProcessor::CalculateHarrisInterestPoints to get a list of all corners in the image. Then choose that point from the result list that is the closest to your clicked point. By doing this you will get repeatable results. You can also try to refine the corner positions by calling CornerSubpixel::Refine after you determined the corner point to get subpixel precision, but I would do without first.
The StereoClickApp demo is very sensitive to 3D coordinate measurement. It never gives correct distances. It gives error of atlease 2 cm in calculating distances. I really don't know what to do to reduce the error. Thanks
as I said, that is totally normal when clicking point correspondences manually. The application is not meant to be an application for accurate 3D measurement. It is just a demo application to illustrate the stereo principle and the use of some of IVT's methods.
Again the reason: It is hardly possible to click positions with pixel accuracy. And even pixel accuracy wouldn't be enough; you'll need subpixel accuracy for accurate measurement.
You might want to try the class CStereoMatcher, which does correlation-based correspondence search with subpixel refinement and gives a 3D point as result. Don't forget to undistort the images beforehand using the class CUndistortion.
Also note that the error depends on the hardware setup: the type of lenses (focal length), the baseline and the distance to the object. There are theoretic formulas with which you can estimate the accuracies to be expected.