2013-03-11 34 views
4

此工作的目的是从视频场景中的现有图像中提取实时关键点processFrame由于匹配而执行不起作用 是我可以在实时使用FAST检测器实时识别Android上的物体

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; 
    } 
} 

,并在日志

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())在函数void CV :: drawMatches(常量CV ::垫&,常量性病::矢量&,常量CV ::垫&,常量性病::矢量&,常量性病: :矢量&,CV ::垫&,const的标量&,const的标量&,常量的std ::矢量&,INT)

回答

2

这个职位是有点老了,但我给出一个答案呢。

您的drawMatches函数的前四个参数不正确。前两个和后两个是一样的。
您可以从(mGraySubmat,mKeyPoints,mGraySubmat,mKeyPoints,...)更改drawMatches的前四个参数;

       (mGraySubmat,mKeyPoints,img1,keypoints,...);

       (img1,keypoints,mGraySubmat,mKeyPoints,...);
使用正在为您工作的那一个。


对于其他的读者,如果他们有他们可以尝试与第二两个参数来改变前两个参数相同的问题。
例如:
       (image1,keypointsImage1,image2,keypointsImage2,...);

       (image2,keypointsImage2,image1,keypointsImage1,...);

对我来说,它解决了我的错误。