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.
Если у кого то возникли проблемы с
то можете попробовать вот так