diegobill 0 Denunciar post Postado Dezembro 19, 2009 Está função trabalha em cima de vários frames(Bitmaps) de um vídeo, porém o programa trava quando chega na linha de comando: "classificacao = ClassificarMLP(ptr[pix + 2], ptr[pix + 1], ptr[pix]);" e recebo está mensagem: AccessViolationException was unhandled Tentativa de leitura ou gravação em memória protegida. Normalmente, isso é uma indicação de que outra memória está danificada. Segue o código-fonte: void Orientacao(Bitmap imagem, ArrayList objetos, int qt_objetos, double raio) { int i,j; int classificacao; double raio_temp1,raio_temp2; Posicao ponto = new Posicao(); Bitmap image = (Bitmap)imagem.Clone(); BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); unsafe { byte* ptr = (byte*)(data.Scan0); Int32 pix; for (i = 0; i < qt_objetos; i++) { if (((Objeto)objetos[i]).rotulo == 0) { for (j = 0; j < 90; j++) { raio_temp2 = j * 4 * 0.01745; raio_temp1 = Math.Cos(raio_temp2); raio_temp2 = Math.Sin(raio_temp2); if ((((Objeto)objetos[i]).ponto.x + (int)(raio * raio_temp1)) < data.Height && (((Objeto)objetos[i]).ponto.x + (int)(raio * raio_temp1)) > 0 && 3 * (((Objeto)objetos[i]).ponto.y + (int)(raio * raio_temp2)) < data.Width && 3 * (((Objeto)objetos[i]).ponto.y + (int)(raio * raio_temp2)) > 0) { pix = ((((Objeto)objetos[i]).ponto.x + (int)(raio * raio_temp1)) * data.Stride + 3 * (((Objeto)objetos[i]).ponto.y + (int)(raio * raio_temp2))); classificacao = ClassificarMLP(ptr[pix + 2], ptr[pix + 1], ptr[pix]); if (classificacao > -1) //ciano, rosa ou ver { j += 3; raio_temp2 = j * 4 * 0.01745; raio_temp1 = Math.Cos(raio_temp2); raio_temp2 = Math.Sin(raio_temp2); pix = ((((Objeto)objetos[i]).ponto.x + (int)(raio * raio_temp1)) * data.Stride + 3 * (((Objeto)objetos[i]).ponto.y + (int)(raio * raio_temp2))); classificacao = ClassificarMLP(ptr[pix + 2], ptr[pix + 1], ptr[pix]); ponto.x = ((Objeto)objetos[i]).ponto.x + (int)(raio * raio_temp1); ponto.y = ((Objeto)objetos[i]).ponto.y + (int)(raio * raio_temp2); if (classificacao > -1) { ponto = CentroideNovo(ponto, image, 1); j += 20; switch (classificacao) { case 0: //((Objeto)objetos[i]).ponto.ang = ((Objeto)objetos[i]).ponto.Angulo(ponto); //ciano break; case 1: ((Objeto)objetos[i]).ponto.ang = ((Objeto)objetos[i]).ponto.Angulo(ponto);//ImagemProcessada->Picture->Bitmap->Canvas->Brush->Color=(TColor)16744703; //rosa break; case 2: //((Objeto)objetos[i]).ponto.ang = ((Objeto)objetos[i]).ponto.Angulo(ponto); //verde break; } } } } else { j++; } } } } } image.UnlockBits(data); } Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 21, 2009 O que faz exatamente o método ClassificarMLP? Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
diegobill 0 Denunciar post Postado Dezembro 21, 2009 O que faz exatamente o método ClassificarMLP? Abraços... é uma função que através dos valores RGB do pixel classifica o pixel em ciano, rosa, verde ou preto utilizando uma rede neural MLP Compartilhar este post Link para o post Compartilhar em outros sites
scorpio 7 Denunciar post Postado Dezembro 22, 2009 O erro deve estar no seu ponteiro. ptr[pix + 2] pix+2 pode ser que não exista. Compartilhar este post Link para o post Compartilhar em outros sites
diegobill 0 Denunciar post Postado Dezembro 22, 2009 O erro deve estar no seu ponteiro. ptr[pix + 2] pix+2 pode ser que não exista. Mas pq você acha que pode nao existir o pix+2, eu coloquei uma condicional para o pix+2 nao ficar fora dos limites do bitmap: if ((((Objeto)objetos).ponto.x + (int)(raio * raio_temp1)) < data.Height && (((Objeto)objetos).ponto.x + (int)(raio * raio_temp1)) > 0 && 3 * (((Objeto)objetos).ponto.y + (int)(raio * raio_temp2)) < data.Width && 3 * (((Objeto)objetos).ponto.y + (int)(raio * raio_temp2)) > 0) Alem disso quando o pix+2 esta fora dos limites do bitmap a mensagem de erro eh diferente, tem haver com você excedeu os limites e tal, a mensagem que estou recebendo eh assim: AccessViolationException was unhandled Tentativa de leitura ou gravação em memória protegida. Normalmente, isso é uma indicação de que outra memória está danificada. Acho que tem haver com o lockbits pq ele justamente trava e destrava o acesso ao bitmap Compartilhar este post Link para o post Compartilhar em outros sites
scorpio 7 Denunciar post Postado Dezembro 23, 2009 Não funciona sem o lockbits? Experimente retirar para ver se funciona sem. Acontece o erro já na primeira vez que entra no FOR? Compartilhar este post Link para o post Compartilhar em outros sites
diegobill 0 Denunciar post Postado Dezembro 24, 2009 Não funciona sem o lockbits? Experimente retirar para ver se funciona sem. Acontece o erro já na primeira vez que entra no FOR? Como faço para acessar o pixel com o ponteiro sem o bitmapdata que usa o lockbits? O problema não ocorre no primeiro for nao, ocorre soh depois de um tempo de execucao. Compartilhar este post Link para o post Compartilhar em outros sites
scorpio 7 Denunciar post Postado Dezembro 24, 2009 O que você precisa fazer com o pixel ? Compartilhar este post Link para o post Compartilhar em outros sites
diegobill 0 Denunciar post Postado Dezembro 24, 2009 Desculpa ai cara... brigado pela ajuda ... mas consegui resolver o problema.... Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 29, 2009 Poste a solução. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites