OpenCV:H1.type() == H2.type() && H1.depth() == CV_32F

46 篇文章 2 订阅
2 篇文章 0 订阅

如题:
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基础认知感

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是由于比较的两个直方图的类型或深度不一致导致的。在使用 OpenCV 的 compareHist 函数时,需要注意比较的两个直方图必须具有相同的类型和深度。 你可以先检查一下两个直方图的类型和深度是否一致,如果不一致的话需要进行相应的转换。例如,如果两个直方图的类型不一致,可以使用 cv::cvtColor 函数将其中一个直方图转换为另一个直方图的类型。如果两个直方图的深度不一致,可以使用 cv::convertScaleAbs 函数将其中一个直方图的深度转换为另一个直方图的深度。 以下是一些示例代码: ```python import cv2 as cv # 读取两个图像并转换为灰度图像 img1 = cv.imread('image1.jpg') img2 = cv.imread('image2.jpg') gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY) gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY) # 计算两个灰度图像的直方图 hist1 = cv.calcHist([gray1], [0], None, [256], [0, 256]) hist2 = cv.calcHist([gray2], [0], None, [256], [0, 256]) # 转换直方图的类型和深度 hist1 = cv.convertScaleAbs(hist1, cv.CV_32F) hist2 = cv.convertScaleAbs(hist2, cv.CV_32F) # 比较直方图 result = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL) print(result) ``` 在这个示例代码中,我们首先读取了两个图像并将它们转换为灰度图像。然后计算了两个灰度图像的直方图,并将它们转换为相同的类型和深度。最后使用 compareHist 函数比较了两个直方图的相似度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值