Ajuda - Busca - Membros - Calendário
Versão Completa: (Resolvido) Problema com LockBits em Bitmap
Fórum Script Brasil > Programação & Desenvolvimento > .NET
diegobill
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:

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

quintelab
O que faz o seu método ClassificarMLP ?

Abraços...
diegobill
é 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

diegobill
vlw ae galera... brigadaum... consegui resolver o problema....
quintelab
Poste a solução.

Abraços...
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.