如何获取矩阵中非零的值

7
我正在使用OpenCV将一些Matlab代码翻译成C++。我想获取满足条件的矩阵的值。我为此创建了一个掩码,当我将其应用于原始矩阵时,我得到与原始矩阵相同大小的矩阵,但其中有0值,这些值在掩码中不存在。但我的问题是如何仅获取矩阵中非零的值并将其分配给另一个矩阵。
我的Matlab代码是:
 for i= 1:size(no,1)
        mask= labels==i;
        op = orig(mask, :); //op only contains the values from the orig matrix which are in the mask. So orig size and op size is not the same
.....
end

我现在有的C++翻译是:
for (int i=0; i<n.rows; i++)
{
    Mat mask;
    compare(labels,i,mask,CMP_EQ);
    Mat op;
    orig.copyTo(op,mask); //Here the orig size and the op size is always same but values which are not in the mask are 0
}

那么,我该如何创建一个只包含符合掩码条件值的矩阵?

1
“mask= labels==i;” 这个表达式在 OpenCV 中也是有效的。 - berak
3个回答

4
您可以尝试使用cv::SparseMat (http://docs.opencv.org/modules/core/doc/basic_structures.html#sparsemat),它只保留哈希中的非零值。
当您将常规的cv::Mat分配给cv::SparseMat时,它会自动捕获非零值。从那时起,您可以遍历非零值并按照您的意愿进行操作。
希望我正确理解了问题并且这有所帮助!

0

OpenCv支持矩阵表达式,例如A > BA <= B等。

这在cv::Mat的文档中有说明。


0

如果您只是想存储值,那么Mat对象可能不是最好的选择,因为它是用于包含图像的目的而创建的。

在这种情况下,使用cv::Mat对象而不是std::vector对象,并且每当找到一个非零元素时,可以使用.push_back句柄来动态调整向量大小。

如果您正在尝试创建新图像,则必须明确要查看什么类型的图像,因为如果您不知道有多少非零元素,如何设置宽度和高度?此外,您可能会得到奇数个元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接