OpenCV не содержит определения для «GetPixel»

Пытаюсь реализовать фильтр на изображении с помощью 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]);
          }
      }
  } 

person LewSim    schedule 27.12.2011    source источник
comment
Ошибка верна на основе документации API: emgu.com/ wiki/files/2.3.0/document/Index.html. Какой у Вас вопрос?   -  person M.Babcock    schedule 27.12.2011


Ответы (3)


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

Структура изображения EMGU получает доступ к данным изображения немного по-другому, используя метод 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 имеет прямой доступ к матрице изображения в свойстве Image.Data. Это намного быстрее при чтении/записи данных. Однако небольшое предупреждение: любой метод значительно замедляется при циклическом просмотре каждого пикселя, когда задана область интереса изображения. Гораздо проще вручную установить операторы запуска и окончания цикла for для требуемой настройки 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,

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

Ваше здоровье,

Крис

person Chris    schedule 29.12.2011

Это разбито на Filter2D, вам нужно будет перемещаться по вики-сайтам поддержки, чтобы найти именно то, что вам нужно. .html" rel="nofollow">http://www.emgu.com/wiki/files/2.3.0/document/Index.html посмотрите на метод CvInvoke..::..cvFilter2D или CvInvoke Класс

person MethodMan    schedule 27.12.2011

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

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

person hypermush    schedule 27.12.2011