이 프로젝트는 다른 사람의 얼굴에 포인트를보고 비디오를 재생해야합니다. 나는 3 개의 지역으로 스크린을 나누고 지명했다. 프로젝트 카메라를 돌릴 때 갑자기 제 2 영역을 보게되고 제 2 영역에는 아무런 조치가 없기 때문에 오류가 없습니다. 그러나 카메라가 첫 번째 또는 세 번째 영역을 볼 때 - 프로젝트는이 영역에서 비디오 재생을 시작해야합니다 - 갑자기 프로젝트가 닫힙니다.오류 : 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 터치 할 수 있습니다.
08-28 11:08:09.392: E/AndroidRuntime(4635): FATAL EXCEPTION: Thread-373
08-28 11:08:09.392: E/AndroidRuntime(4635): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4078)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:714)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.View.requestLayout(View.java:12678)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.View.requestLayout(View.java:12678)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.View.requestLayout(View.java:12678)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.View.requestLayout(View.java:12678)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.view.View.requestLayout(View.java:12678)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.widget.VideoView.setVideoURI(VideoView.java:213)
08-28 11:08:09.392: E/AndroidRuntime(4635): at android.widget.VideoView.setVideoURI(VideoView.java:202)
08-28 11:08:09.392: E/AndroidRuntime(4635): at org.opencv.samples.facedetect.FdActivity.startPlaying(FdActivity.java:526)
08-28 11:08:09.392: E/AndroidRuntime(4635): at org.opencv.samples.facedetect.FdActivity.onCameraFrame(FdActivity.java:372)
08-28 11:08:09.392: E/AndroidRuntime(4635): at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387)
08-28 11:08:09.392: E/AndroidRuntime(4635): at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:321)
08-28 11:08:09.392: E/AndroidRuntime(4635): at java.lang.Thread.run(Thread.java:856)
여기 주요 코드의 필요한 부분이다 :
이
내 로그 캣 오류입니다.public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.face_detect_surface_view);
.....
mMethodSeekbar = (SeekBar) findViewById(R.id.methodSeekBar);
mValue = (TextView) findViewById(R.id.method);
.....
videoView.setZOrderOnTop(true);
// Creating MediaController
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri2);
videoView.requestFocus();
videoView.start();
currentPosition = 0;
}
@Override
public void onPause() {
.....
}
@Override
public void onResume() {
....
}
@Override
public void onDestroy() {
...
}
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
if (mAbsoluteFaceSize == 0) {
int height = mGray.rows();
if (Math.round(height * mRelativeFaceSize) > 0) {
mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
}
}
if (mZoomWindow == null || mZoomWindow2 == null)
CreateAuxiliaryMats();
MatOfRect faces = new MatOfRect();
if (mJavaDetector != null)
mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2,
2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
new Size(mAbsoluteFaceSize, mAbsoluteFaceSize),
new Size());
Rect[] facesArray = faces.toArray();
for (int i = 0; i < facesArray.length; i++) {
//Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(),
// FACE_RECT_COLOR, 3);
xCenter = (facesArray[i].x + facesArray[i].width + facesArray[i].x)/2;
yCenter = (facesArray[i].y + facesArray[i].y + facesArray[i].height)/2;
Point center = new Point(xCenter, yCenter);
//Core.circle(mRgba, center, 10, new Scalar(255, 0, 0, 255), 3);
Log.i("Point Location", Double.toString(xCenter));
if(xCenter>50 && xCenter<250){
Log.i("Point Location","Area 1");
startPlaying(false);
}
else if (xCenter>250 && xCenter<450) {
Log.i("Point Location","Area 2");
/*
videoView.stopPlayback();
videoView.setVideoURI(uri2);
videoView.requestFocus();
videoView.start();
*/
}
else if (xCenter>450 && xCenter <650){
Log.i("Point Location","Area 3");
startPlaying(false);
}
/*Core.putText(mRgba, "[" + center.x + "," + center.y + "]",
new Point(center.x + 20, center.y + 20),
Core.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255,
255));
//KOORDINATLARI YAZAN FONKSIYON// */
Rect r = facesArray[i];
// compute the eye area
Rect eyearea = new Rect(r.x + r.width/8,
(int) (r.y + (r.height/4.5)), r.width - 2 * r.width/8,
(int) (r.height/3.0));
// split it
Rect eyearea_right = new Rect(r.x + r.width/16,
(int) (r.y + (r.height/4.5)),
(r.width - 2 * r.width/16)/2, (int) (r.height/3.0));
Rect eyearea_left = new Rect(r.x + r.width/16
+ (r.width - 2 * r.width/16)/2,
(int) (r.y + (r.height/4.5)),
(r.width - 2 * r.width/16)/2, (int) (r.height/3.0));
// draw the area - mGray is working grayscale mat, if you want to
// see area in rgb preview, change mGray to mRgba
Core.rectangle(mRgba, eyearea_left.tl(), eyearea_left.br(),
new Scalar(255, 0, 0, 255), 2);
Core.rectangle(mRgba, eyearea_right.tl(), eyearea_right.br(),
new Scalar(255, 0, 0, 255), 2);
if (learn_frames < 5) {
teplateR = get_template(mJavaDetectorEye, eyearea_right, 24);
teplateL = get_template(mJavaDetectorEye, eyearea_left, 24);
learn_frames++;
} else {
// Learning finished, use the new templates for template
// matching
// match_eye(eyearea_right, teplateR, method);
//match_eye(eyearea_left, teplateL, method);
}
}
return mRgba;
}
.....
}
}
그리고이 생각은 문제가 :
당신이 관련된 모든 방법을 실행startPlaying()
오류의 근원이라고 생각하면 private void startPlaying(boolean startFromCurrent) { //IHTIYAC 1
videoView.stopPlayback();
videoView.setVideoURI(uri1);
//videoView.requestFocus();
...
}
});
}
이 오류는 프로그래밍 방식으로 주 스레드 (UI 스레드라고도 함)와 다른 스레드에서 이벤트를 발생 시키려고 할 때 발생합니다. 당신은'Runnable' 객체로 그러한 호출을 "랩핑"하고 runOnUiThread() 메소드에 의해 메인 쓰레드 큐로 보내야합니다. 예외 추적의 행 번호는 오류의 원인이되는 코드 부분으로 연결됩니다. –
@SashaSalauyou ok 그러나 runOnUiThread() 메소드는 어디에 두어야합니까? 죄송합니다, 안드로이드에서 새로운입니다 – iremcenbertas
'JavaCameraView.java' 클래스의 321 번째 라인을 먼저 살펴보십시오 –