如题:
E/cv::error(): OpenCV(4.1.0) Error: Assertion failed (H1.type() == H2.type() && H1.depth() == CV_32F) in compareHist, file /build/master_pack-android/opencv/modules/imgproc/src/histogram.cpp, line 1936
E/org.opencv.imgproc: imgproc::compareHist_10() caught cv::Exception: OpenCV(4.1.0) /build/master_pack-android/opencv/modules/imgproc/src/histogram.cpp:1936: error: (-215:Assertion failed) H1.type() == H2.type() && H1.depth() == CV_32F in function ‘compareHist’
W/System.err: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.1.0) /build/master_pack-android/opencv/modules/imgproc/src/histogram.cpp:1936: error: (-215:Assertion failed) H1.type() == H2.type() && H1.depth() == CV_32F in function ‘compareHist’
W/System.err: ]
W/System.err: at org.opencv.imgproc.Imgproc.compareHist_0(Native Method)
W/System.err: at org.opencv.imgproc.Imgproc.compareHist(Imgproc.java:1020)
W/System.err: at com.vcard.vcardtempsdkv2.MainActivity.onResume(MainActivity.java:567)
W/System.err: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1456)
W/System.err: at android.app.Activity.performResume(Activity.java:7614)
W/System.err: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4412)
W/System.err: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4470)
W/System.err: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
W/System.err: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
W/System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:112)
W/System.err: at android.os.Looper.loop(Looper.java:216)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7625)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
比较两个图片相似度(compareHist)时出现的问题(相信其他函数也会有这样的异常抛出),很自然是因为没有满足其中一个条件就会出错。但容易入坑:
1、解决了h1的depth为CV_32F后还是报错
是因为解决h1的depth时,却把type给改变了,导致了不相等。
2、通过转换函数转换之后,忽略了type
此时需要做的是分别将两个参数的type、depth分别输出,看一下具体的值后转换为相同的即可解决问题。并且都同时转换一下:
mat1.convertTo(mat1, CvType.CV_32F);
mat2.convertTo(mat2, CvType.CV_32F);
Imgproc.compareHist(mat1,mat2,Imgproc.HISTCMP_CORREL);
出现此问题的原因:
1、两张图的位深度(通道不一样)不一样,一张24,另一张32 ,影响的type不一样
2、depth(mat的data数据类型)不一样,图片类型不一样可能导致这个数据类型不一样
如需进一步了解mat的type和depth:OpenCV Mat基础认知感