OpenCV4android detecta forma y color (HSV)

Soy un principiante en openCV4android y me gustaría obtener ayuda si es posible. Estoy tratando de detectar triángulos de color, cuadrados o círculos con mi cámara de teléfono Android, pero no sé por dónde empezar. He estado leyendo OReilly Learning OpenCV libro y tengo algunos conocimientos sobre OpenCV.

Esto es lo que quiero hacer:

1- Obtener el color de seguimiento (sólo el color HSV) del objeto tocando la pantalla – ya lo he hecho usando el ejemplo de blob de color del ejemplo de OpenCV4android

2- Encuentre en la cámara formas como triángulos, cuadrados o círculos basados ​​en el color elegido antes.

Acabo de encontrar ejemplos de encontrar formas dentro de una imagen. Lo que me gustaría hacer es encontrar el uso de la cámara en tiempo real.

Cualquier ayuda sería apreciada.

Un saludo y un buen día.

Si va a implementar NDK para su material opencv, entonces puede usar la misma idea que está usando en OpenCV tutorial 2-Mixedprocessing.

// on camera frames call your native method public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); Nativecleshpdetect(mRgba.getNativeObjAddr()); // native method call to perform color and object detection // the method getNativeObjAddr gets the address of the Mat object(camera frame) and passes it to native side as long object so that you dont have to create and destroy Mat object on each frame } public native void Nativecleshpdetect(long matAddrRgba); 

En el lado nativo

 JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_Nativecleshpdetect(JNIEnv*, jobject,jlong addrRgba1) { Mat& mRgb1 = *(Mat*)addrRgba1; // mRgb1 is a mat object which points to the address of the input camera frame, so all the manipulations you do here will reflect on the live camera frame //once you have your mat object(ie mRgb1 ) you can implement all the colour and shape detection algorithm you have learnt in opencv book } 

Ya que todas las manipulaciones se hacen con punteros que tiene que ser poco cuidado de manipulación. espero que esto ayude

¿Por qué no hacer uso de JavaCV creo que es una mejor alternativa .. no tienes que usar el NDK en absoluto para esto ..

Prueba esto: http://code.google.com/p/javacv/

Si comprueba el tutorial de Back Projection de OpenCV, hace lo que está buscando (y un poco más).

Retroproyección:

"En términos estadísticos, los valores almacenados en la matriz BackProjection representan la probabilidad de que un píxel en una imagen pertenezca a la región con el color seleccionado".

He convertido ese tutorial a OpenCV4Android (2.4.8) como si estuvieras buscando, no usa Android NDK. Puedes ver todo el código aquí en Github .

También puede comprobar esta respuesta para obtener más detalles.

Aunque es un poco tarde me gustaría hacer una contribución a la pregunta.

1- Obtener el color de seguimiento (sólo el color HSV) del objeto tocando la pantalla – ya lo he hecho usando el ejemplo de blob de color del ejemplo de OpenCV4android

Implementa OnTouchListener en tu actividad

Función onTouch

 int cols = mRgba.cols(); int rows = mRgba.rows(); int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2; int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2; int x = (int) event.getX() - xOffset; int y = (int) event.getY() - yOffset; Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")"); if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) return false; Rect touchedRect = new Rect(); touchedRect.x = (x > 4) ? x - 4 : 0; touchedRect.y = (y > 4) ? y - 4 : 0; touchedRect.width = (x + 4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x; touchedRect.height = (y + 4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y; Mat touchedRegionRgba = mRgba.submat(touchedRect); Mat touchedRegionHsv = new Mat(); Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL); // Calculate average color of touched region mBlobColorHsv = Core.sumElems(touchedRegionHsv); int pointCount = touchedRect.width * touchedRect.height; for (int i = 0; i < mBlobColorHsv.val.length; i++) mBlobColorHsv.val[i] /= pointCount; mBlobColorRgba = converScalarHsv2Rgba(mBlobColorHsv); mColor = mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] + ", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3]; Log.i(TAG, "Touched rgba color: (" + mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] + ", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3] + ")"); 

MRGBA es un objeto mat que se inició en onCameraViewStarted como

MRgba = Mat nuevo (altura, ancho, CvType.CV_8UC4);

Y para la segunda parte:

2- Encuentre en la cámara formas como triángulos, cuadrados o círculos basados ​​en el color elegido antes.

He intentado averiguar la forma de los contornos seleccionados usando approxPolyDP

 MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(0).toArray()); //Processing on mMOP2f1 which is in type MatOfPoint2f double approxDistance = Imgproc.arcLength(contour2f, true) * 0.02; Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true); //Convert back to MatOfPoint MatOfPoint points = new MatOfPoint(approxCurve.toArray()); System.out.println("points length" + points.toArray().length); if( points.toArray().length == 5) { System.out.println("Pentagon"); mShape = "Pentagon"; } else if(points.toArray().length > 5) { System.out.println("Circle"); Imgproc.drawContours(mRgba, contours, 0, new Scalar(255, 255, 0, -1)); mShape = "Circle"; } else if(points.toArray().length == 4) { System.out.println("Square"); mShape = "Square"; } else if(points.toArray().length == 4) { System.out.println("Triangle"); mShape = "Triangle"; } 

Esto se hizo en la función onCameraFrame después de obtener la lista de contornos

Para mí si la longitud de la matriz del punto era más de 5 era generalmente un círculo. Pero hay otro algoritmo para obtener el círculo y sus atributos.

  • Cómo agregar punto a MatOfPoint2f?
  • No se encontró el paquete de la biblioteca OpenCV
  • Eclipse - Método NewStringUTF () no se pudo resolver
  • construye fuentes openCV nativas con Android Studio y NDK
  • cverror android assertion failed (scn == 3) Android
  • ¿Cómo utilizar Java con NDK Android?
  • Android Studio enlaza las bibliotecas estáticas de OpenCV
  • Opencv manager package no se ha encontrado ?? Cómo instalar automáticamente?
  • Opencv aumenta la precisión del umbral
  • Reducción de la reflexión de luz OpenCV
  • Cómo detectar los bordes largos de la pared para preparar la máscara y recolorar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.