Efficient matrix copying in OpenCV
我不知道如何在 OpenCV 中有效地实现矩阵。
我有带有 0 和 1 个元素的二进制
我有具有双值的 Mat
我喜欢在 Matlab 中实现 as
1 | sk = mk(nz); |
该命令仅将 mk 元素中 nz 为 1 的位置的那些元素复制到 sk。然后将 sk 制作成行矩阵。
如何在 OpenCV 中有效地实现它以提高速度和内存?
你应该看看
1 | mk.copyTo(sk, nz); |
如果你真的想要一个行矩阵然后调用
creates alternative matrix header for the same data, with different
number of channels and/or different number of rows.
bkausbk 给出了最好的答案。但是,第二种方法:
1 | A=bitwise_and(nz,mk); |
如果您访问 A,您可以将非零值复制到 std::vector 中。如果你希望你的输出是一个 cv::Mat 实例,那么你必须首先分配内存:
1 | S=countNonZero(A); //size of the final output matrix |
现在,快速元素访问本身就是一个实际的主题。去谷歌上查询。或者看看 opencv/modules/core/src/stat.cpp 其中实现了
您的任务涉及两个步骤。
首先,将输入矩阵转换为双倍:
1 2 3 | cv::Mat binaryMat; // source matrix, filled somewhere cv::Mat doubleMat; // target matrix (with doubles) binaryMat.convertTo(doubleMat, CV64F); // Perform the conversion |
然后,将结果重塑为行矩阵:
1 2 3 | doubleMat = cv::reshape(doubleMat, 1, 1); // Alternatively: cv::Mat doubleRow = cv::reshape(doubleMat, 1, 1); |
此函数返回对矩阵的新引用(通过创建新标头),因此您不应忘记分配其结果。