我正在使用opencv将一些matlab代码翻译成c ++。我想获得满足条件的Matrix的值。我为此创建了一个蒙版,当我将它应用到原始矩阵时,我得到的原始矩阵大小相同,但是掩码中没有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
}
那么,我怎样才能创建一个只有掩码满足???
的值的矩阵答案 0 :(得分:4)
您可能会尝试使用cv :: SparseMat(http://docs.opencv.org/modules/core/doc/basic_structures.html#sparsemat),它只会在散列中保留非零值。
当您将常规cv :: Mat分配给cv :: SparseMat时,它会自动捕获非零值。从那时起,您可以迭代非零值并根据需要对其进行操作。
希望我得到正确的答案,这有帮助!
答案 1 :(得分:0)
OpenCv支持A > B
或A <= B
等矩阵表达式等。
这在Documentation off cv :: Mat
中有说明答案 2 :(得分:0)
如果您只是想存储值,则Mat对象可能不是最好的方法,因为它是为了包含图像而制作的。
在这种情况下,使用std::vector
对象而不是cv::Mat
对象,只要找到非零的元素,就可以使用.push_back
句柄,这将是动态的调整矢量大小。
如果您正在尝试创建新图像,那么您必须具体了解要查看的图像类型,因为如果您不知道有多少非零元素,那么如何设置宽度和身高?你最终可能会得到奇数个元素。