Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

diegobill

[Resolvido] Problema com LockBits em Bitmap

Recommended Posts

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

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

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

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

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

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

O que você precisa fazer com o pixel ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.