我使用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();
进行克隆
感谢
答案 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将采用当前版本。