如何对位矩阵实施快速多数表决

时间:2018-10-23 13:13:48

标签: opencv hamming-distance orb

我有一个大位矩阵的表示形式,在这里我想有效地检索每个矩阵列的多数位(^ =最经常出现的位值)。背景是矩阵行代表ORB特征描述符,而我正在寻找的值类似于Hamming域中的均值。

我目前正在使用的实现如下

  // holds column-sum for each bit
  std::vector<int> sum(32 * 8, 0);

  // cv::Mat mat is a matrix of values € [0, 255] filled elsewhere
  for (size_t i = 0; i < mat.cols; ++i)
  {
    const cv::Mat &d = mat.row(i);
    const unsigned char *p = d.ptr<unsigned char>();

    // count bits set column-wise
    for (int j = 0; j < d.cols; ++j, ++p)
    {
      if (*p & (1 << 7)) ++sum[j * 8];
      if (*p & (1 << 6)) ++sum[j * 8 + 1];
      if (*p & (1 << 5)) ++sum[j * 8 + 2];
      if (*p & (1 << 4)) ++sum[j * 8 + 3];
      if (*p & (1 << 3)) ++sum[j * 8 + 4];
      if (*p & (1 << 2)) ++sum[j * 8 + 5];
      if (*p & (1 << 1)) ++sum[j * 8 + 6];
      if (*p & (1))      ++sum[j * 8 + 7];
    }
  }

  cv::Mat mean = cv::Mat::zeros(1, 32, CV_8U);
  unsigned char *p = mean.ptr<unsigned char>();

  const int N2 = (int)mat.rows / 2 + mat.rows % 2;
  for (size_t i = 0; i < sum.size(); ++i)
  {
    if (sum[i] >= N2)
    {
      // set bit in mean only if the corresponding matrix column
      // contains more 1s than 0s
      *p |= 1 << (7 - (i % 8));
    }

    if (i % 8 == 7) ++p;
  }

瓶颈是所有位都在移动的大循环。有什么方法或已知的魔术可以使它更快吗?

0 个答案:

没有答案