Как обычно, первые два аргумента этой функции являются указателями на изображения: IplImage* srcImage; // указатель на исходное изображение IplImage* dstImage; // указатель на изображение, в котором функция должна сохранить результат
Третий вещественный аргумент angle определяет угол поворота изображения в градусах. Положительное значение аргумента angle соответствует повороту по часовой стрелке, а отрицательное – против часовой стрелки. Поворот изображения осуществляется вокруг угла изображения с координатами (0,0). Результаты поворота изображения на 45 градусов по часовой и против часовой стрелки представлены на рисунке 1.
iplRotate
angle=45
angle=-45
Рис. 1. Действие функции iplRotate
Вещественные аргументы xShift и yShift определяют величины сдвига вдоль осей x и y после выполнения поворота. Результат поворота с последующим сдвигом представлен на рисунке 2.
iplRotate
Рис. 2. Действие функции iplRotate с аргументами angle=45, xShift=srcImage->width/2 и yShift=srcImage->height/2
Если поворот изображения должен быть осуществлен вокруг точки с произвольными координатами (x, y), а не вокруг точки (0,0), то необходимо сначала вычислить величины сдвига, а затем вызвать функцию iplRotate. Величину сдвигов можно вычислить с помощью специальной функции iplGetRotateShift, которая имеет следующий прототип:
где xCenter и yCenter координаты точки, вокруг которой осуществляется поворот, angle – угол поворота, а xShift и yShift – указатели на переменные, которым должны быть присвоены значения вычисленных необходимых сдвигов.
Для поворота изображения вокруг точки с произвольными координатами гораздо удобнее воспользоваться макроопределением iplRotateCenter, которое имеет следующий прототип:
где xCenter и yCenter – координаты точки, вокруг которой будет осуществляться вращение. Результат поворота изображения вокруг его центра представлен на рисунке:
iplRotateCenter
Рис. 3. Действие макроопределения iplRotateCenter с аргументами angle=45, xCenter=srcImage->width/2 и yCenter=srcImage->height/2
Последний целочисленный аргумент interpolate функции iplRotate и макроопределения iplRotateCenter так же как и в функциях изменения размеров изображений определяет режим интерполирования. Перечисленные выше значения этого аргумента в функциях поворота могут комбинироваться в режиме побитового ИЛИ (|) комбинироваться с константой IPL_SMOOTH_EDGE, в результате чего края повернутого изображения будут сглаживаться.
Поворот прямоугольного изображения, выполняемый по месту, требует изменения его размеров. В приведенном примере функция RotateImageCW осуществляет поворот изображения по часовой стрелке на 90° (Рис. 4).
void RotateImageCW(IplImage* img){// Создать временное изображение с измененным размером IplImage* tmp = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, img->height, img->width, NULL, NULL, NULL, NULL); // Занять память под временное изображение iplAllocateImage(tmp, 0, 0); // Выполнить поворот с последующим сдвигом iplRotate(img, tmp, 90, 0, img->width-1, IPL_INTER_LINEAR); // Освободить память исходного изображения iplDeallocate(img, IPL_IMAGE_ALL); // Скопировать результат в исходное изображение img = iplCloneImage(tmp); // Освободить память временного изображения iplDeallocate(tmp, IPL_IMAGE_ALL);}
RotateImageCW
Рис. 4. Действие функции RotateImageCW
Функция для поворота на 90° против часовой стрелки RotateImageCСW может быть реализована аналогично. Аргументы angle, xShift и yShift должны иметь следующие значения: angle=-90, xShift=img->height-1 и yShift=0.