[英]Bilateral filter error, Assertion failed ((src.type() == CV_8UC1 || src.type() == CV_8UC3) && src.data != dst.data)
[英]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.