我不知道如何在 OpenCV 中有效地实现矩阵实现。我有Mat nz(150,600)
0 和 1 个元素的二进制文件。我有mk(150,600)
双值的垫子。我喜欢在 Matlab 中实现
sk = mk(nz);
该命令仅在 nz 为 1 的位置将 mk 元素的那些元素复制到 sk。然后将 sk 制作成行矩阵。如何在 OpenCV 中有效地实现它以提高速度和内存?
我不知道如何在 OpenCV 中有效地实现矩阵实现。我有Mat nz(150,600)
0 和 1 个元素的二进制文件。我有mk(150,600)
双值的垫子。我喜欢在 Matlab 中实现
sk = mk(nz);
该命令仅在 nz 为 1 的位置将 mk 元素的那些元素复制到 sk。然后将 sk 制作成行矩阵。如何在 OpenCV 中有效地实现它以提高速度和内存?
你应该看看Mat::copyTo
and Mat::clone
。
copyTo
将使用可选掩码进行复制,其中非零元素指示需要复制哪些矩阵元素。
mk.copyTo(sk, nz);
如果你真的想要一个行矩阵,那么作为已经建议sk.reshape()
的成员sansuiso调用。这种方法...
为相同的数据创建替代矩阵标题,具有不同数量的通道和/或不同的行数。
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()
实现以获得一些想法。
您的任务涉及两个步骤。首先,将输入矩阵转换为双倍:
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
从不复制数据的意义上说,该操作是有效的,只是结构头发生了变化。此函数返回对矩阵的新引用(通过创建新标头),因此您不应忘记分配其结果。