【问题标题】:Efficient matrix copying in OpenCVOpenCV 中的高效矩阵复制
【发布时间】:2013-07-16 06:52:27
【问题描述】:

我不知道如何在 OpenCV 中有效地实现矩阵。 我有二进制 Mat nz(150,600) 与 0 和 1 元素。 我有具有双值的 Mat mk(150,600)。 我喜欢像在 Matlab 中那样实现

sk = mk(nz);

该命令仅将 mk 元素中 nz 为 1 的位置的那些元素复制到 sk。然后将 sk 制作成行矩阵。 如何在 OpenCV 中有效地实现它以提高速度和内存?

【问题讨论】:

    标签: opencv


    【解决方案1】:

    您应该看看Mat::copyToMat::clonecopyTo 将使用可选掩码进行复制,其中非零元素指示需要复制哪些矩阵元素。

    mk.copyTo(sk, nz);
    

    如果您真的想要一个行矩阵,请致电 sk.reshape(),因为成员 sansuiso 已经建议。这种方法...

    为相同的数据创建替代矩阵标题,具有不同的 通道数和/或不同的行数。

    【讨论】:

      【解决方案2】:

      bkausbk 给出了最好的答案。但是,第二种方法:

      A=bitwise_and(nz,mk); 
      

      如果您访问 A,您可以将非零值复制到 std::vector 中。如果你希望你的输出是一个 cv::Mat 实例,那么你必须先分配内存:

      S=countNonZero(A); //size of the final output matrix
      

      现在,快速元素访问本身就是一个实际的主题。去谷歌上查询。或者查看一下 opencv/modules/core/src/stat.cpp 其中实现了countNonZero() 以获得一些想法。

      【讨论】:

        【解决方案3】:

        您的任务涉及两个步骤。 首先,将输入矩阵转换为双倍:

        cv::Mat binaryMat;                      // source matrix, filled somewhere
        cv::Mat doubleMat;                      // target matrix (with doubles)
        binaryMat.convertTo(doubleMat, CV64F);  // Perform the conversion
        

        然后,将结果重塑为行矩阵:

        doubleMat = cv::reshape(doubleMat, 1, 1);
        // Alternatively:
        cv::Mat doubleRow = cv::reshape(doubleMat, 1, 1);
        

        cv::reshape 操作在不复制数据的意义上是有效的,只是结构头发生了变化。 此函数返回对矩阵的新引用(通过创建新标头),因此您不应忘记分配其结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-13
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多