Android & OpenCV - 应用在 UI 变化时崩溃
Android & OpenCV - App crashes on UI change
我正在制作一个使用 OpenCV 人脸检测的应用程序。当在相机图像中检测到人脸时,我想对 UI 进行一些更改。
布局分为两部分,左边是一些文字,右边是相机图像。我想在检测到人脸时更改文本颜色。
我在 onCameraFrame() 方法中检测到人脸时没有任何问题,但如果我尝试从此方法更改 UI 元素,应用程序就会崩溃。
这是它的外观。 /* 不是真正的代码,只是例子 */
public class MyClass extends Activity implements CvCameraViewListener
{
private CameraBridgeViewBase mOpenCvCameraView;
private TextView myTextElement;
private FaceLocator faceLocator;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myclass);
myTextElement = (TextView) findViewById(R.id.text_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.my_class_face_detector_layout);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.enableView();
}
@Override
public Mat onCameraFrame(Mat inputFrame)
{
if (faceLocator != null) {
bool face_detected = faceLocator.detectFaces(inputFrame);
if (face_detected) {
myTextElement.setTextColor(Color.GREEN);
}
}
return inputFrame;
}
}
有人能帮忙吗?
这是堆栈跟踪...
at android.view.ViewRootImpl.checkThread
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1005)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4548)
at android.view.View.invalidate(View.java:11095)
at android.view.View.invalidate(View.java:11044)
at android.widget.TextView.updateTextColors(TextView.java:3473)
at android.widget.TextView.setTextColor(TextView.java:2663)
at com.riteh.mateo.cameracontrol.CCSettings.onCameraFrame(CCSettings.java:186)
at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:157)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:393)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:346)
at java.lang.Thread.run(Thread.java:841)
两天后就解决了...堆栈跟踪将我推向了正确的方向。
问题是该方法 运行 在一个单独的线程中,所以我不得不使用 runOnUiThread() 来更改 UI。
只需将 onCameraFrame 方法更改为此
@Override
public Mat onCameraFrame(Mat inputFrame)
{
if (faceLocator != null) {
bool face_detected = faceLocator.detectFaces(inputFrame);
if (face_detected) {
runOnUiThread(new Runnable() {
@Override
public void run() {
myTextElement.setTextColor(Color.GREEN);
}
});
}
}
return inputFrame;
}
我正在制作一个使用 OpenCV 人脸检测的应用程序。当在相机图像中检测到人脸时,我想对 UI 进行一些更改。
布局分为两部分,左边是一些文字,右边是相机图像。我想在检测到人脸时更改文本颜色。
我在 onCameraFrame() 方法中检测到人脸时没有任何问题,但如果我尝试从此方法更改 UI 元素,应用程序就会崩溃。
这是它的外观。 /* 不是真正的代码,只是例子 */
public class MyClass extends Activity implements CvCameraViewListener
{
private CameraBridgeViewBase mOpenCvCameraView;
private TextView myTextElement;
private FaceLocator faceLocator;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myclass);
myTextElement = (TextView) findViewById(R.id.text_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.my_class_face_detector_layout);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.enableView();
}
@Override
public Mat onCameraFrame(Mat inputFrame)
{
if (faceLocator != null) {
bool face_detected = faceLocator.detectFaces(inputFrame);
if (face_detected) {
myTextElement.setTextColor(Color.GREEN);
}
}
return inputFrame;
}
}
有人能帮忙吗?
这是堆栈跟踪...
at android.view.ViewRootImpl.checkThread
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1005)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4548)
at android.view.View.invalidate(View.java:11095)
at android.view.View.invalidate(View.java:11044)
at android.widget.TextView.updateTextColors(TextView.java:3473)
at android.widget.TextView.setTextColor(TextView.java:2663)
at com.riteh.mateo.cameracontrol.CCSettings.onCameraFrame(CCSettings.java:186)
at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:157)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:393)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:346)
at java.lang.Thread.run(Thread.java:841)
两天后就解决了...堆栈跟踪将我推向了正确的方向。
问题是该方法 运行 在一个单独的线程中,所以我不得不使用 runOnUiThread() 来更改 UI。
只需将 onCameraFrame 方法更改为此
@Override
public Mat onCameraFrame(Mat inputFrame)
{
if (faceLocator != null) {
bool face_detected = faceLocator.detectFaces(inputFrame);
if (face_detected) {
runOnUiThread(new Runnable() {
@Override
public void run() {
myTextElement.setTextColor(Color.GREEN);
}
});
}
}
return inputFrame;
}