I've installed OpenCV4Android and OpenCVManager. I'm using OpenCV4Android 3.4.1 and OpenCVManager has downloaded both libopencv_java.so (2.4) and libopencv_java3.so (3.0).
When I make calls to Core.flip or create instances of Mat, it works as intended; however, when i make calls to Core.rotate, i get the following error:
07-25 17:15:10.252 5914-6018/com.example.wmmc88.traffictracker E/art: No implementation found for void org.opencv.core.Core.rotate_0(long, long, int) (tried Java_org_opencv_core_Core_rotate_10 and Java_org_opencv_core_Core_rotate_10__JJI)
07-25 17:15:10.253 5914-6018/com.example.wmmc88.traffictracker E/AndroidRuntime: FATAL EXCEPTION: Thread-3396
Process: com.example.wmmc88.traffictracker, PID: 5914
java.lang.UnsatisfiedLinkError: No implementation found for void org.opencv.core.Core.rotate_0(long, long, int) (tried Java_org_opencv_core_Core_rotate_10 and Java_org_opencv_core_Core_rotate_10__JJI)
at org.opencv.core.Core.rotate_0(Native Method)
at org.opencv.core.Core.rotate(Core.java:2043)
at com.example.wmmc88.traffictracker.CameraActivity.onCameraFrame(CameraActivity.java:163)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:392)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:373)
at java.lang.Thread.run(Thread.java:818)
When I use static initialization of the OpenCV library, it no longer gives me this error. It seems to me like the OpenCV Manager hasn't properly implemented some of the Core module's methods?
Code in Question:
public class CameraActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
private static final String TAG =
CameraActivity.class.getSimpleName();
CameraActivity.class.getSimpleName();
public static final int CAMERA_PERMISSION_REQUEST = 1;
private Mat mRgba;
private CameraBridgeViewBase mOpenCvCameraView;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_camera);
}
}
private boolean permissionsGranted() {
Log.d(TAG, "checkpermissionsGranted");
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST);
return false;
}
}
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.d(TAG, "onRequestPermissionsResult");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case CAMERA_PERMISSION_REQUEST: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Permissions Granted!");
loadOpenCVView();
} else {
Log.w(TAG, "Permissions Denied!");
this.finish();
}
}
return;
}
}
//other permission request cases
}
}
}
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
Log.d(TAG, "onManagerConnected");
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
if (permissionsGranted()) {
loadOpenCVView();
}
}
}
}
break;
default: {
super.onManagerConnected(status);
}
}
break;
}
}
}
}
};
private void loadOpenCVView() {
Log.d(TAG, "loadOpenCVView");
mOpenCvCameraView = findViewById(R.id.cbvb_camera);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.enableView();
}
}
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
}
}
@Override
public void onPause() {
Log.d(TAG, "onPause");
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
}
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
}
public void onCameraViewStarted(int width, int height) {
Log.d(TAG, "onCameraViewStarted");
mRgba = new Mat(height, width, CvType.CV_8UC4);
}
}
public void onCameraViewStopped() {
Log.d(TAG, "onCameraViewStopped");
mRgba.release();
}
}
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Log.d(TAG, "onCameraFrame");
mRgba = inputFrame.rgba();
Core.flip(mRgba, mRgba, 1); //Works
Core.rotate(mRgba, mRgba, 90); //Errors
return mRgba;
}
}
}