Я хотел бы объявить объект cv :: Mat и где-то еще в моем коде, изменить его размер (nrows и ncols). Я не смог найти какой-либо метод в документации OpenCV. Они всегда предлагают включить измерение в constuctor.Как изменить cv :: Mat размеры изображения динамически?
ответ
Простым и понятным способом является использование метода create(). Вы можете назвать это столько раз, сколько вы хотите, и он будет перераспределять буфер изображения, когда paramters посланный, чтобы создать и текущие параметры изображения не совпадают:
Mat frame;
for(int i=0;i<n;i++)
{
...
// if width[i], height[i] or type[i] are != to those on the i-1
// or the frame is empty(first loop)
// it allocates new memory
frame.create(width[i], height[i], type[i]);
...
// do some processing
}
Если вы хотите изменить размер изображения, отметьте resize()
!
Создать новую Mat dst
с размерами и введите данные, которые вы хотите, а затем:
cv::resize(src, dst, dst.size(), 0, 0, cv::INTER_CUBIC);
Существуют и другие методы интерполяции, кроме cv::INTER_CUBIC
проверьте документы.
Благодаря KARL, но моя проблема заключается в том, что я хочу динамически определяют тип и размер объекта cv :: Mat. resize() может быть одним из решений, но это не совсем то, что я ищу. – Rasoul
Ну, я использовал 'resize()' для этой цели (насколько я мог понять вас) больше раз, чем могу считать. Всякий раз, когда вам нужно изменить размеры вашего 'src' Mat, все, что вам нужно сделать, это объявить новый Mat с необходимыми размерами и типом и выполнить' resize() ', чтобы он масштабировал данные в новом измерении. И если вы хотите, вы все равно можете выполнить 'src = dst.clone();' скопировать переназначенные данные в исходный Mat. – karlphillip
Вы просто хотите определить его с помощью переменной Size
, которую вы вычислите следующим образом?
// dynamically compute size...
Size dynSize(0, 0);
dynSize.width = magicWidth();
dynSize.height = magicHeight();
int dynType = CV_8UC1;
// determine the type you want...
Mat dynMat(dynSize, dynType);
Спасибо! Я думаю, что нашел решение, объявить cv :: Mat image; и где-то еще динамически меняют свои свойства, вызывая create() как image.create (magicWidth(), magicHeight(), dynType); – Rasoul
Да, 'create()' обязательно должен сделать то же самое, что и конструктор сразу после того, как вы объявили объект 'Mat'. – mevatron
Если вы знаете, максимальные размеры и нужно только использовать поддиапазон строк/перевалы от общего Мата использовать функции резюме :: Mat :: rowRange и/или резюме :: Mat :: colRange
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-rowrange
- 1. Копирование нижней части cv :: Mat в другую cv :: Mat
- 2. Инициализировать cv :: Mat с динамически распределенными данными
- 3. cv :: Mat detect PixelFormat
- 4. Назначение данных cv :: Mat
- 5. копирование данных изображения в вектор cv :: mat
- 6. Как преобразовать cv :: Mat в cv :: Rect
- 7. как конвертировать cv :: Mat to cv :: Matx33f
- 8. cv :: Ошибка Erode с двоичным cv :: mat
- 9. Преобразование контуров из вектора cv :: Point in cv :: Mat
- 10. Объединить несколько cv :: Mat?
- 11. Максимальный одноканальный cv :: Mat from multi channel cv :: Mat
- 12. не может конвертировать из 'cv :: Mat *' в 'const cv :: Mat'
- 13. Передовая декларация cv :: Mat
- 14. Печать cv :: Mat opencv
- 15. Как использовать cv :: Mat :: convertTo
- 16. Как очистить содержимое cv :: Mat?
- 17. Получение значений cv :: Mat
- 18. cv :: Метод выпуска Mat
- 19. Сравнить 2 CV :: Mat
- 20. OpenCV: Partitioning cv :: Mat
- 21. openCV cv :: mat release
- 22. cv :: bitwise_not on cv :: Mat matrix
- 23. cv :: imwrite не сохраняет CV_32FC4 cv :: Mat
- 24. Копировать cv :: Mat в CMSampleBufferRef
- 25. Преобразование между cv :: Mat и arma :: mat
- 26. Как отрегулировать пустой cv :: Mat object
- 27. C++ | Изменить цвет в cv :: mat with setTo
- 28. Скопировать vtkImageData в cv :: Mat
- 29. Как сохранить openCV cv :: Mat для изображения без изменений
- 30. Как изменить значение в позиции в cv :: Mat class (16UC1)
не создает() разрушает исходное изображение? Я думал, что вам нужно использовать resize. –
Вы правы. Mat :: create de-links предыдущие данные. Http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-create, в то время как Mat :: resize сохраняет это так же, как векторный класс STL http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-resize – gantzer89
По причинам, которые я слишком ленив, чтобы объяснить, resize() не работает как STL функции контейнеров и create() выполняет задание в этом случае. Он только переназначает, если новый размер не соответствует оригиналу. – Sam