Skip to content

I want to use OpenCV's Canny method, but after a certain amount of time, the screen crashes. #75

@yprogbest

Description

@yprogbest

I want to use OpenCV's Canny method, but after a certain period of time, the screen crashes, and when I check the Profiler, even though I have released the mat, the MEMORY keeps increasing and when it reaches 2G, the screen crashes. The code and the Profiler screen are shown below.

`
class MainActivity : AppCompatActivity(), CameraBridgeViewBase.CvCameraViewListener2 {

private var mOpenCvCameraViewCanny:CameraBridgeViewBase?=null

private var mRgba:Mat? = null
private var mRgbaCanny:Mat?=null
private var mGray:Mat?=null


private var mCameraId:Int = JavaCameraView.CAMERA_ID_BACK// リアカメラをデフォルトで使用


private val mLoaderCallback = object :BaseLoaderCallback(this){
    override fun onManagerConnected(status: Int) {

        when(status){
            LoaderCallbackInterface.SUCCESS->{
                mOpenCvCameraViewCanny?.enableView()
            }
            else->{
                super.onManagerConnected(status)
            }
        }
    }
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val btnChange:Button = findViewById(R.id.btnChange)

    mOpenCvCameraViewCanny = findViewById<JavaCameraView>(R.id.cameraViewCanny)
    mOpenCvCameraViewCanny?.visibility = SurfaceView.VISIBLE
    mOpenCvCameraViewCanny?.setCvCameraViewListener(this)



    //ボタンが押された時に,frontとbackを入れ替える
    btnChange.setOnClickListener {

        if(btnChange.text == "BACK"){
            mCameraId= JavaCameraView.CAMERA_ID_FRONT// フロントカメラを使用
            mOpenCvCameraViewCanny?.disableView()
            mOpenCvCameraViewCanny?.setCameraIndex(mCameraId)
            mOpenCvCameraViewCanny?.enableView()

            btnChange.text = "FRONT"
        }else{
            mCameraId= JavaCameraView.CAMERA_ID_BACK// バックカメラを使用
            mOpenCvCameraViewCanny?.disableView()
            mOpenCvCameraViewCanny?.setCameraIndex(mCameraId)
            mOpenCvCameraViewCanny?.enableView()

            btnChange.text = "BACK"
        }


    }


    // プレビューを有効にする
    mOpenCvCameraViewCanny?.setCameraPermissionGranted()
    mOpenCvCameraViewCanny?.enableView()


}


override fun onResume() {
    super.onResume()

    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "OpenCV library not found!")
    } else {
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS)
    }

}


//アクティビティが一時停止されたときに呼び出されるコールバックメソッド
override fun onPause() {
    super.onPause()
    mOpenCvCameraViewCanny?.disableView()
}

override fun onDestroy() {
    super.onDestroy()
    mOpenCvCameraViewCanny?.disableView()
}


override fun onCameraViewStarted(width: Int, height: Int) {

    mGray = Mat(height, width, CvType.CV_8UC1)
    mRgbaCanny = Mat(height, width, CvType.CV_8UC4)
    mRgba = Mat(height, width, CvType.CV_8UC4)

}

override fun onCameraViewStopped() {
    mGray?.release()
    mRgba?.release()
    mRgbaCanny?.release()
}

override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame?): Mat {


    mRgba = inputFrame?.rgba()



    //回転
    when (mCameraId) {
        JavaCameraView.CAMERA_ID_FRONT ->{
            Core.flip(mRgba?.t(), mRgba, 0)
            Core.flip(mRgba, mRgba, 1)
        }

        JavaCameraView.CAMERA_ID_BACK -> {
            Core.flip(mRgba?.t(), mRgba, 1)
        }
    }


    //Canny法の実装
    Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_BGRA2GRAY)
    Imgproc.GaussianBlur(mGray, mGray, Size(3.0,3.0),0.0) //ガウシアンフィルタによるぼかし処理
    Imgproc.Canny(mGray, mGray, 50.0, 100.0)
    Core.bitwise_not(mGray, mGray)
    Imgproc.cvtColor(mGray, mRgbaCanny, Imgproc.COLOR_GRAY2RGBA)



    return mRgbaCanny!!
}

}`

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions