Gire VideoCapture en OpenCV en Android

Cómo girar la cámara cuando se utiliza la clase VideoCapture en OpenCV? (Detección de la cara de la muestra en Android). Estoy rotando el lienzo con:

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { Matrix matrix = new Matrix(); matrix.preTranslate( (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2); matrix.postRotate(270f, (canvas.getWidth()) / 2, (canvas.getHeight()) / 2); canvas.drawBitmap(bmp, matrix, null); } 

Pero la imagen de la cámara no gira: Face Detect dont work.

La cámara recibe el flujo de los siguientes:

 protected Bitmap processFrame(VideoCapture capture) { capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

ACTUALIZACIÓN Hice lo siguiente:

 @Override protected Bitmap processFrame(VideoCapture capture) { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { Core.flip(mRgba.t(), mRgba, 0); } else { } capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); capture.retrieve(mDetect_thread.mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

Pero no es trabajo. Cuando ejecuto el programa en la orientación de portret (en el dispositivo android) – el programa no se inicia Cuando ejecuto el programa en la orientación horizontal – el trabajo del programa, pero cuando la rotación del dispositivo, el trabajo del programa, pero la imagen en la pantalla no la rotación

Su pregunta es sobre todo un duplicado de esto , excepto que usted está buscando la versión de Android. Es bastante similar, pero aquí está, se puede obtener una rotación de 90º trasladando y volteando la imagen:

 # rotate 90º counter-clockwise Core.flip(mRgba.t(), mRgba, 0); //mRgba.t() is the transpose # rotate 90º clockwise Core.flip(mRgba.t(), mRgba, 1); 

Para otras rotaciones puede utilizar warpAffine :

 Point center = new Point(x,y); double angle = 90; double scale = 1.0; Mat mapMatrix = Imgproc.getRotationMatrix2D(center, angle, scale); Imgproc.warpAffine(srcMat, dstMat, mapMatrix, Imgproc.INTER_LINEAR); 

EDIT – ejemplos más completos siguen:

  /** * Image is first resized-to-fit the dst Mat and then rotated. * mRgba is the source image, mIntermediateMat should have the same type. */ private void rotationTutorial(){ double ratio = mRgba.height() / (double) mRgba.width(); int rotatedHeight = mRgba.height(); int rotatedWidth = (int) Math.round(mRgba.height() * ratio); Imgproc.resize(mRgba, mIntermediateMat, new Size(rotatedHeight, rotatedWidth)); Core.flip(mIntermediateMat.t(), mIntermediateMat, 0); Mat ROI = mRgba.submat(0, mIntermediateMat.rows(), 0, mIntermediateMat.cols()); mIntermediateMat.copyTo(ROI); } /** * Image is rotated - cropped-to-fit dst Mat. * */ private void rotationAffineTutorial(){ // assuming source image's with and height are a pair value: int centerX = Math.round(mRgba.width()/2); int centerY = Math.round(mRgba.height()/2); Point center = new Point(centerY,centerX); double angle = 90; double scale = 1.0; double ratio = mRgba.height() / (double) mRgba.width(); int rotatedHeight = (int) Math.round(mRgba.height()); int rotatedWidth = (int) Math.round(mRgba.height() * ratio); Mat mapMatrix = Imgproc.getRotationMatrix2D(center, angle, scale); Size rotatedSize = new Size(rotatedWidth, rotatedHeight); mIntermediateMat = new Mat(rotatedSize, mRgba.type()); Imgproc.warpAffine(mRgba, mIntermediateMat, mapMatrix, mIntermediateMat.size(), Imgproc.INTER_LINEAR); Mat ROI = mRgba.submat(0, mIntermediateMat.rows(), 0, mIntermediateMat.cols()); mIntermediateMat.copyTo(ROI); } 

Nota:

  • Estos ejemplos pueden ser orientativos específicos, los hice para la orientación horizontal.
  • No debe llamar al código de estos ejemplos para cada marco de vídeo. Parte del código sólo se debe ejecutar una vez.

Si sólo necesita hacer 90, 180, o 270 grados de rotación (que parece ser su caso) es mejor utilizar Core.flip () que es más rápido. Aquí debajo un método que lo hace para usted:

 public static Mat rotate(Mat src, double angle) { Mat dst = new Mat(); if(angle == 180 || angle == -180) { Core.flip(src, dst, -1); } else if(angle == 90 || angle == -270) { Core.flip(src.t(), dst, 1); } else if(angle == 270 || angle == -90) { Core.flip(src.t(), dst, 0); } return dst; } 
  • Compilación de OpenCV en Android NDK
  • Ejecutar código nativo en segundo plano
  • SURF Feature Extraction con Android OpenCV SDK - Obtener algunos errores
  • Utils.bitmapToMat bloqueo de la aplicación
  • OpenCV instalador independiente opencv
  • Error: Programa "/ NDK-build" no se encuentra en PATH
  • OpenCV Android Library Errores después de la instalación
  • Pasar una matriz de Mats a código nativo
  • Animar la imagen de la cara - usando deformación?
  • Cómo abrir la cámara en modo retrato utilizando OpenCV en la aplicación Android
  • Cómo obtener Mat con una entrada drawable en Android usando OpenCV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.