Я следую учебному пособию, которое фильтрует определенные цвета из того, что отображается на экране.Распространенная проблема, которую я видел с OpenCV и JavaCameraView, заключается в том, что то, что отображает камера, поворачивается на 90 градусов на экране.
Одно решение изменяет файл JavaCameraView.java для добавления этого кода:
/* Finally we are ready to start the preview */
Log.d(TAG, "startPreview");
//inserted code
setDisplayOrientation(mCamera, 90);
mCamera.setPreviewDisplay(getHolder());
//end
mCamera.startPreview();
}
protected void setDisplayOrientation(Camera camera, int angle){
Method downPolymorphic;
try
{
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[] { angle });
}
catch (Exception e1)
{
}
}
На этом экране успешно отображается та же ориентация, что и у камеры, но эффекты отсутствуют.
В другом решении я добавил следующую строку кода в метод onCreate:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Это только предотвратило переход всего приложения из портретного в альбомное, но ничего не изменило для изображения на экране.
Как я могу вращать то, что отображает камера, не теряя при этом то, что обрабатывается?
Вот весь мой MainActivity.java:
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
JavaCameraView javaCameraView;
Mat mat1, mat2;
Scalar scalarLow, scalarHigh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OpenCVLoader.initDebug();
javaCameraView = (JavaCameraView)findViewById(R.id.cameraView);
javaCameraView.setCameraIndex(0);
scalarLow = new Scalar(45,20,10);
scalarHigh = new Scalar(75,255,255);
javaCameraView.setCvCameraViewListener(this);
javaCameraView.enableView();
}
@Override
protected void onPause() {
super.onPause();
javaCameraView.disableView();
}
@Override
protected void onResume() {
super.onResume();
javaCameraView.enableView();
}
@Override
protected void onDestroy() {
javaCameraView.disableView();
super.onDestroy();
}
@Override
public void onCameraViewStopped() {
}
@Override
public void onCameraViewStarted(int width, int height) {
mat1 = new Mat(width,height,CvType.CV_16UC4);
mat2 = new Mat(width,height,CvType.CV_16UC4);
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Imgproc.cvtColor(inputFrame.rgba(),mat1,Imgproc.COLOR_BGR2HSV);
Core.inRange(mat1,scalarLow,scalarHigh,mat2);
return mat2;
}
}