Android:使用Core.rotate将摄像头旋转90度会导致Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 错误

描述:

今天跑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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值