2013-06-02 17 views
2

首先我在Eclipse上做這個。如何在OpenCV for Android的Touch上在框架上繪製多個矩形?

1.我想畫一個接收Touch事件的矩形。 2.這個矩形應該是持久的,在另一個Touchevent上應該繪製另一個矩形。 3.我已經設法得到它持續一個單一的TouchEvent之後,它根據座標移動。 4.因此,基本上我應該有多個矩形,由於不同的觸摸事件。

我想通過遍歷數組... ,但我仍然感到困惑請幫助! 這一個不行...我要求改進... 謝謝!也體現和東西是適當的,權限是適當的! 代碼有點像:

package code.e14.balldetector; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.Point; 
import org.opencv.core.Scalar; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.WindowManager; 

public class MainActivity extends Activity implements CvCameraViewListener2, OnTouchListener { 
    private static final String TAG = "OCVBallTracker"; 

private CameraBridgeViewBase mOpenCvCameraView; 
private boolean    mIsJavaCamera = true; 
private Mat     mRgba; 
int i=0; 
private Double[] h=new Double[20]; 
private Double[] k=new Double[20]; 
private double x=0; 
private double y=0; 

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 
       mOpenCvCameraView.enableView(); 
       mOpenCvCameraView.setOnTouchListener(MainActivity.this); 
      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 
    } 
}; 

public MainActivity() { 
    Log.i(TAG, "Instantiated new " + this.getClass()); 
} 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "called onCreate"); 
    super.onCreate(savedInstanceState); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    setContentView(R.layout.activity_main); 
    if (mIsJavaCamera) 
     mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.java_surface_view); 
    else 
     mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.native_surface_view); 

    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 

    mOpenCvCameraView.setCvCameraViewListener(this); 


} 

@Override 
public void onPause() 
{ 
    super.onPause(); 
    if (mOpenCvCameraView != null) 
     mOpenCvCameraView.disableView(); 
} 

@Override 
public void onResume() 
{ 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this, mLoaderCallback); 
} 

public void onDestroy() { 
    super.onDestroy(); 
    if (mOpenCvCameraView != null) 
     mOpenCvCameraView.disableView(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    Log.i(TAG, "called onCreateOptionsMenu"); 


    return true; 
} 



public void onCameraViewStarted(int width, int height) { 
    mRgba = new Mat(height, width, CvType.CV_8UC4); 

} 

public void onCameraViewStopped() { 
    mRgba.release(); 
} 
@Override 
public boolean onTouch(View arg0,MotionEvent event) { 

    double cols = mRgba.cols(); 
    double rows = mRgba.rows(); 

    double xOffset = (mOpenCvCameraView.getWidth() - cols)/2; 
    double yOffset = (mOpenCvCameraView.getHeight() - rows)/2; 




    h[i] = (double)(event).getX() - xOffset; 
    k[i] = (double)(event).getY() - yOffset; 

    h[i]=x; 
    k[i]=y; 

    Log.i(TAG, "Touch image coordinates: (" + h[i] + ", " + k[i] + ")"); 


    i++; 





    return false;// don't need subsequent touch events 
} 
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    mRgba=inputFrame.rgba(); 





    Core.rectangle(mRgba, new Point(x-100,y-100),new Point(x+100,y+100),new Scalar(0, 0, 255),0,8, 0); 



    return mRgba; 
} 

}

回答

3

這是很容易的矩形存儲在列表中。我做了一些應該工作的小調整。

private List<Rect> ListOfRect = new ArrayList<Rect>(); 

@Override 
public boolean onTouch(View arg0,MotionEvent event) { 

    double cols = mRgba.cols(); 
    double rows = mRgba.rows(); 

    double xOffset = (mOpenCvCameraView.getWidth() - cols)/2; 
    double yOffset = (mOpenCvCameraView.getHeight() - rows)/2; 

    h[i] = (double)(event).getX() - xOffset; 
    k[i] = (double)(event).getY() - yOffset; 

h[i]=x; 
k[i]=y; 

ListOfRect.add(new Rect(x-100, y-100, x+100, y+100)); 

Log.i(TAG, "Touch image coordinates: (" + h[i] + ", " + k[i] + ")"); 

i++; 

return false;// don't need subsequent touch events 
} 

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    mRgba=inputFrame.rgba(); 

    for(int i=0; i<ListOfRect.size(); i++){ 
     Core.rectangle(mRgba, ListOfRect.get(i).tl(), ListOfRect.get(i).br(),new Scalar(0, 0, 255),0,8, 0);} 

    return mRgba; 
} 

但是請記住,你需要釋放和清除列表來釋放內存,當你不需要的矩形了。我希望它有幫助。

+0

我在你回答之前就明白了!反正努力的人! – Boggartfly