OpenCV(Android) - 删除绘制的轮廓

时间:2017-01-31 14:04:27

标签: android opencv java-threads

应用程序检测框架上的特定颜色并使用OpenCV绘制轮廓。当单击捕获按钮时,帧图像将用于进行一些图像处理,而绘制的轮廓也是用帧捕获的,这不是我想要的。 我的问题是如何删除单击捕获按钮时绘制的轮廓。或者是否有任何方法可以在没有绘制轮廓的情况下获取框架?

我尝试的方法:

  1. 锁定onCapture()直到调用onCameraFrame并返回mRbg 在调用drawContour()之前。
  2. 将mRgba克隆到新Mat并使用新Mat作为subColor的参数
  3. 但他们两个都没有用。

    我正在考虑暂停onCapture(),直到onCameraFrame被调用并多次跳过绘制轮廓线以确保框架上没有绘制任何内容。但我不知道如何处理两个synchronized()。

    public boolean onTouch(View v, MotionEvent event) {
        lock = true;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            //do something
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            //do something
            //↓to make sure onCameraFrame is pause before the finger left the screen
            lock = false;
            synchronized (locker) { locker.notify(); }
        }
    
        return true;
    } 
    
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        //Pause until onTouch() is done
        commandLocker();
    
        //Detect the contour
        mDetector.setHsvColor(txtHsv);
        if (area) {
            nRgba = mRgba.submat(ey, sy, sx, ex);
            mDetector.process(nRgba);
        } else {
            mDetector.process(mRgba);
        }
    
        //Skip this when onCapture is called
        //Draw the contour on the frame
        if (!capture) {
            List<MatOfPoint> contours = mDetector.getContours();
            if (nRgba != null && area) {
                Imgproc.rectangle(mRgba, new Point(sx, sy), new Point(ex, ey), areaColor, 3);
                Imgproc.drawContours(nRgba, contours, -1, contourColor);
            } else
                Imgproc.drawContours(mRgba, contours, -1, contourColor);
        }
    
        return mRgba;
    }
    
    public void onCapture(View view) throws IOException {
        capture = true;
        //Pause until onCameraFrame() done
        if (!area)
            subColor(mRgba);
        else
            subColor(nRgba);
    }
    
    public void subColor (Mat src) throws IOException {
        //do something
    }
    
    private void commandLocker() {
        synchronized (locker) {
            while (lock) {
                try {
                    locker.wait();
                } catch (InterruptedException e) {
                    Log.e("Exception", "InterruptedException");
                }
            }
        }
    }
    

    Frame captured without processing Processed image

1 个答案:

答案 0 :(得分:0)

onCameraFrame(CvCameraViewFrame inputFrame)函数中,如果条件:

if (nRgba != null)

不满意,您可以通过mRgba

覆盖原始席Imgproc.drawContours(mRgba, contours, -1, contourColor);

这是你的问题吗?