EmguCV / OpenCV ajout d'image / soustraction
-
16-09-2019 - |
Question
J'utilise EmguCV et essaie de soustraire 2 images pour créer un filtre similaire à Aforge de .NET le filtre de MoveTowards.
est ce que ma version légèrement modifiée de l'URL ci-dessus essaie de faire. Compte tenu de 2 images, la source et la superposition - il se déplace lentement l'image source vers la superposition. Il le fait en fonction de ce qui suit:
result = source + movementFactor * (overlay - source);
où conséquence, la source et la superposition des images et movementFactor est le taux de variation dans la gamme de 0 à 1.
Quand j'ai essayé dans votre code avec movementFactor égal à 1, les résultats avaient l'air foiré (il y avait quelque chose comme une traînée de mouvement). Pour tester davantage, je l'ai enlevé movementFactor de l'équation ci-dessus, et fait result = source de + superposition - la source. Je me attendais à voir l'image de surimpression comme résultat, que je l'ai fait, mais avec une région de l'image qui clignotait.
Je suppose que les intensités de pixels se clipsés les limites supérieures ou inférieures lorsque l'addition / soustraction a lieu.
Je peux accomplir ce que je veux ceci:
for (int i = 0; i < src.Height; i++)
{
for (int j = 0; j < src.Width; j++)
{
res[i, j] = new Gray(src[i, j].Intensity + movementFactor * (ovr[i, j].Intensity - src[i, j].Intensity));
}
}
Mais cela ralentit considérablement le traitement. Comment puis-je surmonter le problème d'addition / soustraction ou le problème de vitesse avec ce qui précède? Merci pour vos réponses!
La solution
Je vais poster la réponse que je trouve ici, au cas où quelqu'un traverse le même problème à l'avenir.
Voici comment vous le faire:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Source: forum de EmguCV, voici la poste qui m'a donné la réponse
Autres conseils
Je vais poster la réponse que je trouve ici, au cas où quelqu'un traverse le même problème à l'avenir.
Voici comment vous le faire:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size); CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Source: forum de EmguCV, est ici la poste qui m'a donné la réponse
Notez qu'il existe une syntaxe plus propre pour que:
var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);