在OpenCV中计算码本

Computing codebooks in OpenCV

本文关键字:码本 计算 OpenCV      更新时间:2023-10-16

有一些问题涉及到同样的不可理解的异常,但我想用一个最小的例子清楚地问清楚。

我有以下代码:

  • 从文件中加载所有SIFT描述符;
  • 将描述符规范化,例如CV_32F;

:

  • 初始化BowTrainer(基于在线示例的代码):

    TermCriteria tc(CV_TERMCRIT_ITER,100,0.001);
    int retries=1;
    int flags=KMEANS_PP_CENTERS;
    BOWKMeansTrainer bow_trainer(dictionary_size, tc, retries, flags);
    

最后:

   vocabulary = bow_trainer.cluster(training_descriptors); 

其中training_descriptors1218772 * 128 CV_32F矩阵,包含0,1个归一化SIFT描述符。

不幸的是,cluster生成了一个异常:

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in kmeans, file /Users/u/Downloads/OpenCV-2.4.4/modules/core/src/matrix.cpp, line 2686

矩阵的类型是正确的,即CV_32F,我不明白是谁的数据。dims应该是<=2,以及为什么它看起来像K <= 0。

碰巧我也得到了同样的错误。在我的例子中,这是因为描述符Mat里面没有元素。我怀疑这是什么数据。暗<= 2指。

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in kmeans, file /home/ubuntu/opencv-2.4.5/modules/core/src/matrix.cpp, line 2686

是否检查了描述符数组是否为空?