I develop front ends for Industrial Machine Vision applications.
The very first thing to do, when setting up a machine vision system, is to establish a relation between positions in the real world and pixels in the pictures that come from the cameras.
Every vision library has precise calibration and gauging tools, but I often need a simple tool to analyze the pictures in the early stages of system set up.
What I need is an extension of the standard
System.Windows.Forms.PictureBox, with a ruler, a grid and -quite obviously- an easy way to zoom into details of the parts I am analyzing.
This is a control which I've been using for many years (the very first one was written in VB5). Now I need to port it to WPF, so I started cleaning up the code to make the re-coding easier. It was full of reference to vision libraries, and full of strange properties and functions. This is not a good starting point for the porting process.
- Easy zooming and panning by keyboard (+/- and arrow keys) or mouse (dragging a rectangle, using the wheel or left and right button) .
- Gauging tool: gives you the angle and length of a line dragged on the control.
- Measure unit: you can set the ruler to micron, mm/10, mm, inches, meters.
- Customizable pixel size. Defining the actual size of pixels (the 'real world' DPI) is the first operation to perform, for the rulers to display actual sizes (if you temporarily want to see the cursor position expressed in pixels, just keep the CTRL key pressed).
Using the Code
There is no advanced coding here; it's just a ready to use component which I hope will be useful to someone. There is a Test Application whose code is straightforward. There is also an additional user control that performs all the customization for you, if you don't want to do it programmatically.
Consider that we are talking of a control inherited from the standard
Windows.Forms.PictureBox. You have the standard properties of the base control, with some additions.
If you want to control its properties through your code, here are some examples.
- Changing the measure unit:
LinkedPictureBox.UnitOfMeasure = MeasureSystem.enUniMis.dmm
- Switching between Zoom mode and gauging mode:
LinkedPictureBox.ClickAction = enClickAction.Zoom
- Hiding or showing rulers, scroll bars, and grid:
btViewRulers.Checked = LinkedPictureBox.ShowRulers
btViewScrollBars.Checked = LinkedPictureBox.ShowScrollbars
btViewGrid.Checked = LinkedPictureBox.ShowGrid
tbPixelSizeMic.Text = CStr(LinkedPictureBox.BackgroundImagePixelSize_Mic)