Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio opencv图像处理如何运行得更快?_Android Studio_Opencv3.0 - Fatal编程技术网

Android studio opencv图像处理如何运行得更快?

Android studio opencv图像处理如何运行得更快?,android-studio,opencv3.0,Android Studio,Opencv3.0,我正在使用OpenCV库开发android studio。我正在处理ColorBlobDetectionActivity类,所以我想重新加强它的处理。OpenCV处理所有屏幕,但我只想处理特定区域,以便在android摄像头上更快。有人能帮我吗 这里是ColorBlobDetectionActivity类代码: private boolean mIsColorSelected = false; private Mat mRgba; pr

我正在使用OpenCV库开发android studio。我正在处理ColorBlobDetectionActivity类,所以我想重新加强它的处理。OpenCV处理所有屏幕,但我只想处理特定区域,以便在android摄像头上更快。有人能帮我吗

这里是ColorBlobDetectionActivity类代码:

private boolean              mIsColorSelected = false;
private Mat                  mRgba;
private Scalar               mBlobColorRgba;
private Scalar               mBlobColorHsv;
private ColorBlobDetector    mDetector;
private Mat                  mSpectrum;
private Size                 SPECTRUM_SIZE;
private Scalar               CONTOUR_COLOR;

private CameraBridgeViewBase mOpenCvCameraView;

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(ColorBlobDetectionActivity.this);
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

public ColorBlobDetectionActivity() {
    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);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    setContentView(R.layout.color_blob_detection_surface_view);

    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_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();
    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

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

public void onCameraViewStarted(int width, int height) {
    mRgba = new Mat(height, width, CvType.CV_8UC4);
    mDetector = new ColorBlobDetector();
    mSpectrum = new Mat();
    mBlobColorRgba = new Scalar(255);
    mBlobColorHsv = new Scalar(255);
    SPECTRUM_SIZE = new Size(200, 64);
    CONTOUR_COLOR = new Scalar(255,0,0,255);
}

public void onCameraViewStopped() {
    mRgba.release();
}

public boolean onTouch(View v, MotionEvent event) {
    int cols = mRgba.cols();
    int rows = mRgba.rows();

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

    int x = (int)event.getX() - xOffset;
    int y = (int)event.getY() - yOffset;

    Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")");

    if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) return false;

    Rect touchedRect = new Rect();

    touchedRect.x = (x>4) ? x-4 : 0;
    touchedRect.y = (y>4) ? y-4 : 0;

    touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x;
    touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y;

    Mat touchedRegionRgba = mRgba.submat(touchedRect);

    Mat touchedRegionHsv = new Mat();
    Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL);

    // Calculate average color of touched region
    mBlobColorHsv = Core.sumElems(touchedRegionHsv);
    int pointCount = touchedRect.width*touchedRect.height;
    for (int i = 0; i < mBlobColorHsv.val.length; i++)
        mBlobColorHsv.val[i] /= pointCount;

    mBlobColorRgba = converScalarHsv2Rgba(mBlobColorHsv);

    Log.i(TAG, "Touched rgba color: (" + mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] +
            ", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3] + ")");

    mDetector.setHsvColor(mBlobColorHsv);

    Imgproc.resize(mDetector.getSpectrum(), mSpectrum, SPECTRUM_SIZE);

    mIsColorSelected = true;

    touchedRegionRgba.release();
    touchedRegionHsv.release();

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

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

    if (mIsColorSelected) {
        mDetector.process(mRgba);
        List<MatOfPoint> contours = mDetector.getContours();
        Log.e(TAG, "Contours count: " + contours.size());
        Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR);

        Mat colorLabel = mRgba.submat(4, 68, 4, 68);
        colorLabel.setTo(mBlobColorRgba);

        Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols());
        mSpectrum.copyTo(spectrumLabel);
    }

    return mRgba;
}

private Scalar converScalarHsv2Rgba(Scalar hsvColor) {
    Mat pointMatRgba = new Mat();
    Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor);
    Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4);

    return new Scalar(pointMatRgba.get(0, 0));
}
private boolean mIsColorSelected=false;
私人Mat mRgba;
私有标量mBlobColorRgba;
专用标量MBV-HSV;
专用ColorBlobDetector mDetector;
私有矩阵谱;
私有大小和频谱大小;
私有标量轮廓颜色;
私人摄像机BridgeViewBase mOpenCvCameraView;
专用BaseLoaderCallback mlLoaderCallback=新BaseLoaderCallback(此){
@凌驾
已连接管理器上的公共无效(int状态){
开关(状态){
案例加载程序CallbackInterface.SUCCESS:
{
Log.i(标记“OpenCV已成功加载”);
mOpenCvCameraView.enableView();
mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
}中断;
违约:
{
超级管理器已连接(状态);
}中断;
}
}
};
公共ColorBlobDetectionActivity(){
Log.i(标记“实例化新”+this.getClass());
}
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
Log.i(标记“calledoncreate”);
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().addFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开);
setContentView(R.layout.color\u blob\u detection\u surface\u view);
mOpenCvCameraView=(CameraBridgeViewBase)findViewById(R.id.color\u blob\u detection\u activity\u surface\u view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(本);
}
@凌驾
公共无效暂停()
{
super.onPause();
if(mOpenCvCameraView!=null)
mOpenCvCameraView.disableView();
}
@凌驾
恢复时公开作废()
{
super.onResume();
如果(!OpenCVLoader.initDebug()){
d(标记“找不到内部OpenCV库。使用OpenCV管理器进行初始化”);
initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0,this,mLoaderCallback);
}否则{
d(标记“在包中找到OpenCV库。正在使用它!”);
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
公共空间{
super.ondestory();
if(mOpenCvCameraView!=null)
mOpenCvCameraView.disableView();
}
开始时的公共空隙(整数宽度、整数高度){
mRgba=新垫(高度、宽度、CvType.CV_8UC4);
mDetector=新的ColorBlobDetector();
msspectrum=新的Mat();
mBlobColorRgba=新标量(255);
mBlobColorHsv=新标量(255);
光谱尺寸=新尺寸(200,64);
轮廓颜色=新标量(255,0,0255);
}
CAMERAVIEWSTOPPED()上的公共空白{
mRgba.release();
}
公共布尔onTouch(视图v,运动事件){
int cols=mRgba.cols();
int rows=mRgba.rows();
int xOffset=(mOpenCvCameraView.getWidth()-cols)/2;
int yOffset=(mOpenCvCameraView.getHeight()-rows)/2;
int x=(int)event.getX()-xOffset;
int y=(int)event.getY()-yOffset;
Log.i(标签,“触摸图像坐标:(“+x+”,“+y+”));
if((x<0)| |(y<0)| |(x>cols)| |(y>rows))返回false;
Rect touchedRect=new Rect();
touchedRect.x=(x>4)?x-4:0;
touchedRect.y=(y>4)?y-4:0;
touchedRect.width=(x+4

}

怎么做?告诉我如何优化?如何优化?告诉我如何优化?