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.
- OpenCV para Android: Referencia directa ilícita
- ¿Quieres encontrar la longitud focal primero entonces la distancia de la cara detectada en tiempo real utilizando opencv android
- Codificación de vídeo en Android mediante cv :: Mat y MediaCodec
- Cómo forzar una cámara de Android a mostrar en modo vertical, o para que yo haga la rotación en su lugar
- Convertir Mat a Bitmap Opencv para Android
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
- ¿Por qué OpenCV Manager y neon necesitan en android?
- OpenCv con Android Studio 2.2+ usando nuevo gradel con cmake - referencia indefinida
- Buscando OpenCV android tutorial
- Detección de rostros en Android?
- Cómo convertir imágenes en vídeo en android con javacv?
- ¿Cómo utilizar OpenCV + Tesseract para el reconocimiento de texto exacto en Android?
- No se puede reanudar la actividad en orden aleatorio
- Android convierte matriz de bytes de la API de cámara para colorear objeto Mat openCV
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; }
- No se pueden leer archivos de imagen de sdcard en el teléfono: android
- Android 2.3 tiene menor presupuesto de VM que 2,1 y 2,2?