iskees 32 Жалоба Опубликовано May 15, 2015 В одном из врпаперов 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 к которым доступа нет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 15, 2015 Там не отрезается а заворачивается на начало (или на конец если в минус уходит). Координаты Img.Width не существует, последний пиксел имеет координату Img.Width-1. Так что вроде все верно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано May 17, 2015 Подставим сл. вариант: 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 18, 2015 Постоянно убеждаюсь, что сторонние обёртки над OpenCV неудобны и зачастую глючные. Лучше писать на С++ и/или Питоне, а уже результат оформлять в виде dll и вызывать из C# кода. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах