1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.
5. Вывод видео
6. Ползунок
7. Захват видео с камеры
8. Запись видео
9. События от мышки
10. Обработка изображения — сглаживание
11. Обработка изображения — изменение размеров
Очень часто при работе с изображениями требуется изменить их размер (уменьшить или увеличить).
В OpenCV это реализуется функцией cvResize()
Программа загружает изображение, затем в цикле создаёт 4 изображения, с размерами в 3 раза меньше (разумеется можно задать любой другой размер), чем у исходного и сразу же выполняет cvResize() с разным типом интерполяции.
//
// изменение размеров изображения
// при помощи cvResize()
//
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
// исходная
IplImage* image = 0;
IplImage* dst[4];
int main(int argc, char* argv[])
{
// имя картинки задаётся первым параметром
char* filename = argc >= 2 ? argv[1] : "Image0.jpg";
// получаем картинку
image = cvLoadImage(filename,1);
int i=0;
printf("[i] image: %s\n", filename);
assert( image != 0 );
// создание уменьшенных картинок (разный тип интерполяции)
for(i=0;i<4; i++){
dst[i] = cvCreateImage( cvSize(image->width/3, image->height/3), image->depth, image->nChannels );
cvResize(image, dst[i], i);
}
// окно для отображения картинки
cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
cvShowImage("original",image);
// показываем результат
char buf[128];
for(i=0;i<4; i++){
cvNamedWindow( itoa(i, buf, 10) ,CV_WINDOW_AUTOSIZE);
cvShowImage(itoa(i, buf, 10), dst[i]);
}
// ждём нажатия клавиши
cvWaitKey(0);
// освобождаем ресурсы
cvReleaseImage(&image);
for(i=0;i<4; i++){
cvReleaseImage(&dst[i]);
}
// удаляем окна
cvDestroyAllWindows();
return 0;
}
результат:
CVAPI(void) cvResize( const CvArr* src, CvArr* dst, int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
- изменение размеров(масштабирование) изображения
src - исходное изображение
dst - изображение для сохранения результа
interpolation - метод интерполяции:
#define CV_INTER_NN 0 // nearest-neigbor - интерполяция методом ближайшего соседа #define CV_INTER_LINEAR 1 // билинейная интерполяция (по умолчанию) #define CV_INTER_CUBIC 2 // бикубическая интерполяция #define CV_INTER_AREA 3 //
Ссылки
Билинейная интерполяция
Бикубическая интерполяция
Интерполяция методом ближайшего соседа
http://en.wikipedia.org/wiki/Bicubic_interpolation

Далее: 12. ROI — интересующая область изображения
По теме
OpenCV - cравнение алгоритмов интерполяции при изменении размеров изображения

10 комментариев на «“11. OpenCV шаг за шагом. Обработка изображения — изменение размеров”»
большое спасибо очень помогло а то я чтоб уменьшить размер использовал cvGetAffineTransform 🙂
Подскажите, как получить RGB-параметры одного пикселя и поменять их при желании?
вопросы не относящиеся к теме статьи лучше задавать на .
картинка — это (код в самом конце)
Здравствуйте! Помогите пожалуйста решить следующую задачу, есть исходная картинка, нужно получить картинку чтобы вокруг исходной добавить 10 px по ширине и высоте и фон был белый… у исходной так же фон белый…
Спасибо большое) несколько раз видел данную функцию)) ответ был совсем рядом!
Здравствуйте!
Почему не освобождаются ресурсы изображений dst[0]-dst[3]?
ваша правда 🙂 Спасибо, пофиксил!
вот это вроде как наоборот написано
#define CV_INTER_CUBIC 2 //
#define CV_INTER_AREA 3 // бикубическая интерполяция
в Learning Opencv вот так написано хотя и по названию понятно… просто автор сильно спешил
CV_INTER_AREA Pixel area re-sampling
CV_INTER_CUBIC Bicubic interpolation
и вот еще
We can also virtually place the new resized pixel over the old pixels and then average the covered pixel values, as done with CV_INTER_AREA.
At least that’s what happens when cvResize() shrinks an image. When it expands an image, CV_INTER_AREA amounts to the same thing as CV_INTER_NN.
Если у кого то возникли проблемы с
for(i=0;i<4; i++){ cvNamedWindow( itoa(i, buf, 10) ,CV_WINDOW_AUTOSIZE); cvShowImage(itoa(i, buf, 10), dst[i]); }то можете попробовать вот так
for(i=0;i<4; i++){ std::string s = std::to_string(i); cvNamedWindow(s.c_str() ,CV_WINDOW_AUTOSIZE); cvShowImage(s.c_str(), dst[i]); }