@marol'ün yorumları sayesinde, aşağıdaki uygulamaya yerleştim. Hangi değerlerin değiştirilmesi gerektiğini şart koşmak için C++ 11 lambda fonksiyonlarını kullanıyorum. gücünü göstermek için, benim durumum [MAX_VAL
, MIN_VAL
] değer aralığı dışına çıktığında DEFAULT_VAL
için ayarlamaktır:
#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);
.
.
.
}
Bu çok güçlü! İfadenin ikinci kısmını daha karmaşık hale getirerek eşikleme, vb. Için kullanılabilir. Bunu dokümantasyonda veya öğreticilerde bulmak imkansız görünüyor. Bu yayını tanıtmalıyız, böylece insanlar bunu kullanmayı biliyor! Ne yazık ki, bileşik ifadeyle çalışmak gibi görünmüyor - yani bu işler: 'cv :: Mat newMask = maske <= 2;' ancak bu, cv :: Mat newMask = mask> 2 && mask <5; ' –
@DavidDoria sadece şimdi aklıma gelen iki ek geçici maske kullanmaktır, yani cv :: Mat maskGreaterThan2 = M> 2; cv :: Mat maskLessThan5 = M <5; cv :: Mat maskesi = kitleGreaterThan2 ve maskLessThan5. Ne yazık ki bu, burada elde ettiğimiz verimlilik artışına kıyasla gerçekten hafıza ve zaman pahalıdır. – marol