2011-12-22 3 views

ответ

3

Простым и понятным способом является использование метода 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 
} 
+4

не создает() разрушает исходное изображение? Я думал, что вам нужно использовать resize. –

+0

Вы правы. 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

+0

По причинам, которые я слишком ленив, чтобы объяснить, resize() не работает как STL функции контейнеров и create() выполняет задание в этом случае. Он только переназначает, если новый размер не соответствует оригиналу. – Sam

6

Если вы хотите изменить размер изображения, отметьте resize()!

Создать новую Mat dst с размерами и введите данные, которые вы хотите, а затем:

cv::resize(src, dst, dst.size(), 0, 0, cv::INTER_CUBIC); 

Существуют и другие методы интерполяции, кроме cv::INTER_CUBIC проверьте документы.

+0

Благодаря KARL, но моя проблема заключается в том, что я хочу динамически определяют тип и размер объекта cv :: Mat. resize() может быть одним из решений, но это не совсем то, что я ищу. – Rasoul

+0

Ну, я использовал 'resize()' для этой цели (насколько я мог понять вас) больше раз, чем могу считать. Всякий раз, когда вам нужно изменить размеры вашего 'src' Mat, все, что вам нужно сделать, это объявить новый Mat с необходимыми размерами и типом и выполнить' resize() ', чтобы он масштабировал данные в новом измерении. И если вы хотите, вы все равно можете выполнить 'src = dst.clone();' скопировать переназначенные данные в исходный Mat. – karlphillip

3

Вы просто хотите определить его с помощью переменной 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); 
+0

Спасибо! Я думаю, что нашел решение, объявить cv :: Mat image; и где-то еще динамически меняют свои свойства, вызывая create() как image.create (magicWidth(), magicHeight(), dynType); – Rasoul

+0

Да, 'create()' обязательно должен сделать то же самое, что и конструктор сразу после того, как вы объявили объект 'Mat'. – mevatron

Смежные вопросы