【问题标题】:Bad flag parameter or structure field unrecognized or unsupported array type in cvgetmatcvgetmat 中的错误标志参数或结构字段无法识别或不支持的数组类型
【发布时间】:2015-12-15 17:04:43
【问题描述】:

题名好像是重复的,我同意这个,但情况不一样。所以我没有找到适合我的解决方案。

当我尝试将 Mat 分配给 BackgroundSubtractorMOG2BackgroundSubtractorKNN 时出现错误。

执行流程是这样的:

  • 通过 TCP Socket 获取 JPEG 图片的字节数组。 没问题
  • 将字节数组转换为 Mat 如下代码。 没问题

    Mat mat = Imgcodecs.imdecode(new MatOfByte(sJpegPicBuffer), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);

  • 如果需要转灰度,也可以转 成功地。 没问题

  • 将 Mat 转换为 BufferedImage。 没问题

  • 然后在 JPanel 中显示 BufferedImage。 没问题

但是 当将其分配给BackgroundSubtractor 时,问题发生了。 问题

subtractor.apply(mat, foregroundImg , -1);

注意: 我在 Java 中使用 OpenCV 3.0。当我使用网络摄像头或读取视频文件并进行相同的流程时,没有问题发生,非常顺利。

现在这个问题的原因是什么?

提前致谢!

【问题讨论】:

    标签: java opencv


    【解决方案1】:

    使用正学习率(apply() 方法的最后一个参数)。

    尝试一些小的值,例如 0.01。

    编辑:

    刚刚注意到 -1 是默认值,并在内部转换为值 >= 0

    【讨论】:

    • 如果是-1的问题,那么为什么网络摄像头和视频文件可以正常工作。负参数值使得算法使用一些自动选择的学习率(0~1),所以看起来不是学习率的问题。
    • matforegroundImg 是否为空且类型正确?不使用网络摄像头或视频文件时如何测试它?
    • foregroundImg 不为空,我检查它们的类型是否相同(16),我打印出它们的每个通道,它是相同的([136.0, 136.0, 136.0] ...更多)以及相同的深度(0)。现在我也不知道为什么它不起作用。会是什么原因。
    • 我相信foregroundImg必须是单通道图像掩码see docs。代码 16 似乎对应于 CV_8UC3。
    • 不不,foregroundImg是这个apply()函数返回的,是结果,所以类型和其他函数本身决定的不是我们,是的,它返回一个二进制图像,我真的没有为什么它不起作用,但它适用于网络摄像头或视频文件,而它们的垫子都是一样的。无论如何感谢您的回复,顺便说一下,如果您有任何想法可以告诉我解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多