Перейти к содержимому
Compvision.ru
iskees

Странности с SetROI

Recommended Posts

В одном из врпаперов opencv (opencvsharp) есть такое:

класс Iplimage
 public IplImage GetSubImage(CvRect rect)
    {
      if (rect.Width < 0)
        throw new ArgumentException();
      if (rect.Height < 0)
        throw new ArgumentException();
      if (rect.X + rect.Width >= this.Width)
        rect.Width = this.Width - rect.X - 1;
      if (rect.Y + rect.Height >= this.Height)
        rect.Height = this.Height - rect.Y - 1;
      if (rect.X < 0)
      {
        rect.Width += rect.X;
        rect.X = 0;
      }
      if (rect.Y < 0)
      {
        rect.Height += rect.Y;
        rect.Y = 0;
      }
      IplImage iplImage = new IplImage(rect.Size, this.Depth, this.NChannels);
      this.SetROI(rect);
      Cv.Copy((CvArr) this, (CvArr) iplImage);
      this.ResetROI();
      return iplImage;
    }
SetROI это
[DllImport("opencv_core248", CallingConvention = CallingConvention.Cdecl)]
    public static extern void cvSetImageROI(IntPtr image, CvRect rect);
а  Cv.Copy это 
[DllImport("opencv_core248", CallingConvention = CallingConvention.Cdecl)]
    public static extern void cvCopy(IntPtr src, IntPtr dst, IntPtr mask);
mask null
 

Я никак не пойму почему там -1 и >=, зачем отрезаются крайняя строка и колонка

if (rect.X + rect.Width >= this.Width)
        rect.Width = this.Width - rect.X - 1;
      if (rect.Y + rect.Height >= this.Height)
        rect.Height = this.Height - rect.Y - 1;

Переписал это с > и без -1 но при вырезании если используется крайняя строка или колонка то там какие то там левые значения. Не пойму это или я  где-то туплю, или какая-то ошибка в реализации cvCopy и cvSetImageROI к которым доступа нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Там не отрезается а заворачивается на начало (или на конец если в минус уходит).

Координаты Img.Width не существует, последний пиксел имеет координату Img.Width-1.

Так что вроде все верно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подставим сл. вариант:

image размером 320 на 240

вырезаем квадрат left- 0 top-0 width-320 height-240, т.е. просто копируем

 

if (rect.X + rect.Width >= this.Width) //0+320>=320 -true

  rect.Width = this.Width - rect.X - 1; // 320-0-1

 

В результате width будет 319 и height 239 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Постоянно убеждаюсь, что сторонние обёртки над OpenCV неудобны и зачастую глючные. Лучше писать на С++ и/или Питоне, а уже результат оформлять в виде dll и вызывать из C# кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×