Android OpenCV: dibujo de partidos con feature2d
No puedo conseguir que esta función funcione. Básicamente estoy haciendo la detección de características y la correspondencia con una imagen de referencia. Quiero superponer las características emparejadas encima de mi imagen de entrada. Aquí está mi código:
public Mat startProcessing(Mat inputImage) { Imgproc.cvtColor(inputImage, rgb, Imgproc.COLOR_GRAY2RGB); myFeatures.detect(rgb, keypoints); descriptorExtractor.compute(inputImage, keypoints, imageDescriptors); descriptorMatcher.match(templateDescriptors, imageDescriptors, matches); Features2d.drawMatches(rgb, keypoints, templateImage, templateKeypoints, matches, rgb); Imgproc.cvtColor(rgb, outputImage, Imgproc.COLOR_RGB2RGBA); return outputImage; }
Es Features2d.drawMatches que es específicamente el problema. Según el error de Android que he conseguido, algunas dimensiones no están alineando. A decir verdad, ni siquiera estoy seguro de cómo drawMatches
se supone que funciona en Android, porque no hay documentación en cualquier lugar.
- Cómo integrar OpenCV en el proyecto Qt Creator Android
- OpenCv con Android Studio 2.2+ usando nuevo gradel con cmake - referencia indefinida
- Android, genera archivos de encabezado jni con javah, muestra error que no puede encontrar org.opencv.core.Mat
- Prueba de unidad de Android para la vista previa de la cámara?
- Reducción de la reflexión de luz OpenCV
Lo que quiero ser capaz de hacer es dibujar los partidos en la parte superior de la inputImage. He conseguido Feature2d.drawKeypoints
para trabajar, pero no estoy seguro de cómo haría para convertir MatOfDMatch matches
a un objeto MatOfKeypoint
. Además, ni siquiera estoy seguro de si así es como funciona el MatOfDMatch – ¿no tiene alguna asociatividad dentro de él correspondiente a los descriptores?
Lo siento por estar en todo el lugar, estoy teniendo un tiempo muy difícil usar OpenCV con Android. La documentación de C ++ por ahí es buena, pero hay poco en el camino de los materiales de Android. ¡Gracias por cualquier ayuda!
- ¿Cómo comprobar si dos imágenes son similares o no usando openCV en java?
- Cuenca en Opencv Android
- Detección de diferentes formas dinámicamente como (Círculo, cuadrado y Rectángulo) de la cámara?
- Conversión de NV21 a RGB mediante OpenCV en Android
- Detección de objetos Android OpenCV
- No se puede obtener el warpPerspective de OpenCV para trabajar en Android
- Android + OpenCV: Cómo configurar la resolución de la cámara cuando se utiliza CameraBridgeViewBase
- Cómo acceder a las filas y columnas de Vector <Mat> Imágenes en Open cv para Android?
La primera cosa que he notado es que usted está convirtiendo imágenes de un espacio de color a otro. Es un poco confuso. Si desea dibujar coincidencias en imágenes en escala de grises, no es necesario realizar esta conversión de imagen. Otra cosa, usted está detectando puntos clave en la imagen RGB y luego extraer los descriptores de la imagen original (como puedo ver es en escala de grises)
También le sugiero que compruebe dentro de su función si las imágenes son del mismo tipo. Simplemente imprima en el objeto inputImage
registro y vea si ambos son de tipo CV_8UC3
o equivalente. Básicamente su código debe ser como esto:
Mat imageOut = inputImage.clone(); Features2d.drawMatches(inputImage, keypoints, templateImage, templateKeypoints, matches, imageOut); Highgui.imwrite("result_match.jpeg", imageOut);
Respondiendo a otras preguntas:
P: No estoy seguro de cómo haría para convertir MatOfDMatch
coincidencias de MatOfDMatch
en un objeto MatOfKeypoint
. R: No es necesario hacerlo, porque la función MatOfKeypoint
recibe MatOfKeypoint
de imagen de entrada y también de imagen de plantilla. Luego, al pasar MatOfDMatch
, dibuja coincidencias entre los kypoints recibidos coincidentes.
P: Además, ni siquiera estoy seguro si es así como funciona el MatOfDMatch
– ¿no tiene alguna asociatividad dentro de él que corresponde a los descriptores? R: Sí lo ha hecho. Si va a hacer matches.toList(0).queryIdx
y matches.toList(0).trainIdx
obtendrá el índice del punto inputImage
de inputImage
, que coincide con el punto clave de templateImage
del primer partido.
- NotifyDataSetChanged () en Fragmento no está actualizando listview
- Arcgis: cómo obtener la ubicación del dispositivo