usar tutorial studio reconocimiento objetos imagenes fuente facial español detectar codigo camara android image opencv rotation

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);

imagen original

imagen rotada

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