Anda di halaman 1dari 8

PROGRMACION GRAFICA Pasos Capturar imagen Binarizar imagen Etiquetar Contar objetos Encontrar centros Momentos centrales Momentos

normalizados Momentos invariantes Distancia euclidiana: es la distancia "ordinaria" (que se medira con una regla de acero) entre dos puntos de un espacio eucldeo, la cual se deduce a partir del teorema de Pitgoras. es la distancia entre dos puntos (Fi 1-F1 entrante) -(Fi2+Fi2entrante)-(Fi3-Fi3entrante) 1. la suma de los momentos para obtener el promedio. 2. la frmula para sustituir el valor del promedio que obtuvimos
double DistanciaCirculo = Math.Sqrt((Math.Pow(0.159662278 - Proceso.Theta[x, 1], 2) + Math.Pow(0.000108 - Proceso.Theta[x, 2], 2) + Math.Pow(3.920715222 - Proceso.Theta[x, 3], 2))); double DistanciaCuadrado = Math.Sqrt((Math.Pow(0.193782211 - Proceso.Theta[x, 1], 2) + Math.Pow(0.001104196 - Proceso.Theta[x, 2], 2) + Math.Pow(4.318768098 - Proceso.Theta[x, 3], 2))); double DistanciaTriangulo = Math.Sqrt((Math.Pow(0.19194018 - Proceso.Theta[x, 1], 2) + Math.Pow(0.0000159 - Proceso.Theta[x, 2], 2) + Math.Pow(394.7700228 - Proceso.Theta[x, 3], 2))); if(DistanciaCirculo < DistanciaCuadrado) { textBox4.Text = "Cuadrado"; } if(DistanciaCuadrado < DistanciaCirculo) { textBox4.Text = "Circulo"; } if(DistanciaTriangulo < DistanciaCirculo && DistanciaTriangulo < DistanciaCuadrado) { textBox4.Text = "Triangulo"; }

MANDAR A LLAMAR LOS VALORES DE LOS MOMENTOS EN UN ARCHIVO TEXTO


