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

如何在Android中同步两种方法?,android,opencv,Android,Opencv,我使用OpenCV的JavaCameraView来捕获图像。因此它有onCameraFrame方法 @Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) { rgb = inputFrame.rgba(); if(viewMode == VIEW_MODE_EDGE){ Mat mIntermediateMat = new Mat(rgb.siz

我使用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 edge并显示

我实现了一个按钮来复制那个精明的图像并传递给另一个活动。为此,我制作了一个全球
公共静态Mat Canny_图像
当按下按钮时,来自
onCameraFrame
rgb
图像被复制到
Canny\u图像
。然后调用下一个活动。 我的代码是

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); 
            }                             
        });
问题:当我按下按钮时,如果在
onCameraFrame
方法中完成canny转换,我会收到canny图像(只有边缘的图像)。但若它还并没有转换或转换了一半,我会收到原始rgb图像(原始rgb图像)或转换了一半的图像。如何确保只接收canny图像,并确保转换过程已完成,并以
canny_image=rgb.clone()的方式进行克隆
ImageCapture.setOnClickListener(新的OnClickListener(){};

谢谢

我对android没有任何了解,只是一个建议..在获得Canny image
onCameraFrame
方法后,您不可能设置一个标志(例如设置标志=1),在另一个方法中,您检查标志是否=1

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

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

如果不可能,请原谅:)

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

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


这将确保这两个方法都以互斥方式执行,尽管通常让回调等待不是一个好主意。。。如果您完全想将两者解耦,那么您应该有一个线程用于处理,带有一个活套,并从
OnFrameAvailable()
Runnable
post()从
OnFrameAvailable()发送到它。假设rgb是一个静态的,那么需要指出的一点是,调用时这将是4通道Mat(如果您想要一个通道,请使用inputFrame.gray()。Canny希望有一个单一的通道,就像调用CvColor viz COLOR_GRAY2BGRA转换类型一样。我不认为这是造成你的特殊问题,但值得检查

由于onCameraFrame是一个回调,当另一个调用传入时,您很可能正在处理rgb,因此在您将其返回到方法中之前,rgb可能会被覆盖。在这方面,向onCameraFrame方法添加synchronized应该会有所帮助,但这可能会影响性能。或者,将rgb设置为onCameraFrame的本地也应该避免这种特殊的并发问题


最后一个想法是,与其单击按钮进行复制,不如在onCameraFrame中完成处理后将图像复制到Canny_图像,这样它始终可用,onClick将采用当前版本。

我实现了倒计时,稍后将讨论
Public void ProcessFrame() {
    synchronized(this) {
        // Wair for condition true...
        // Do something with incoming data...
        // Flag condition false
    }
}