2015-12-21 7 views
0

Я работаю над проектом обработки изображений в C#. Я использую метод порогового значения OTSU. Я получаю это исключение »Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена." Я googled и искал переполнение стека более чем на 2 дня, но я не получил правильное решение. Я получаю эту ошибку только несколько изображений с другими изображениями его работает отлично ...Нарушение прав доступа в C#

public void Convert2GrayScaleFast(Bitmap bmp) 
     { 
      BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), 
        ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
      unsafe 
      { 
       byte* p = (byte*)(void*)bmData.Scan0.ToPointer(); 
       int stopAddress = (int)p + bmData.Stride * bmData.Height; 
       while ((int)p != stopAddress) 
       { 
        p[0] = (byte)(.299 * p[2] + .587 * p[1] + .114 * p[0]); 
        p[1] = p[0]; 
        p[2] = p[0]; 
        p += 3; 
       } 
      } 
      bmp.UnlockBits(bmData); 
     } 

Я получаю исключение в этой строке

p[0] = (byte)(.299 * p[2] + .587 * p[1] + .114 * p[0]); 

не говорю на байпас исключение, используя меню «Сервис» -> «Параметры» -> «Отладка» -> «Общие» -> Снимите эту опцию «Подавить оптимизацию JIT при загрузке модуля». Я пробовал все методы, но ничего не работал для меня.

Here is the image which throws the exception Большое спасибо, если вы поможете мне решить проблему.

+0

Airtel 4G работает слишком быстро. Я уверен, что Windows не сможет обработать этот файл из-за 4G скорости и латентности. Вы пробовали другую фотографию, в которой нет airtel 4G. – Adrian

+0

@ Аниругу ничего себе, какое чувство юмора! Любой, как я нахожу способ для otsu порогового значения с использованием EMGU ... Но я не исправил эту проблему ... спасибо за комментарий ... – Gokulakannan

+0

У меня проблема была решена с помощью EMGU CV для определения порога. Но я не могу исправить это. Если кто-нибудь исправит это, это может помочь любому ... – Gokulakannan

ответ

4

Изменить условие:

while ((int)p < stopAddress) 
+0

Это для меня ... Это может помочь и другим ... спасибо ... – Gokulakannan

2

Вы также должны учитывать, что шаг округляется до границы четырех байт и может быть отрицательным (точечный рисунок снизу вверх) https://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.stride(v=vs.110).aspx я предлагаю:

  int numberOfBytesPerPixel = Image.GetPixelFormatSize(bmp.PixelFormat)/8; 
      int stopAddress = (int)p + (bmData.Width * numberOfBytesPerPixel) * bmData.Height; 
      while ((int)p < stopAddress) 
      { 
       // add pixel manipulation here 
       p += numberOfBytesPerPixel; 
      } 
+0

Этот код по-прежнему фактически не пропускает байты в конце шага. вы должны следить за x и y, чтобы точно определить, когда перейти к следующей строке. – Nyerguds

Смежные вопросы