如何在Android中同步两种方法?

时间:2014-02-23 03:29:52

标签: android opencv

我使用OpenCV的JavaCameraView来捕获图像。所以它有onCameraFrame方法。

    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
        rgb = inputFrame.rgba();
        if(viewMode == VIEW_MODE_EDGE){
            Mat  mIntermediateMat = new Mat(rgb.size(), rgb.type());
            Imgproc.Canny(rgb, mIntermediateMat, 80, 90);
            Imgproc.cvtColor(mIntermediateMat, rgb, Imgproc.COLOR_GRAY2BGRA, 4);
            mIntermediateMat.release();
        }

        return rgb;
    }

该方法始终在运行,我将传入的图像转换为Canny边缘并显示。

我实现了一个按钮来复制Canny图像并传递给另一个活动。为此,我创建了一个全局public static Mat Canny_image;按下按钮时rgb图片来自{ {1}}已复制到onCameraFrame。然后调用下一个活动。 我的代码是

Canny_image

问题:当我按下按钮并且如果在ImageCapture.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (mOpenCvCameraView != null) { Canny_image= rgb.clone(); } final Intent intent = new Intent(ctxt, TextExtraction.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); } }); 方法中完成了精确转换,我会收到精确图像(仅包含边缘的图像)。但如果它尚未转换或中途转换,我会收到原始rgb图像(原始rgb图像)或中途转换图像。如何确保我只收到精确图像并确保转换过程已完成,并在onCameraFrame中以Canny_image= rgb.clone();进行克隆 感谢

3 个答案:

答案 0 :(得分:1)

要在Android Java中同步两个方法,您可以使用synchronized(this)语法:

Public void OnFrameAvailable() {
    synchronized(this) {
        // Wair for condition false...
        // Flag condition true.
    }
}

Public void ProcessFrame() {
    synchronized(this) {
        // Wair for condition true...
        // Do something with incoming data...
        // Flag condition false
    }
}

这将确保两个方法在互斥中执行,尽管通常不是一个好主意进行回调等待...如果你完全想要解耦两者,你应该有一个线程进行处理,使用Looper,并从Runnable发布{} OnFrameAvailable()

答案 1 :(得分:0)

我对android没有任何了解,但只是一个建议..在获取Canny图像onCameraFrame方法之后,在另一个方法中设置标志(例如设置Flag = 1)是不可能的你检查了标志是否== 1的方法?

first()
{
   flag = 0;
   convert to canny;
   flag=1;
}

second()
{
    if(flag ==1)
        try to get the Canny image
}

如果不可能,请原谅我。)

答案 2 :(得分:0)

假设rgb是静态的,那么需要指出的一点是,这将是调用时的4通道Mat(如果你想要一个通道,请使用inputFrame.gray())。 Canny期待单个频道,就像调用CvColor一样,即COLOR_GRAY2BGRA转换类型。我不认为这会导致您的特殊问题,但值得一试。

由于onCameraFrame是一个回调你很可能在另一个调用进来时处理rgb所以rgb可能会在你在方法中返回之前被覆盖。在这方面添加同步到onCameraFrame方法应该会有所帮助,但这可能会影响性能。或者,在onCameraFrame上创建rgb local也应该避免这种特殊的并发问题。

最后一个想法是,当您单击按钮时,不是复制,当您在onCameraFrame中完成处理时,可以复制到Canny_image,因此它始终可用,onClick将采用当前版本。