Dank @marols Kommentaren habe ich mich für die folgende Implementierung entschieden. Ich verwende C++ 11 Lambda-Funktionen, um zu bestimmen, welche Werte geändert werden müssen. Um seine Macht zu demonstrieren, ist mein Zustand DEFAULT_VAL
zu setzen, wenn der Wert aus dem Bereich [MIN_VAL
, MAX_VAL
]:
#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);
.
.
.
}
Das ist so mächtig! Es kann für die Schwellenwertbildung usw. verwendet werden, indem nur der zweite Teil des Ausdrucks komplexer gemacht wird. Es scheint unmöglich zu sein, dies in der Dokumentation oder den Anleitungen zu finden. Wir sollten diesen Beitrag bewerben, damit die Leute ihn nutzen können! Leider scheint es nicht mit zusammengesetzten Ausdruck zu funktionieren - das heißt: 'cv :: Mat newMask = Maske <= 2;' aber das ist nicht 'cv :: Mat newMask = Maske> 2 && Maske <5; ' –
@DavidDoria nur was mir in den Sinn kommt, ist die Verwendung von zwei zusätzlichen temporären Masken, zB cv :: Mat maskGreaterThan2 = M> 2; cv :: Mat maskLessThan5 = M <5; cv :: Mat Maske = MassGreaterThan2 & MaskeLessThan5. Leider ist dies im Vergleich zum Produktivitätsgewinn, den wir hier erreichen, wirklich speicher- und zeitaufwendig. – marol