2016-07-06 13 views
0

Ich staple mit diesem Problem für ein paar Tage. Ich möchte eine Android-App erstellen, die ein Bild aufnimmt und HOG-Funktionen dieses Bildes für die zukünftige Verarbeitung extrahiert. Das Problem ist, dass der folgende Code immer die HOG descriptors mit Rezo-Werten zurückgibt.Android Opencv Warum HOG-Deskriptoren immer Null sind?

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Log.i(TAG, "Saving a bitmap to file"); 
    // The camera preview was automatically stopped. Start it again. 
    mCamera.startPreview(); 
    mCamera.setPreviewCallback(this); 
    this.disableView(); 
    Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length); 
    myImage = new Mat(bitmapPicture.getWidth(), bitmapPicture.getHeight(), CvType.CV_8UC1); 
    Utils.bitmapToMat(bitmapPicture, myImage); 
    Bitmap bm = Bitmap.createBitmap(myImage.cols(), myImage.rows(),Bitmap.Config.ARGB_8888); 
    Utils.matToBitmap(myImage.clone(), bm); 
    // find the imageview and draw it! 
    ImageView iv = (ImageView) getRootView().findViewById(R.id.imageView); 
    this.setVisibility(SurfaceView.GONE); 
    iv.setVisibility(ImageView.VISIBLE); 

    Mat forHOGim = new Mat(); 
    org.opencv.core.Size sz = new org.opencv.core.Size(64,128); 
    Imgproc.resize(myImage, myImage, sz); 
    Imgproc.cvtColor(myImage,forHOGim,Imgproc.COLOR_RGB2GRAY); 
    //forHOGim = myImage.clone(); 
    MatOfFloat descriptors = new MatOfFloat(); //an empty vector of descriptors 
    org.opencv.core.Size winStride = new org.opencv.core.Size(64/2,128/2); //50% overlap in the sliding window 
    org.opencv.core.Size padding = new org.opencv.core.Size(0,0); //no padding around the image 
    MatOfPoint locations = new MatOfPoint(); ////an empty vector of locations, so perform full search 
    //HOGDescriptor hog = new HOGDescriptor(); 
    HOGDescriptor hog = new HOGDescriptor(sz,new org.opencv.core.Size(16,16),new org.opencv.core.Size(8,8),new org.opencv.core.Size(8,8),9); 
    Log.i(TAG,"Constructed"); 
    hog.compute(forHOGim , descriptors, new org.opencv.core.Size(16,16), padding, locations); 
    Log.i(TAG,"Computed"); 
    Log.i(TAG,String.valueOf(hog.getDescriptorSize())+" "+descriptors.size()); 
    Log.i(TAG,String.valueOf(descriptors.get(12,0)[0])); 
    double dd=0.0; 
    for (int i=0;i<3780;i++){ 
     if (descriptors.get(i,0)[0]!=dd) Log.i(TAG,"NOT ZERO"); 
    } 

    Bitmap bm2 = Bitmap.createBitmap(forHOGim.cols(), forHOGim.rows(),Bitmap.Config.ARGB_8888); 
    Utils.matToBitmap(forHOGim,bm2); 
    iv.setImageBitmap(bm2); 
} 

So in der logcat erhalte ich die Nachricht NOT ZERO nie. Das Problem ist, dass, was auch immer ich an diesem Code ändere ich habe immer Nullen in der descriptors MatOfFloat ... Und der seltsame Teil ist, wenn ich die HOGDescriptor hog = new HOGDescriptor(); auskommentieren und verwenden Sie diese anstelle der, die ich jetzt verwende, stürzt meine Anwendung ab. .. Der Rest des Codes läuft gut, das Bild wird immer genommen und auf meiner Bildansicht angezeigt, wie ich es erwarte.

Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

Antwort

1

Das Problem lag in der Bibliothek. Wenn ich denselben Code mit OpenCV 2.4.13 für Linux und nicht für Android ausführte, funktionierte der Code wie erwartet. Also hoffe ich, dass sie alle Probleme mit dem HOGDescriptor für OpenCV4Android beheben werden.