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:
- Eclipse da error al usar GaussianBlur con OpenCV para Android
- Android "No hay tal archivo o directorio" error?
- Descripción de SURF más rápido con la detección de FAST?
- Cómo obtener Mat con una entrada drawable en Android usando OpenCV
- Cuenca en Opencv Android
@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)
- ¿Cómo obtener el nivel de Compensación de exposición de la cámara del teléfono Android, a través de Java, cuando se toma la foto?
- Aplicación de Android que utiliza tecnología de reconocimiento de imagen
- Integración de dependencias de Android Studio y Gradle
- OpenCV2.4 con la actividad de Android Native
- Cortar la imagen después de seleccionar el área mediante la detección de bordes en android
- cverror android assertion failed (scn == 3) Android
- Máximo agarre de la cámara y rendimiento de la pantalla
- Decodificación de flujo de vídeo en Android de DJI drone
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.
- Error al importar jar en un proyecto android
- Android: agregar botones a un diseño existente mediante programación