如何在Android中同步两种方法?
我使用OpenCV的如何在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
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 imageonCameraFrame
方法后,您不可能设置一个标志(例如设置标志=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
}
}