Rotación de imagen con opencv en android corta los bordes de una imagen

Posible duplicado:
Rotar cv :: Mat con cv :: warpAffine desvía la imagen de destino

¡El código abajo puede girar una imagen con éxito pero corta las esquinas de la imagen y gira en 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 girada

El fondo de la imagen girada más es negro pero quiero que sea transparente.

¿¿Estoy haciendo algo mal?? Gracias

EDITAR SOLUCIONADO

En primer lugar obtener nueva anchura / altura 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}; 

// crea un nuevo cuadro de tamaño (newWidth / newHeight)

 int pivotX = newWidthHeight[0]/2; int pivotY = newWidthHeight[1]/2; 

// imagen de agua en rotación

 org.opencv.core.Point center = new org.opencv.core.Point(pivotX, pivotY); Size targetSize = new Size(newWidthHeight[0], newWidthHeight[1]); 

// ahora creamos otro mat, para que podamos 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 filigrana

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

// tu resultadoMat con un aspecto como este NO CULTIVADO Imagen // BTW .. hay una diferencia enorme entre el enlace proporcionado y esta solución

One Solution collect form web for “Rotación de imagen con opencv en android corta los bordes de una imagen”

Acabo de leer la documentación: ImgProc.warpAffine

Sólo 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()); 

Con el fin de jugar con la transparencia, fiddle con el parámetro al final:

 Imgproc.warpAffine(cvImage, dummy, rotImage, dummy.size(), INTER_LINEAR, BORDER_TRANSPARENT); 
  • Android: gira el lienzo alrededor del centro de la pantalla
  • Saber cuándo se ha terminado la rotación usando setRequestedOrientation
  • Detectar algoritmo de giro de 360 ​​grados
  • ¿Cómo puedo detectar la rotación de la pantalla?
  • OCR (tesseract), rotación inteligente para la imagen
  • Cómo evitar que toda la pantalla de actividad de rotación en android
  • Imagen giratoria. Animación de la lista o rotación animada? (Androide)
  • ¿El sensor "Vector de Rotación de Juego" de Android ignora la rotación alrededor del eje vertical?
  • Rotación de 90 grados en la vista web de FrameLayout en Android
  • Cuando giro la imagen a 45 grados de superposición que sale de los límites en android
  • Android Mejor forma de evitar Diálogos para descartar después de una rotación del dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.