11. OpenCV шаг за шагом. Обработка изображения - изменение размеров

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 // бикубическая интерполяция


Ссылки:
Билинейная интерполяция
Бикубическая интерполяция
Интерполяция методом ближайшего соседа
en.wikipedia.org/wiki/Bicubic_interpolation



Далее: 12. ROI — интересующая область изображения
  • 0
  • 6 августа 2010, 09:54
  • noonv

Комментарии (10)

RSS свернуть / развернуть
+
0
большое спасибо очень помогло а то я чтоб уменьшить размер использовал cvGetAffineTransform :)
avatar

tipabot

  • 19 ноября 2010, 12:46
+
0
Подскажите, как получить RGB-параметры одного пикселя и поменять их при желании?
avatar

Altivolus

  • 19 июля 2011, 09:41
+
0
вопросы не относящиеся к теме статьи лучше задавать на форуме.

картинка — это матрица (код в самом конце)
avatar

noonv

  • 19 июля 2011, 10:09
+
0
Здравствуйте! Помогите пожалуйста решить следующую задачу, есть исходная картинка, нужно получить картинку чтобы вокруг исходной добавить 10 px по ширине и высоте и фон был белый… у исходной так же фон белый…
avatar

zobnin

  • 5 ноября 2013, 05:09
+
0
avatar

noonv

  • 5 ноября 2013, 05:16
+
0
Спасибо большое) несколько раз видел данную функцию)) ответ был совсем рядом!
avatar

zobnin

  • 5 ноября 2013, 05:24
+
0
Здравствуйте!

Почему не освобождаются ресурсы изображений dst[0]-dst[3]?
avatar

DestinyR

  • 10 февраля 2014, 14:47
+
0
ваша правда :) Спасибо, пофиксил!
avatar

noonv

  • 11 февраля 2014, 05:17
+
0
вот это вроде как наоборот написано
#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.
avatar

jacknk88

  • 4 апреля 2014, 12:57
+
0
Если у кого то возникли проблемы с

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]);
    }
avatar

modikon35

  • 21 ноября 2016, 08:20

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.