Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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);
}Carregando comentários...