QuickBirdEng / opencv-android

Easy way to integrate OpenCv into your Android project via Gradle

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

yprogbest opened this issue · comments

commented

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