OpenCV не содержит определения для «GetPixel» - PullRequest
0 голосов
/ 27 декабря 2011

Попытка реализовать фильтр на изображении с помощью OpenCv / EmguCV, получение ошибки:

Emgu.CV.Image не содержит определения для 'GetPixel'

 for (int filterX = 0; filterX < filterWidth; filterX++)
              {
                  for (int filterY = 0; filterY < filterHeight; filterY++)
                  {
                      int imageX = (x - filterWidth / 2 + filterX + w) % w;
                      int imageY = (y - filterHeight / 2 + filterY + h) % h;

                      **Color imageColor = img.GetPixel(imageX, imageY);**
                      red += imageColor.R * filter[filterX, filterY];
                      green += imageColor.G * filter[filterX, filterY];
                      blue += imageColor.B * filter[filterX, filterY];
                  }
                  int r = Math.Min(Math.Max((int)(factor * red + bias), 0), 255);
                  int g = Math.Min(Math.Max((int)(factor * green + bias), 0), 255);
                  int b = Math.Min(Math.Max((int)(factor * blue + bias), 0), 255);

                  result[x, y] = Color.FromArgb(r, g, b);
              }
          }
      }
      for (int i = 0; i < w; ++i)
      {
          for (int j = 0; j < h; ++j)
          {
              sharpenImage.SetPixel(i, j, result[i, j]);
          }
      }
  } 

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

EMGU использует структуру, встроенную в C #, для хранения данных изображения. Это позволяет коду работать более эффективно, чем использовать OpenCV для всего. Хотя EMGU оборачивает некоторые функции OpenCV в неуправляемый код, поэтому мы добавляем opencv.dll, но также пытаемся сохранить как можно больше функций в c #.

EMGU Image Structure получает данные изображения немного по-другому, используя метод GetPixel, выглядит следующим образом:

//Colour Image
Bgr my_Bgr = My_Image[0, 0];

//Gray Image
Gray my_Gray = gray_image[0, 0];

Там, где вы явно меняете [0,0] на соответствующее место на вашем изображении. В EMGU это не рекомендуется, поскольку, хотя он не такой медленный, как метод Bitmap.GetPixel, он все же не самый быстрый метод.

EMGU Структура изображения имеет прямой доступ к матрице изображения в свойстве Image.Data. Это намного быстрее при чтении / записи данных. Однако, небольшое предупреждение, что любой метод значительно замедляется при циклическом прохождении каждого пикселя, когда установлена ​​ROI изображения. Гораздо проще вручную задать для операторов начала и окончания цикла требуемую настройку ROI, а затем установить поле ROI. Причина в том, что любой метод должен сначала проверить ROI, а затем вычислить пиксель, к которому осуществляется доступ, прежде чем найти данные, и это добавляет пару инструкций.

Доступ к методу Image.Data можно получить следующим образом:

//Image<Bgr,Byte>: Bgr = Blue,Green,Red

int Red = My_Image.Data[0,0,2]; //Read to the Red Spectrum
int Green= My_Image.Data[0,0,1]; //Read to the Green Spectrum
int Blue= My_Image.Data[0,0,0]; //Read to the BlueSpectrum

В любом случае ваш код должен выглядеть примерно так:

for (int filterX = 0; filterX < filterWidth; filterX++)
{
    for (int filterY = 0; filterY < filterHeight; filterY++)
    {
        int imageX = (x - filterWidth / 2 + filterX + w) % w;
        int imageY = (y - filterHeight / 2 + filterY + h) % h;

        red += img.Data[imageY,imageX,2] * filter[filterX, filterY];
        green += img.Data[imageY,imageX,1]  * filter[filterX, filterY];
        blue += img.Data[imageY,imageX,0]  * filter[filterX, filterY];
    }
    int r = Math.Min(Math.Max((int)(factor * red + bias), 0), 255);
    int g = Math.Min(Math.Max((int)(factor * green + bias), 0), 255);
    int b = Math.Min(Math.Max((int)(factor * blue + bias), 0), 255);

    result[x, y] = Color.FromArgb(r, g, b);
}

Если вам нужна дополнительная помощь, я немного подробнее расскажу о доступе к данным изображения в своей статье проекта кода Создание вашего первого проекта обработки изображений EMGU ,

Надеюсь, это поможет,

Приветствия

Chris

0 голосов
/ 28 декабря 2011

Похоже, вы пытаетесь применить фильтр резкости из этого вопроса.Поскольку вы используете EmguCV, вы, вероятно, не хотите этого делать - это будет намного медленнее, чем использование нерезкого маскирования.Однако, если вы действительно хотите - класс EmguCV Image предоставляет свойство System.Drawing.Bitmap как Bitmap, которое заставит ваш код работать (очень медленно).

Итак, измените эту строку на Color imageColor = img.Bitmap.GetPixel(imageX, imageY);

0 голосов
/ 27 декабря 2011

Это относится к Filter2D, который вам потребуется для навигации по сайтам поддержки, чтобы найти именно то, что вам нужно .. http://www.emgu.com/wiki/files/2.3.0/document/Index.html посмотрите на метод CvInvoke .. :: .. cvFilter2D или класс CvInvoke

...