Android和OpenCV – 应用程序在UI更改时崩溃

我正在使用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; }