有没有办法找出两个cv :: Mat矩阵的元素是否在可接受的容差范围内?
即。如果A = [a,b,c,d,e,f],B = [a±5%,b±5%,c±5%,d±5%,e±5%,f±5% ]
我认为compare()函数可能有用,但我不确定如何实现它。
答案 0 :(得分: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
。
答案 1 :(得分: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;
}
}
}