Reconocimiento de objetos en tiempo real en Android con detector FAST

El objetivo de este trabajo es extraer los puntos clave en tiempo real de una imagen existente en una escena de video. ProcessFrame tiene la ejecución que no funciona, debido a coincidencia, es que sólo puedo mostrar los puntos clave de correspondencia en forma de círculos En la imagen en tiempo real

class Sample1View extends SampleViewBase { public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_BLUE = 1; public static final int VIEW_MODE_YELLOW = 2; public static final int VIEW_MODE_DE = 3; private Mat mYuv; private Mat mRgba; private Mat mGraySubmat; private Mat mResult; private Mat mIntermediateMat; private Bitmap mBitmap; private int mViewMode; private Mat mColor; private Mat mHsv; TimingLogger timings; private Mat img1; private Mat descriptors; private MatOfKeyPoint keypoints; private FeatureDetector detector; private DescriptorExtractor descriptor; private DescriptorMatcher matcher; private static final String TAG ="Sample::View"; public Sample1View(Context context) { super(context); mViewMode = VIEW_MODE_RGBA; try { img1=Utils.loadResource(getContext(), R.drawable.wings); } catch (IOException e) { // TODO Auto-generated catch block Log.w("Activity::LoadResource","Unable to load resource R.drawable.wings"); e.printStackTrace(); } descriptors = new Mat(); keypoints = new MatOfKeyPoint(); detector = FeatureDetector.create(FeatureDetector.FAST); detector.detect(img1, keypoints); descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); descriptor.compute(img1, keypoints, descriptors); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); } @Override protected void onPreviewStarted(int previewWidth, int previewHeight) { Log.i(TAG, "preview Started"); synchronized (this) { mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1); mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth()); mRgba = new Mat(); mIntermediateMat = new Mat(); mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); mHsv = new Mat(); mColor = new Mat(); mResult = new Mat(); } } @Override protected void onPreviewStopped() { Log.i(TAG, "preview Stopped"); if(mBitmap != null) { mBitmap.recycle(); } synchronized (this) { // Explicitly deallocate Mats if (mYuv != null) mYuv.release(); if (mRgba != null) mRgba.release(); if (mGraySubmat != null) mGraySubmat.release(); if (mIntermediateMat != null) mIntermediateMat.release(); mYuv = null; mRgba = null; mGraySubmat = null; mIntermediateMat = null; if (mResult != null) mResult.release(); if (mHsv != null) mHsv.release(); if (mColor != null) mColor.release(); mColor = null; mResult = null; mHsv = null; } } 

// cvt_YUVtoRGBtoHSV:

  @Override protected Bitmap processFrame(byte[] data) { mYuv.put(0, 0, data); final int viewMode = mViewMode; ColorDetection.cvt_YUVtoRGBtoHSV(mYuv,mGraySubmat); MatOfKeyPoint mKeyPoints = new MatOfKeyPoint(); MatOfDMatch matches = new MatOfDMatch(); detector.detect(mGraySubmat, mKeyPoints); descriptor.compute(mGraySubmat, mKeyPoints, mIntermediateMat); matcher.match(mIntermediateMat, descriptors, matches); mIntermediateMat2.create(resultSize, CvType.CV_8UC1); Features2d.drawMatches(mGraySubmat, mKeyPoints, mGraySubmat, mKeyPoints, matches, mIntermediateMat2); Imgproc.resize(mIntermediateMat2, mIntermediateMat2, mRgba.size()); Imgproc.cvtColor(mIntermediateMat2, mRgba, Imgproc.COLOR_RGBA2BGRA, 4); break; } Bitmap bmp = mBitmap; try { Utils.matToBitmap(mRgba, bmp); } catch(Exception e) { Log.e("org.opencv.samples.*", "Utils.matToBitmap() throws an exception: " + e.getMessage()); bmp.recycle(); bmp = null; } return bmp; } public void setViewMode(int viewMode) { mViewMode = viewMode; } } 

Y que en el Log

CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/features2d/src/draw.cpp:207: error: (-215) i1> = 0 && i1 < Static_cast (keypoints1.size ()) en la función void cv :: drawMatches (const cv :: Mat &, const std :: vector &, const cv :: Mat &, const std :: vector &, const std :: vector &, cv :: Mat & , Const Escalar &, const Escalar &, const std :: vector &, int)

Este post es un poco viejo pero le doy una respuesta todavía.

El primer parámetro de su función drawMatches es incorrecto. Los dos primeros y los segundos dos son iguales.
Puede cambiar los primeros cuatro parámetros de drawMatches de (mGraySubmat, mKeyPoints, mGraySubmat, mKeyPoints, …);
a
(MGraySubmat, mKeyPoints, img1, keypoints, …);
o
(Img1, puntos clave, mGraySubmat, mKeyPoints, …);
Utilice el que está trabajando para usted.

Para otros lectores si tienen el mismo problema pueden intentar cambiar los dos primeros parámetros con los segundos dos parámetros.
Ex.:
(Image1, keypointsImage1, image2, keypointsImage2, …);
a
(Image2, keypointsImage2, image1, keypointsImage1, …);

Para mí es arreglado mi error.

  • SIGNAL 11 SIGSEGV código = 2 crash Android
  • Opencv C + + crear objeto Mat de android NV21 buffer de datos de imagen
  • Cómo encontrar las esquinas de un objeto Rect en openCV?
  • Detección de diferentes formas dinámicamente como (Círculo, cuadrado y Rectángulo) de la cámara?
  • Reducción de la reflexión de luz OpenCV
  • Creación de un paquete de biblioteca de Android que incluye un paquete externo (nativo o Java)
  • Android y OpenCV: Homography to Camera Pose considerando la cámara intrínseca y la retroproyección
  • Características de OpenCV ORB
  • Reconocimiento de rostro inestable con OpenCV
  • Referencia indefinida a 'cv :: initModule_nonfree ()' En Android
  • La aplicación se estrelló después de la señal fatal 11 (SIGSEGV) en 0x00000020 (código = 1) - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.