Привет всем!
Есть, значит, у меня картинка и матрица аффинных преобразований для неё. Нужно исказить картинку и обрезать под требуемый размер. Сейчас это делается так:
result = cv2.warpAffine(img, affine_matrix, (target_w, target_h), borderValue=0.0)
grid = mx.ndarray.GridGenerator(data=affine_matrix, transform_type='affine', target_shape=(original_h, original_w))
img_nchw = mx.ndarray.array(img)
img_nchw = img_nchw.transpose((2, 0, 1))
img_nchw = mx.ndarray.expand_dims(img_nchw, 0)
result = mx.ndarray.BilinearSampler(img_nchw, grid)
Но есть большая проблема: GridGenerator надо передавать совсем не такую матрицу, как в warpAffine. Некоторые элементы матрицы достаточно понятно преобразуются в вид для GridGenerator. Например, в warpAffine увеличение в два раза задаётся как 2, а для GridGenerator - 0.5. Это работает, если задавать только данные элементы, без искажений. А вот с коэффициентами для искажений не понятно совсем, подобрать их не получается.
Может быть кому-то попадалась внятная документация по mx.ndarray.GridGenerator с примерами?
P.S.: Да, можно найти другие варианты, вместо MXNet для издевательств над картинками силами GPU. Но не хочется увеличивать количество зависимостей. Кроме того, MXNet используется много для чего и важно сохранить контекст размещения данных, т.е. чтобы массивы не надо было пересоздавать.