1

有没有办法找出两个 cv::Mat 矩阵的元素是否在彼此可接受的容差范围内?

即如果 A = [a, b, c, d, e, f],并且 B = [a ± 5%, b ± 5%, c ± 5%, d ± 5%, e ± 5%, f ± 5 %]

我在想 compare() 函数可能有用,但我不确定如何实现它。

4

2 回答 2

2

我可以看到,OpenCV 似乎没有任何内置功能可以做到这一点,但是鉴于它们公开了迭代器,因此敲击某些东西应该非常简单:

template <typename T>
bool within_tolerance(const cv::Mat& m1, const cv::Mat& m2, const T& tolerance)
{
    auto compare = [](const T& v1, const T& v2) -> bool 
                   { return std::abs(v1 - v2) < tolerance * v1; };
    return std::equal(m1.begin<T>(), m1.end<T>(), m2.begin<T>(), compare);
}

编辑:我没有认真考虑比较;以上仅适用于无符号值。这可以用类似的东西来解决v2 > (1 - tolerance) * v1 && v2 < (1 + tolerance) * v1

于 2012-12-17T06:27:29.507 回答
0

我使用了这个,达到了预期的效果:

cv::Mat Upperbound, Lowerbound;
cv::Mat Baseplus;
cv::Mat Baseminus;

Baseplus = 1.1*Base.clone();
Baseminus = 0.9*Base.clone();

        compare(NewData, Baseminus, Lowerbound, CMP_GE);
        compare(NewData, Baseplus, Upperbound, CMP_LE);

        if (countNonZero(Lowerbound)>0) 
        {
            if (countNonZero(Upperbound)>0) 
            {
                if ((countNonZero(Upperbound)+countNonZero(Lowerbound))>4) 
                {
                    cout<<"Eye contact occurs in this frame"<<endl;
                }
            }
        }
于 2012-12-17T22:56:06.737 回答