2 つの cv::Mat 行列の要素が互いに許容範囲内にあるかどうかを確認する方法はありますか?
つまり、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& 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
。
私はこれを使用して、望ましい効果を得ました:
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;
}
}
}