2016-07-06 7 views
0

私は数日間この問題をスタックしています。私は画像を撮るアンドロイドアプリを作り、その画像のHOG特徴を将来の処理のために抽出したい。問題は、以下のコードは常にのrezo値を返すことです。Android OpencvなぜHOG記述子は常にゼロですか?

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

したがってlogcatでは、私はNOT ZEROメッセージを受け取ることはありません。問題は、私がこのコードに行った変更が何であれ、私は常にdescriptors MatOfFloat ...とHOGDescriptor hog = new HOGDescriptor();のコメントを外して、私が今使っているものの代わりにその1つを使用すれば、アプリケーションがクラッシュするということです。 .. 残りのコードはうまく動作し、画像はいつも撮られ、私の予想どおりに私の画像ビューに表示されます。

ご協力いただければ幸いです。 ありがとうございます。

答えて

1

問題はライブラリ内にありました。 Linux用のOpenCV 2.4.13で、Android用ではない同じコードを実行したとき、コードは期待どおりにうまくいった。 OpenCV4AndroidのHOGDescriptorに関する問題を修正することを願っています。

関連する問題