Повороты изображений
Для выполнения поворота изображения можно воспользоваться функцией iplRotate библиотеки IPL, которая имеет следующий прототип:
void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate);
Как обычно, первые два аргумента этой функции являются указателями на изображения:
IplImage* srcImage; // указатель на исходное изображение
IplImage* dstImage; // указатель на изображение, в котором функция должна сохранить результат
Третий вещественный аргумент angle определяет угол поворота изображения в градусах. Положительное значение аргумента angle соответствует повороту по часовой стрелке, а отрицательное – против часовой стрелки. Поворот изображения осуществляется вокруг угла изображения с координатами (0,0). Результаты поворота изображения на 45 градусов по часовой и против часовой стрелки представлены на рисунке 1.
Рис. 1. Действие функции iplRotate
Вещественные аргументы xShift и yShift определяют величины сдвига вдоль осей x и y после выполнения поворота. Результат поворота с последующим сдвигом представлен на рисунке 2.
Рис. 2. Действие функции iplRotate с аргументами angle=45 , xShift=srcImage->width/2 и yShift=srcImage->height/2
Если поворот изображения должен быть осуществлен вокруг точки с произвольными координатами (x, y), а не вокруг точки (0,0), то
необходимо
сначала вычислить величины сдвига, а затем вызвать функцию iplRotate . Величину сдвигов можно вычислить с помощью специальной функции iplGetRotateShift , которая имеет следующий прототип:
void iplGetRotateShift(double xCenter, double yCenter, double angle, double* xShift, double* yShift);
где xCenter и yCenter координаты точки, вокруг которой осуществляется поворот, angle – угол поворота, а xShift и yShift – указатели на переменные, которым должны быть присвоены значения вычисленных необходимых сдвигов.
Для поворота изображения вокруг точки с произвольными координатами гораздо удобнее воспользоваться макроопределением iplRotateCenter , которое имеет следующий прототип:
void iplRotateCenter(IplImage* srcImage, IplImage* dstImage, double angle, double xCenter, double yCenter, int interpolate);
где xCenter и yCenter – координаты точки, вокруг которой будет осуществляться вращение. Результат поворота изображения вокруг его центра представлен на рисунке:
Рис. 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);
}
Рис. 4. Действие функции RotateImageCW
Функция для поворота на 90° против часовой стрелки RotateImageCСW может быть реализована аналогично. Аргументы angle , xShift и yShift должны иметь следующие значения: angle=-90 , xShift=img->height-1 и yShift=0 .
|