描述:
今天跑opencv的例程tutorial-2-mixedprocessing时发现使用
Core.rotate(mRgba,mRgba,Core.ROTATE_90_CLOCKWISE);
将摄像头旋转90度会导致Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr错误。
旋转180度就不会。
error log:
2023-05-13 17:15:33.104 1652-1853 WindowManager system_server E win=Window{1069dad u0 Splash Screen com.michael.findfeature EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true
2023-05-13 17:15:33.258 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.273 22804-22888 cv::error() com.michael.findfeature E OpenCV(4.6.0) Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in Java_org_opencv_android_Utils_nMatToBitmap2, file /home/ci/opencv/modules/java/generator/src/cpp/utils.cpp, line 101
2023-05-13 17:15:33.275 22804-22888 libc com.michael.findfeature A Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x79270f18c0 in tid 22888 (Thread-3), pid 22804 (ael.findfeature)
2023-05-13 17:15:33.297 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.358 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.361 22966-22966 DEBUG pid-22966 A pid: 22804, tid: 22888, name: Thread-3 >>> com.michael.findfeature <<<
2023-05-13 17:15:33.410 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.471 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.531 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.592 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.651 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.711 22804-22804 JavaCameraView com.michael.findfeature D Preview Frame received. Frame size: 1036800
2023-05-13 17:15:33.736 22804-22804 CameraBridge com.michael.findfeature D call checkCurrentState
2023-05-13 17:15:33.736 22804-22804 CameraBridge com.michael.findfeature D call processExitState: 1
2023-05-13 17:15:33.736 22804-22804 JavaCameraView com.michael.findfeature D Disconnecting from camera
2023-05-13 17:15:33.736 22804-22804 JavaCameraView com.michael.findfeature D Notify thread
2023-05-13 17:15:33.736 22804-22804 JavaCameraView com.michael.findfeature D Waiting for thread
2023-05-13 17:15:33.780 2501-3230 DollieAdapterService com.huawei.systemserver E notifyActivityState pkg:com.michael.findfeature/com.michael.findfeature.MainActivity state:20 fg:false mUid:10744
---------------------------- PROCESS ENDED (22804) for package com.michael.findfeature ----------------------------
代码如下:
package com.michael.findfeature;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraActivity;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import java.util.Collections;
import java.util.List;
//public class MainActivity extends AppCompatActivity {
//
// // Used to load the ‘findfeature’ library on application startup.
// static {
// System.loadLibrary(“findfeature”);
// }
//
// private ActivityMainBinding binding;
//
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
//
// binding = ActivityMainBinding.inflate(getLayoutInflater());
// setContentView(binding.getRoot());
//
// // Example of a call to a native method
// TextView tv = binding.sampleText;
// tv.setText(stringFromJNI());
// }
//
// /**
// * A native method that is implemented by the ‘findfeature’ native library,
// * which is packaged with this application.
// */
// public native String stringFromJNI();
//}
public class MainActivity extends CameraActivity implements CvCameraViewListener2 {
private static final String TAG = “OCVSample::Activity”;
private static final int VIEW_MODE_RGBA = 0;
private static final int VIEW_MODE_GRAY = 1;
private static final int VIEW_MODE_CANNY = 2;
private static final int VIEW_MODE_FEATURES = 5;
private int mViewMode;
private Mat mRgba;
private Mat mIntermediateMat;
private Mat mGray;
private MenuItem mItemPreviewRGBA;
private MenuItem mItemPreviewGray;
private MenuItem mItemPreviewCanny;
private MenuItem mItemPreviewFeatures;
private CameraBridgeViewBase mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
// Load native library after(!) OpenCV initialization
System.loadLibrary("mixed_sample");
mOpenCvCameraView.enableView();
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
public MainActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//把系统状态栏去掉加入下面一行代码
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.tutorial2_surface_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view);
mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
// Log.d(TAG, “Creating and setting view”);
// mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
// setContentView(mOpenCvCameraView);
//
//
// mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE);
// mOpenCvCameraView.setCvCameraViewListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Log.i(TAG, "called onCreateOptionsMenu");
mItemPreviewRGBA = menu.add("Preview RGBA");
mItemPreviewGray = menu.add("Preview GRAY");
mItemPreviewCanny = menu.add("Canny");
mItemPreviewFeatures = menu.add("Find features");
return true;
}
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
@Override
protected List<? extends CameraBridgeViewBase> getCameraViewList() {
return Collections.singletonList(mOpenCvCameraView);
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
}
public void onCameraViewStopped() {
mRgba.release();
mGray.release();
mIntermediateMat.release();
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
final int viewMode = mViewMode;
switch (viewMode) {
case VIEW_MODE_GRAY:
// input frame has gray scale format
Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
break;
case VIEW_MODE_RGBA:
// input frame has RBGA format
mRgba = inputFrame.rgba();
break;
case VIEW_MODE_CANNY:
// input frame has gray scale format
mRgba = inputFrame.rgba();
Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100);
Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
break;
case VIEW_MODE_FEATURES:
// input frame has RGBA format
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
FindFeatures(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr());
break;
}
Core.rotate(mRgba,mRgba,Core.ROTATE_90_CLOCKWISE);
return mRgba;
}
public boolean onOptionsItemSelected(MenuItem item) {
Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
if (item == mItemPreviewRGBA) {
mViewMode = VIEW_MODE_RGBA;
} else if (item == mItemPreviewGray) {
mViewMode = VIEW_MODE_GRAY;
} else if (item == mItemPreviewCanny) {
mViewMode = VIEW_MODE_CANNY;
} else if (item == mItemPreviewFeatures) {
mViewMode = VIEW_MODE_FEATURES;
}
return true;
}
public native void FindFeatures(long matAddrGr, long matAddrRgba);
}