cv::goodFeaturesToTrack ne reprend pas toutes les fonctionnalités
Je suis en train d'utiliser cv::calcOpticalFlowPyrLK
mais parfois une assertion interne dans la fonction échoue. L'affirmation est npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0
. Je suis à l'aide d'OpenCV 2.3.1. Le code source de cette fonction est disponible ici.
Il est difficile pour envelopper ma tête autour de leur code, surtout à cause de mon peu d'expérience avec l'informatique graphique et de leur manque de commentaires. Pourquoi cette affirmation est-elle déclenchée et que fait-il dire à propos de mon problème?
Modifier: j'ai appeler la fonction comme suit:
cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors);
J'ai trouvé que la features
vecteur, qui a été obtenu par l'appel de cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);
avec un non-vide masque qui semble être suffisamment grand et une image valide, ne contient pas toutes les fonctionnalités. Comment cela peut-il arriver?
curBwFrame
skinMask
Je suis en mesure de reproduire le problème à l'aide de l'extrait de code suivant:
#include <vector>
#include <cassert>
#include <opencv2\opencv.hpp>
using std::vector;
using namespace cv;
int main() {
vector<Point2f> features;
cv::Mat curBwFrame = imread("curBwFrame.png");
cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY);
imwrite("test.png", curBwFrame);
cv::Mat skinMask = imread("skinMask.png");
cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY);
imwrite("test.png", skinMask);
cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);
assert(features.size() > 0);
return 0;
}
J'ai ajouté plus d'informations ci-dessus, mais je ne suis pas sûr de ce que d'autres renseignements pertinents. Je pourrais dump quelques gros fragments de code ici, mais il est probable qu'ils contient beaucoup d'informations non pertinentes.
Désolé pour mon mélanger des appels de fonction plus tôt. J'ai ajouté le bon extrait ci-dessus! Je peux poster le masque et l'image source pour
goodFeaturesToTrack
trop si c'est nécessaire.
OriginalL'auteur Pieter | 2012-06-05
Vous devez vous connecter pour publier un commentaire.
Le principal problème est que vos paramètres.Dans le OpenCV 2.3.2 documentation (pas de changement de compatibilité entre 2.3.1) c'est la description des paramètres de la méthode:
Paramètres:
les coins que l'on trouve, le plus fort d'entre eux est retourné.
des coins de l'image. Le paramètre valeur est multipliée par le meilleur
coin de mesure de la qualité, ce qui est le minimum des valeurs propres (voir
cornerMinEigenVal() ) ou la Harris fonction de la réponse (voir
cornerHarris() ). Les coins avec la mesure de qualité inférieure à la
produits sont rejetés. Par exemple, si le meilleur coin est de la qualité
mesure = 1500, et l'qualityLevel=0,01 , puis tous les coins avec
la mesure de la qualité de moins de 15 ans sont rejetées.
retourné coins.
doit avoir le type CV_8UC1 et de la même taille que l'image ), il
spécifie la région dont les coins sont détectés.
la covariation de la matrice sur chaque pixel de quartier. Voir
cornerEigenValsAndVecs() .
détecteur (voir cornerHarris()) ou cornerMinEigenVal().
Je vous recommande de jouer un peu avec qualityLevel et minDistance suffire à vos besoins.
Comment une valeur de 0,1 affecter la marge d'erreur? Je sais qu'il va augmenter, mais est-ce la plus couramment utilisée valeur de la qualité ou est-il considéré comme peu fiable?
Ce que vous entendez par marge d'erreur? goodFeaturesToTrack travaille sur un "grade" de la classification de chaque pixel sur une fenêtre avec la taille de la taille de bloc. Le plus grand cette "qualité" est plus probable que ce pixel est un, à juste titre, fonction dérivable, ce qui signifie que si cette fonctionnalité est vu dans l'autre comme différent de l'éclairage ambiant ou de l'appareil, la pose, il va encore être considérées comme la même fonction. Si un pixel n'ont pas une assez grande de qualité, il n'est pas classé comme une fonction. Le plus petit de la qualityLevel, plus la "qualité" nécessaire de classer un pixel comme une fonction, rendant l'extraction des caractéristiques moins diferentiable.
Merci pour vos réponses. Que +de 50 ans est à venir à votre façon!
OriginalL'auteur Ian Medeiros
Avez-vous essayé goodFeaturesToTrack sans masque pour voir si il détecte les caractéristiques à l'intérieur de la masqués région? Il est possible que, parce que l'image est sombre, et la région est un peu textureless, que goodFeaturesToTrack ne parvient pas à trouver les caractéristiques.
Vous pouvez également essayer de ORB ou RAPIDE au lieu de goodFeaturesToTrack. J'ai utilisé avec succès ORBE avec calcOpticalFlowPyrLK (mais n'essayez pas d'utiliser un masque).
Ou vous pouvez essayer d'éclaircir l'image ou même d'améliorer le contraste. Pas vraiment sûr si cela apporte des améliorations, car je pense que le plus gros problème de votre scénario, c'est que les objets de la scène n'ont pas assez de texture ou des coins, qui sont les plus caractéristiques appropriées pour ces détecteurs.
Je recommande que vous essayez de l'ORB et voir si vous obtenez plus de points.
Si il ne détecte ces points sans masque il est probable qu'il confirme ce que j'ai expliqué dans la réponse. Je vais mettre à jour avec plus d'informations.
OriginalL'auteur Rui Marques
L'image de démarrage dans la couleur? L'utilisation de cv::transformer pour améliorer le contraste de la couleur avant de les convertir en gris. Tirer pour une gamme complète de gris de 0 à 255. Ne vous inquiétez pas saturer l'image à l'extérieur du masque.
OriginalL'auteur Bobbi Bennett
Si votre code est similaire à celle:
Assurez-vous de ne pas oublier la déclaration de vérification de la taille de la fonction de vecteur (initial.elemSize() == 0).
Si ce vecteur est vide, la conversion à partir d'une Matrice de point de floating points réalisée par l'initial.convertTo() de la ligne ne se fera pas et l'affirmation apparaîtra lors de l'appel de calOpticalFlowPyrLK
OriginalL'auteur Fredo