OpenCV cv :: Mat设置if

时间:2014-05-09 20:20:48

标签: opencv mat

如果满足某些条件,是否有一种简单的方法可以将cv :: Mat中的所有值设置为给定值。例如,我有CV_32FC1,我想要设置0到20的所有值。在MATLAB中我会简单地完成这个:

M(M == 0) = 20;

3 个答案:

答案 0 :(得分:17)

您可以使用

cv::Mat mask = M == 0;
M.setTo(0.5, mask);

但是,它包括使用额外的内存来创建掩码,但是使用opencv API的解决方案因此可以应用于所有矩阵类型。如果考虑性能问题,可以直接引用Mat :: data来优化此混合矩阵类型的解决方案。

答案 1 :(得分:3)

这是look-up table的经典案例。它快速,简单,并且可以同时重新映射多个值。

答案 2 :(得分:2)

感谢@marol的评论,我决定在下面实施。我正在使用C ++ 11 lambda函数来调整需要更改的值。为了证明它的力量,我的条件是当值超出范围[DEFAULT_VALMIN_VAL]时设置为MAX_VAL

#include <functional>

#define MatType float
#define MatCmpFunc std::function<bool(const MatType&)>
.
.
.
// function which accepts lambda function to condition values which need to
// be changed
void MatSetIf(cv::Mat& inputmat, const MatType& newval, MatCmpFunc func) {
  float* pmat = (float*)inputmat.data;
  // iterate and set only values which fulfill the criteria
  for (int idx = 0; idx < inputmat.total(); ++idx) {
    if (func(pmat[idx])) {
      pmat[idx] = newval;
    }
  }
}
.
.
.
void main() {
  cv::Mat mymat(100,100,CV_32FC1);
  const float MIN_VAL = 10;
  const float MAX_VAL = 1000;
  const float DEFAULT_VAL = -1;
  .
  .
  .
  // declare lambda function which returns true when mat value out of range
  MatCmpFunc func = [&](const DepthMatType& val) -> bool {
    return (val < MIN_VAL || val > MAX_VAL) ? true : false;
  };
  // use lambda func above to set all out of range values to 50
  Mat32FSetIf(mymat, DEFAULT_VAL, func);
  .
  .
  .
}