tutorial - reconocimiento facial android studio opencv
rotación de imagen con opencv en android corta los bordes de una imagen (1)
Acabo de leer la documentación: ImgProc.warpAffine
Solo un extracto:
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, [...]);
//Parameters: dsize – Size of the destination image.
Por favor intenta lo siguiente:
Imgproc.warpAffine(cvImage, dummy, rotImage, dummy.size());
Para jugar con la transparencia, juega con el parámetro al final:
Imgproc.warpAffine(cvImage, dummy, rotImage, dummy.size(), INTER_LINEAR, BORDER_TRANSPARENT);
Posible duplicado:
Gire cv :: Mat utilizando la imagen de destino cv :: warpAffine Offsets
¡El siguiente código puede rotar una imagen con éxito pero corta las esquinas de la imagen y gira en la dirección incorrecta!
Mat cvImage = Highgui.imread("mnt/sdcard/canvasgrid.png");
int degrees = 20;
Point center = new Point(cvImage.cols()/2, cvImage.rows()/2);
Mat rotImage = Imgproc.getRotationMatrix2D(center, degrees, 1.0);
Mat dummy = cvWaterImage;
Imgproc.warpAffine(cvImage, dummy, rotImage, cvImage.size());
rotatedImage = dummy;
Highgui.imwrite("mnt/sdcard/imageRotate.png",rotatedImage);
MÁS el fondo de la imagen girada es negro, pero quiero que sea transparente.
¿¿Estoy haciendo algo mal?? Gracias
EDITAR SOLUCIONADO
en primer lugar, obtener nuevo ancho / alto de la imagen girada
double radians = Math.toRadians(rotationAngle);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
int newWidth = (int) (scaledImage.width() * cos + scaledImage.height() * sin);
int newHeight = (int) (scaledImage.width() * sin + scaledImage.height() * cos);
int[] newWidthHeight = {newWidth, newHeight};
// crear un nuevo cuadro de tamaño (newWidth / newHeight)
int pivotX = newWidthHeight[0]/2;
int pivotY = newWidthHeight[1]/2;
// imagen de agua rotando
org.opencv.core.Point center = new org.opencv.core.Point(pivotX, pivotY);
Size targetSize = new Size(newWidthHeight[0], newWidthHeight[1]);
// ahora creamos otro tapete, entonces podemos usarlo para mapear
Mat targetMat = new Mat(targetSize, scaledImage.type());
int offsetX = (newWidthHeight[0] - scaledImage.width()) / 2;
int offsetY = (newWidthHeight[1] - scaledImage.height()) / 2;
// Centralización de marca de agua
Mat waterSubmat = targetMat.submat(offsetY, offsetY + scaledImage.height(), offsetX, offsetX + scaledImage.width());
scaledImage.copyTo(waterSubmat);
Mat rotImage = Imgproc.getRotationMatrix2D(center, waterMarkAngle, 1.0);
Mat resultMat = new Mat(); // CUBIC
Imgproc.warpAffine(targetMat, resultMat, rotImage, targetSize, Imgproc.INTER_LINEAR, Imgproc.BORDER_CONSTANT, colorScalar);
// su resultMat con este aspecto NO CORTADO Image // BTW ... hay una gran diferencia entre el enlace proporcionado y esta solución