如何获取非零矩阵的值
How to get values of a Matrix which are non zero
我正在使用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
}
那么,我如何创建一个只有掩码满足的值的矩阵呢???
您可以尝试使用cv::SparseMat(http://docs.opencv.org/modules/core/doc/basic_structures.html#sparsemat),它只在散列中保留非零值。
当您将常规cv::Mat分配给cv::SparseMat时,它会自动捕获非零值。从那时起,您可以遍历非零值,并根据需要对其进行操作。
希望我答对了这个问题,它会有所帮助!
OpenCv确实支持矩阵表达式,如A > B
或A <= B
等。
这在cv::Mat 的文档中有说明
如果您只是想存储值,Mat对象可能不是最好的方法,因为它是为了包含图像而创建的。
在这种情况下,使用std::vector
对象而不是cv::Mat
对象,并且只要找到非零元素,就可以使用.push_back
句柄,这将动态调整向量的大小。
如果你试图创建一个新的图像,那么你必须明确你想看到什么样的图像,因为如果你不知道有多少非零元素,你如何设置宽度和高度?此外,您可能会得到奇数个元素。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- OCI在不知道表结构的情况下获取获取的数据