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 // 

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

Далее: 12. ROI — интересующая область изображения

По теме
OpenCV - cравнение алгоритмов интерполяции при изменении размеров изображения


10 комментариев на «“11. OpenCV шаг за шагом. Обработка изображения — изменение размеров”»

  1. Здравствуйте! Помогите пожалуйста решить следующую задачу, есть исходная картинка, нужно получить картинку чтобы вокруг исходной добавить 10 px по ширине и высоте и фон был белый… у исходной так же фон белый…

  2. вот это вроде как наоборот написано
    #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.

  3. Если у кого то возникли проблемы с

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

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение