簡體   English   中英

錯誤:Android Kotlin 中的斷言失敗 (src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4)

[英]Error: Assertion failed (src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4) in Android Kotlin

我想檢測視頻中的角落。

為此,我首先對視頻幀進行灰度化,並在那里應用角點檢測方法。

但是,我收到以下錯誤:

E/cv::error(): OpenCV(4.6.0) 錯誤:斷言失敗 (src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4) Java_org_opencv_android_Utils_nMatToBitmap2

我寫的代碼如下。語言是Kotlin。 誰能解釋一下解決方案? 謝謝你。

class MainActivity : AppCompatActivity() {

    @RequiresApi(Build.VERSION_CODES.P)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        OpenCVLoader.initDebug()

        val videoView = findViewById<VideoView>(R.id.videoView)
        val imgView = findViewById<ImageView>(R.id.imageView)

        //set Video to videoView
        val uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video_name)
        videoView.setVideoURI(uri)
        videoView.start();


        val retriever = MediaMetadataRetriever()
        var bitmap = MediaMetadataRetriever.BitmapParams()
        val context = applicationContext
        retriever.setDataSource(context, uri)

        //get frame
        val frameNum =
            retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT)


        
        thread(){
            try{
                for (i in 1..frameNum!!.toInt()) {

                    //get frame
                    var bitframe = retriever.getFrameAtIndex(i)
                    val f_width = bitframe!!.width
                    val f_height = bitframe!!.height

                    //Mat
                    var srcMat: Mat = Mat.zeros(f_height, f_width, CV_8UC1)
                    var grayMat: Mat = Mat.zeros(f_height, f_width, CV_8UC1)
                    var bitMat: Mat = Mat.zeros(f_height, f_width, CV_8UC1)
                    var cornerMat:Mat = Mat.zeros(f_height, f_width, CV_8UC1)

                    //bitframe to srcMat
                    Utils.bitmapToMat(bitframe, srcMat)

                    //grayScale
                    Imgproc.cvtColor(srcMat, grayMat, Imgproc.COLOR_BGR2GRAY)
                    
                    Imgproc.cornerHarris(grayMat,cornerMat,3,5,0.5)

        Utils.matToBitmap(cornerMat, bitframe)
        Handler(Looper.getMainLooper()).post {
            imgView.setImageBitmap(bitframe)
        }
     }
}


activity_main.xml 如下。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="396dp"
        android:layout_height="258dp"
        android:layout_marginTop="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="382dp"
        android:layout_height="244dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/videoView"
        tools:srcCompat="@tools:sample/avatars" />

</androidx.constraintlayout.widget.ConstraintLayout>

謝謝您的合作。

最后,我擦除了 Android Emurator 的數據,thr 錯誤消失了。

for (i in 1..frameNum.!.toInt())

方法調用getFrameAtIndex(i)可能不是 1-indexed,嘗試用getFrameAtIndex(i-1)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM