Home | Course Index | Next >> | PDF Version of this Page |
![]() |
Course CVCis: Computer Vision with C#
|
![]() Let me know what you think |
![]() ![]() ![]() ![]() ![]() |
1) Main Menu after starting VC# 2010 Express: File → New Project... → Visual Studio installed templates: Windows Forms Application
Name: cells1 → Location: C:\temp → Create directory for solution: switch off → OK
Form1.cs[Design] appears.
2) Delete two superfluous files: Form1.Designer.cs and Program.cs.
You see the file names inside the Solution Explorer - cells1-Window: Click the plus sign in front of cells1 and the plus sign in front of Form1.cs.
Right-click the branch Program.cs. A context menu opens. Click Delete. A message box appears: 'Program.cs' will be deleted permanently. Quit with OK.
Right-click the branch Form1.Designer.cs and delete this file too.
3) Right-click the gray window Form1. A context menu opens. Click View Code.
You see the pre-programmed code: Form1.cs. Delete the code completely.
Important: Switch off the automatic format- and indent- mechanism of the code editor:
1. Main menu of Microsoft Visual Studio: Click "Tools".
2. A drop-down-menu appears. Click "Options...".
3. A dialog box appears. Click "Text Editor", then "C#".
4. A sub-tree appears "General, Tabs, Formatting". Click "Tabs".
5. Set Indenting to "None", Tab size and Indent size to "1" and switch on the option "Insert spaces".
6. In the sub-tree "General, Tabs, Formatting". Click "Formatting".
7. Switch on: "Leave open braces on same line as construct" but switch off all other check boxes.
8. Leave the dialog box with button "OK".
![]() ![]() |
Write the following code into the empty Form1.cs:
using System; using System.Drawing; using System.Windows.Forms; public class Form1 : Form { [STAThread] static void Main() { Application.Run( new Form1() ); } const Int32 xSize = 11; const Int32 ySize = 12; Byte[,] i0 = new Byte[ySize ,xSize ]; Byte[,] c2 = new Byte[ySize ,xSize ]; Byte[,] c0 = new Byte[ySize+1,xSize+1]; Byte[,] c1v = new Byte[ySize ,xSize+1]; Byte[,] c1h = new Byte[ySize+1,xSize ]; Boolean C0, C1V, C1H, C2; Brush[] brush = new Brush[10]; Int32 i, x, y, dx, dy; Byte threshold = 1; Button[] button = new Button[ySize]; public Form1() { BackColor = Color.White; Text = "C2_C1V_C1H_C0"; SetStyle( ControlStyles.ResizeRedraw, true ); Width = 800; Height = 600; for ( i=0; i < 10; i++ ) brush[i] = new SolidBrush( Color.FromArgb( i*25, i*25, i*25 ) ); for ( y=0; y < ySize; y++ ) { button[y] = new Button(); Controls.Add( button[y] ); button[y].BackColor = Color.Gray; button[y].Text = "nothing"; button[y].Name = y.ToString(); button[y].Click += new EventHandler( do_it ); } button[0].Name = button[0].Text = "Homunculus"; button[1].Name = "Threshold"; button[2].Name = button[2].Text = "Noise"; button[3].Name = button[3].Text = "Clear"; button[4].Name = button[4].Text = "C0-Cells"; button[5].Name = button[5].Text = "C1v-Cells"; button[6].Name = button[6].Text = "C1h-Cells"; button[7].Name = button[7].Text = "C2-Cells"; button[8].Name = button[8].Text = "C1v+C1h-Cells"; button[9].Name = button[9].Text = "All-Cells"; button[1].Text = String.Format( "Threshold={0:#}", threshold ); } protected override void OnPaint( PaintEventArgs e ) { Graphics g = e.Graphics; Rectangle r = ClientRectangle; dx = r.Width / (xSize+2); dy = r.Height / ySize; for ( y=0; y < ySize; y++ ) { button[y].Top = y*dy+1; button[y].Left = xSize*dx+1; button[y].Width = r.Width - button[y].Left - 2; button[y].Height = dy-2; } Brush redbrush = new SolidBrush( Color.Red ); Pen redpen = new Pen( Color.Red, 5 ); for ( y=0; y < ySize+1; y++ ) for ( x=0; x < xSize+1; x++ ) { try { g.FillRectangle( brush[i0[y,x]], x*dx, y*dy, dx, dy ); } catch {}; try { if ( C2 && c2[y,x] > 0 ) g.FillRectangle( redbrush, x*dx+dx/4, y*dy+dy/4, dx/2, dy/2 ); } catch {}; try { if ( C1V && c1v[y,x] > 0 ) g.DrawLine( redpen, x*dx, y*dy+1, x*dx, (y+1)*dy-1 ); } catch {}; try { if ( C1H && c1h[y,x] > 0 ) g.DrawLine( redpen, x*dx+1, y*dy, (x+1)*dx-1, y*dy ); } catch {}; try { if ( C0 && c0[y,x] > 0 ) g.FillRectangle( redbrush, x*dx-5, y*dy-5, 11, 11 ); } catch {}; } } protected void do_it( object sender, System.EventArgs e ) { switch( ((Button)sender).Name) { case "Homunculus"://*********************************** i0 = new Byte[,]{ {1,0,0,0,0,0,0,0,0,0,2}, {0,0,0,0,9,9,9,0,0,0,0}, {0,0,0,6,9,5,9,6,0,0,0}, {0,0,0,0,9,9,9,0,0,0,0}, {0,0,0,0,0,9,0,0,0,0,0}, {5,6,9,9,9,9,9,9,9,6,5}, {0,0,0,0,9,9,9,0,0,0,0}, {0,0,0,0,9,9,9,0,0,0,0}, {0,0,0,0,9,0,9,0,0,0,0}, {0,0,0,0,9,0,9,0,0,0,0}, {0,0,0,0,9,0,9,0,0,0,0}, {3,0,0,0,3,0,3,0,0,0,4} }; C0 = C1V = C1H = C2 = false; break; } Invalidate(); } }
Click Debug → Start Without Debugging Ctrl F5. Try out the program. Just the first button "Homunculus" works, all others are still dead.
![]() ![]() |
Version2: Exit cells1.
Inside the event handler protected void do_it(...) write the following new cases below the last break; of case "Homunculus":
case "Threshold"://************************************* if ( ++threshold > 9 ) threshold = 1; button[1].Text = "Threshold=" + threshold.ToString(); break; case "Noise"://**************************************** Random random = new Random(); for ( y=0; y < ySize; y++ ) for ( x=0; x < xSize; x++ ) { Int32 noise = random.Next() % 3 - 1;//gives -1 or 0 or +1 noise += i0[y,x];//add former gray value if (noise < 0) i0[y,x] = 0; else if (noise > 9) i0[y,x] = 9; else i0[y,x] = (Byte)noise; } break; case "Clear"://******************************************* for ( y=0; y < ySize; y++ ) for ( x=0; x < xSize; x++ ) i0[y,x] = 0; threshold = 1; button[1].Text = "Threshold=1"; break;
Click Debug → Start Without Debugging Ctrl F5. Test the buttons:
Threshold → The text on the button will change.
Noise → Try multiple clicks.
Clear.
![]() ![]() |
Version3: Exit programm cells1.
Inside the event handler protected void do_it(...) write the following new cases below the last break; of case "Clear":
case "C0-Cells" : C0 = true; C1V = C1H = C2 = false; break; case "C1v-Cells" : C1V = true; C0 = C1H = C2 = false; break; case "C1h-Cells" : C1H = true; C0 = C1V = C2 = false; break; case "C2-Cells" : C2 = true; C0 = C1V = C1H = false; break; case "C1v+C1h-Cells": C1H = C1V = true; C0 = C2 = false; break; case "All-Cells" : C0 = C1V = C1H = C2 = true; break;
Write the following code below the last bracket which closes the switch-statement (but in front of Invalidate();):
for ( y=0; y <= ySize; y++ ) //clear cells for ( x=0; x <= xSize; x++ ) { try { c2 [y,x] = 0; } catch {} try { c1h[y,x] = 0; } catch {} try { c1v[y,x] = 0; } catch {} c0 [y,x] = 0; } Byte above, below, left, right; for ( y=0; y < ySize; y++ ) for ( x=0; x < xSize; x++ ) { if ( i0[y,x] >= threshold ) c2[y,x] = 1; else continue; try { above = i0[y-1,x ]; } catch { above = 0; } try { below = i0[y+1,x ]; } catch { below = 0; } try { left = i0[y ,x-1]; } catch { left = 0; } try { right = i0[y ,x+1]; } catch { right = 0; } if (above < threshold) {c1h[y ,x ]=c0[y ,x ]=c0[y ,x+1]=1;} if (below < threshold) {c1h[y+1,x ]=c0[y+1,x ]=c0[y+1,x+1]=1;} if (left < threshold) {c1v[y ,x ]=c0[y ,x ]=c0[y+1,x ]=1;} if (right < threshold) {c1v[y ,x+1]=c0[y ,x+1]=c0[y+1,x+1]=1;} }
Click Debug → Start Without Debugging Ctrl F5. Start the program cells1.
![]() ![]() |
Important: Try to understand the last nested for-loops with the local variables above, below, left, right.
top of page: ![]() |