Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com LockBits em Bitmap


diegobill

Pergunta

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);
        }

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152.1k
    • Posts
      651.8k
×
×
  • Criar Novo...