C++ Opencv::Mat公差间隔
是否有办法确定两个cv::Mat矩阵的元素彼此是否在可接受的公差范围内 i、 e.如果A=[A,b,c,d,e,f]和b=[A±5%,b±5%,c±5%,d±5%,e±5%,f±5%]C++ Opencv::Mat公差间隔,c++,opencv,matrix,intervals,C++,Opencv,Matrix,Intervals,是否有办法确定两个cv::Mat矩阵的元素彼此是否在可接受的公差范围内 i、 e.如果A=[A,b,c,d,e,f]和b=[A±5%,b±5%,c±5%,d±5%,e±5%,f±5%] 我认为compare()函数可能很有用,但我不确定如何实现它。OpenCV似乎没有任何内置函数可以做到这一点,我可以看到,但是如果它们公开迭代器,那么实现某些功能应该非常简单: template <typename T> bool within_tolerance(const cv::Mat&
我认为compare()函数可能很有用,但我不确定如何实现它。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);
}
模板
公差范围内的布尔值(常数cv::材料和m1,常数cv::材料和m2,常数T和公差)
{
自动比较=[](常量T&v1,常量T&v2)->bool
{return std::abs(v1-v2)
编辑:我没有认真考虑比较;以上仅适用于无符号值。这可以用类似于
v2>(1-公差)*v1和&v2<(1+公差)*v1
的东西来解决,我使用它达到了预期的效果:
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;
}
}
}
cv::Mat上限,下限;
cv::Mat Baseplus;
cv::Mat Baseminus;
Baseplus=1.1*Base.clone();
Base减号=0.9*Base.clone();
比较(NewData、base减号、Lowerbound、CMP_GE);
比较(NewData、Baseplus、上限、CMP_LE);
如果(计数非零(下限)>0)
{
if(countNonZero(上限)>0)
{
如果((countNonZero(上界)+countNonZero(下界))>4)
{
库特