private void Momentos(object sender, EventArgs e) { FileStream Archivo = new FileStream(@"C:\Users\Alan Garcs\Desktop\ListaTrianfulo.txt", FileMode.Append, FileAccess.Write); //En esta linea se cambi el "FileMode.Create" por "FileMode.Append" ya que nosotros queremos que los datos se almacenen en un //archivo .txt sin perder los datos anteriores, pero que aparezcan los nuevos datos. StreamWriter Escribir = new StreamWriter(Archivo); if (Convert.ToInt32(this.data.Rows.Count) >= 1) { int Coordenada = Convert.ToInt32(this.data.CurrentRow.Index); Escribir.Write("Fi 1 - "); Escribir.Write(textBox1.Text = this.data.Rows[Coordenada].Cells[3].Value + " "); Escribir.Write("Fi 2 - "); Escribir.Write(textBox2.Text = this.data.Rows[Coordenada].Cells[4].Value + " "); Escribir.Write("Fi 3 - "); Escribir.WriteLine(textBox3.Text = this.data.Rows[Coordenada].Cells[5].Value + " "); } Escribir.WriteLine(); Escribir.Close(); Archivo.Close(); }

PROGRAMA PRINCIPAL
namespace WEBCAM_PRACTICA_1 { public partial class Form1 : Form { bool existenDispositivos = false; bool Reconocer = false; int umbral = 128;//ajustar el brillo o contraste FilterInfoCollection DispositivosdeVideo; VideoCaptureDevice Fuentedevideo = null; public Form1() { DispositivosdeVideo = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (DispositivosdeVideo.Count == 0) { existenDispositivos = false; } else { existenDispositivos = true; } InitializeComponent(); data.Rows.Add(100); } private void pbImagen_Click(object sender, EventArgs e) { } private void btniniciarwebcam_Click(object sender, EventArgs e) { if (existenDispositivos) { Fuentedevideo = new VideoCaptureDevice(DispositivosdeVideo[0].MonikerString); Fuentedevideo.NewFrame += new NewFrameEventHandler(MostrarImagen); Fuentedevideo.Start(); } else { MessageBox.Show("No se encuentra algun dispositivo de video en el sistema", "Informacin", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void MostrarImagen(object sender, NewFrameEventArgs eventArgs) { Bitmap Imagen = (Bitmap)eventArgs.Frame.Clone(); Imagen.RotateFlip(RotateFlipType.RotateNoneFlipX); try { pbImagen.Image = Imagen;

} catch (Exception ex) { MessageBox.Show("Error" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void CerraFormulario() { if(Fuentedevideo!=null) { if(Fuentedevideo.IsRunning) { Fuentedevideo.SignalToStop(); Fuentedevideo=null; } } } private void pbImagen_Paint(object sender, PaintEventArgs e) { Pen cruz= new Pen(Color.Red,4); int Escala = 3; int Objeto; Vision_Artificial Proceso = new Vision_Artificial(); if (Reconocer==true) { Bitmap Imagen=new Bitmap(pbImagen.Image,pbImagen.Width/Escala,pbImagen.Height/Escala); pbBinario.Image = Proceso.Binarizar(Imagen,umbral,Escala); Objeto=Proceso.Contarobjetos(25); double[,] datos; datos = Proceso.encontrarcentros(); for (int x = 1; x <= Objeto;x++) { e.Graphics.DrawLine(cruz, (float)datos[x, 1] - 10, (float)datos[x, 2], (float)datos[x, 1] + 10, (float)datos[x, 2]); e.Graphics.DrawLine(cruz, (float)datos[x, 1], (float)datos[x, 2]-10, (float)datos[x, 1], (float)datos[x, 2]+10); data.Rows[x].Cells[0].Value = evaluar, insertar y actualizar los valores de la data.Rows[x].Cells[1].Value = data.Rows[x].Cells[2].Value = data.Rows[x].Cells[3].Value = data.Rows[x].Cells[4].Value = data.Rows[x].Cells[5].Value = datos[x, 0];//data.rows sirve para tabla. datos[x, 1]; datos[x, 2]; Proceso.Theta[x, 1]; Proceso.Theta[x, 2]; Proceso.Theta[x, 3];

double DistanciaCirculo = Math.Sqrt((Math.Pow(0.159662278 Proceso.Theta[x, 1], 2) + Math.Pow(0.000108 - Proceso.Theta[x, 2], 2) + Math.Pow(3.920715222 - Proceso.Theta[x, 3], 2))); double DistanciaCuadrado = Math.Sqrt((Math.Pow(0.193782211 Proceso.Theta[x, 1], 2) + Math.Pow(0.001104196 - Proceso.Theta[x, 2], 2) + Math.Pow(4.318768098 - Proceso.Theta[x, 3], 2)));

double DistanciaTriangulo = Math.Sqrt((Math.Pow(0.19194018 Proceso.Theta[x, 1], 2) + Math.Pow(0.0000159 - Proceso.Theta[x, 2], 2) + Math.Pow(394.7700228 - Proceso.Theta[x, 3], 2))); if(DistanciaCirculo < DistanciaCuadrado) { textBox4.Text = "Cuadrado"; } if(DistanciaCuadrado < DistanciaCirculo) { textBox4.Text = "Circulo"; } if(DistanciaTriangulo < DistanciaCirculo && DistanciaTriangulo < DistanciaCuadrado) { textBox4.Text = "Triangulo"; } } } } private void btnBinarizar_Click(object sender, EventArgs e) { Reconocer=true; } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { umbral = hScrollBar1.Value; } private void Momentos(object sender, EventArgs e) { FileStream Archivo = new FileStream(@"C:\Users\Alan Garcs\Desktop\ListaTrianfulo.txt", FileMode.Append, FileAccess.Write); //En esta linea se cambi el "FileMode.Create" por "FileMode.Append" ya que nosotros queremos que los datos se almacenen en un //archivo .txt sin perder los datos anteriores, pero que aparezcan los nuevos datos. StreamWriter Escribir = new StreamWriter(Archivo); if (Convert.ToInt32(this.data.Rows.Count) >= 1) { int Coordenada = Convert.ToInt32(this.data.CurrentRow.Index); Escribir.Write("Fi 1 - "); Escribir.Write(textBox1.Text = this.data.Rows[Coordenada].Cells[3].Value + " "); Escribir.Write("Fi 2 - "); Escribir.Write(textBox2.Text = this.data.Rows[Coordenada].Cells[4].Value + " "); Escribir.Write("Fi 3 - "); Escribir.WriteLine(textBox3.Text = this.data.Rows[Coordenada].Cells[5].Value + " "); } Escribir.WriteLine(); Escribir.Close();

Archivo.Close(); }

} }

VISION ARTIFICIAL
public int Contarobjetos(int area) { int x, y, h; int e; numero_objetos = 0; for (h = 1; h <= numero_maximo_onjetos; h++) { e = 0; for (y = 0; y < Alto; y++) { for (x = 0; x < Ancho; x++) { if (f[x, y] == h) e = e + 1; } } if (e > area) { numero_objetos++; Histograma[numero_objetos] = h; } } return (numero_objetos); } public double[,] encontrarcentros() { double suma = 0; double[,] momento = new double[4, 4]; double[,] datos = new double[100, 3]; for (h = 1; h <= numero_objetos; h++) { suma = 0; for (p = 0; p <= 3; p++) { for (q = 0; q <= 3; q++) { suma = 0; for (y = 0; y <Alto; y++) { for (x = 0; x < Ancho; x++) { if (f[x, y] == Histograma[h]) suma = suma + (Math.Pow(x * 1.0, p) * Math.Pow(y * 1.0, q));

} } momento[p, q] = suma; } } datos[h, 0] = momento[1, 1]; double xg = momento[1, 0] / momento[0, 0]; double yg = momento[0, 1] / momento[0, 0]; datos[h, 1] = factor * xg; datos[h, 2] = factor * yg; momentoscentrales(momento,xg,yg);//mandar los valores al metodo momentosnormalizados(); momentosinvariantes(h); //Se cambi este cdigo por el que esta arriba /*datos[h, 1] = momento[1, 0] / momento[0, 0];//datos momentos centrales datos[h, 2] = momento[0, 1] / momento[0, 0];//datos momentos centrales momentoscentrales(datos[h, 1], datos[h, 2], momento);//mandar los valores al metodo momentosnormalizados(); momentosinvariantes(h);//mandar el valor de h al metodo */ } return datos; } public void momentoscentrales(double[,] m, double x, double y)//se conserven constantes ante cambios de posicin del objeto sin rotaciones y cambios de escala { //Math.Pow:Devuelve un nmero especificado elevado a la potencia especificada. mu[0, 0] = m[0, 0]; mu[1, 0] = 0; mu[0, 1] = 0; mu[2, 0] = m[2, 0] - (x * m[1, 0]); mu[0, 2] = m[0, 2] - (y * m[0, 1]); mu[1, 1] = m[1, 1] - (y * m[1, 0]); mu[3, 0] = m[3, 0] - (3 * y * m[2, 0]) + (2 * Math.Pow(x, 2) * m[1, 0]); mu[1, 2] = m[1, 2] - (2 * y * m[1, 1]) - (x * m[0, 2]) + (2 * Math.Pow(y, 2) * m[1, 0]); mu[2, 1] = m[2, 1] - (2 * x * m[1, 1]) - (y * m[2, 0]) + (2 * Math.Pow(x, 2) * m[0, 1]); mu[0, 3] = m[0, 3] - (3 * y * m[0, 2]) + (2 * Math.Pow(y, 2) * m[0, 1]); } public void momentosnormalizados()//: para que los momentos se conserven constantes ante cambios de escala { double gama; for (etiqueta = 1; etiqueta <=numero_objetos; etiqueta++) { for (p = 0; p < 4; p++) { for (q = 0; q < 4; q++) { for (y = 0; y < Alto; y++) {

for (x = 0; x < Ancho; x++) { gama = ((p + q) / 2) + 1;//ecuacion de momentos normalizados eta[p, q] = mu[p, q] / Math.Pow(mu[0, 0], gama); } } } } } } public void momentosinvariantes(int h)//para los movimientos de rotacion o translacion { Theta[h, 1] = eta[2, 0] + eta[0, 2];//ecuacin Theta[h, 2] = Math.Pow((eta[2, 0] - eta[0, 2]), 2) + (4 * Math.Pow((eta[1, 1]), 2)); Theta[h, 3] = Math.Pow((eta[3, 0] - (3 * eta[1, 2])), 2) + (3 * Math.Pow((eta[2, 1] - eta[0, 3]), 2)); }

Anda mungkin juga menyukai