При использовании iplGetRotateShift вам необходимо указать центр поворота в исходном изображении. Это будет хорошо работать, если размер исходного и конечного изображения одинаков.
В вашем случае требуется дополнительный сдвиг для центрирования изображения на целевом изображении:
xShift = (dw - w) / 2.0;
yShift = (dh - h) / 2.0;
Чтобы объединить две смены, вам нужно использовать ippiAddRotateShift вместо ippiGetRotateShift.
Примечание : Эти функции относятся к библиотеке 5.3 IPP (версия, которая у меня есть). Я не уверен, что AddRotateShift доступен в IPL. Но вы упомянули в вопросе, что вы пытались сделать то же самое с использованием IPP, так что, надеюсь, вы можете использовать IPP вместо IPL.
Вы получаете что-то вроде этого
xShift = (dw - w) / 2.0;
yShift = (dh - h) / 2.0;
ippiAddRotateShift(w / 2.0, h / 2.0, angle, &xShift, &yShift);
Если вы используете эти сдвиги в вызове ippiRotate, изображение должно быть центрировано на целевом изображении.
Надеюсь, это поможет.
EDIT:
Вот код, который я использовал для проверки (изменение с w на dw и h на dh и угол поворота является случайным):
//Ipp8u* dst_p; Initialized somewhere else in the code
//Ipp8u* src_p; Initialized somewhere else in the code
int w = 1032;
int h = 778;
int dw = w - 40; // -40 is just a random change
int dh = h + 200; // 200 is just a random change
int src_step = w * 3;
int dst_step = dw * 3;
IppiSize src_size = { w, h };
IppiRect src_roi = { 0, 0, w, h };
IppiRect dst_rect = { 0, 0, dw, dh };
double xShift = ((double)dw - (double)w) / 2.0;
double yShift = ((double)dh - (double)h) / 2.0;
ippiAddRotateShift((double)w / 2, (double)h / 2, 37.0, &xShift, &yShift);
ippiRotate_8u_C3R(src_p, src_size, src_step, src_roi,
dst_p, dst_step, dst_rect, 37.0, xShift, yShift, IPPI_INTER_NN);