La compréhension Rect en C++, OpenCV
Je suis en train de marquer les pixels à l'intérieur d'un rectangle. Le rectangle à être marqué est décidé dans une construction if-else. J'obtiens l'erreur suivante sur l'utilisation des rectangles qui sont définis dans l'une des if-else blocs:
"Échec de l'Assertion (0 <= roi.x && 0 < = roi.largeur && roi.x + roi.largeur <=m.cols && 0 <=roi.hauteur && roi.y +roi.hauteur <= m.les lignes)"
Voici l'extrait de code, je suis en utilisant:
if (faces.size() != 0){r = faces[0];}
if (eyes.size()!=0){r2 = eyes[0];}
markers(image.rows,image.cols)
if(faces.size() == 0){
cout << "No Face found";
rectangle_face = rectangle_old;
rectangle_inner = rectangle_inner_old;
rectangle_outer = rectangle_outer_old;
}
else {
pt1.x = r.x;
pt1.y = r.y;
pt2.x = pt1.x + r.width;
pt2.y = pt2.y + r.height;
pt1_inner.x = r.x + (r.width)/3;
pt1_inner.y = r.y + (r.height)/3;
pt1_outer.x = pt1.x;
pt1_outer.y = pt1.y;
pt2_inner.x = pt2.x - (r.width)/3;
pt2_inner.y = pt2.y - (r.height)/3;
pt2_outer.x = pt2.x;
pt2_outer.y = image.rows;
rectangle_face = r;
rectangle_inner = Rect(pt1_inner,pt2_inner);
rectangle_outer = Rect(pt2_outer,pt2_outer);
}
//rectangle_inner = Rect(pt1_inner,pt2_inner);
//rectangle_outer = Rect(pt2_outer,pt2_outer);
rectangle_old = rectangle_face;
rectangle_outer_old = rectangle_outer;
rectangle_inner_old = rectangle_inner;
//Setting all pixels to possible background first
markers.setTo(cv::GC_PR_BGD);
//It get stuck at the following two lines
cv::Mat1b fg_seed_inside_face = markers(rectangle_inner);
//Marking pixels in order. Note: Order is important here.
cv::Mat1b Prfg_seed_FaceExtended = markers(rectangle_outer);
"visages" est un vecteur de rectangles retourné à partir de la detectMultiScale.
Ce qui me déroute, c'est que si je déclare le rectangle_inner et rectangle_outer à l'extérieur de l'if-else blocs (comme c'est en commentaire dans le code-extrait de code, juste en dessous de l'autre), le code fonctionne très bien pour le cas où l 'si la condition n'est pas vrai. Donc, fondamentalement, je suis attendu pour déclarer mon rectangle_inner et rectangle_outer à l'extérieur de l'if-else blocs, qui ne fait pas de sens. Est-il un travail?
- si((0 <= roi.x ) && (0 < = roi.la largeur) && ((roi.x + roi.la largeur) <=m.cols ) && (0 <= roi.y ) && (0 <=roi.hauteur ) && ((roi.y +roi.hauteur )<= m.les lignes))
- Je désolé. N'ai pas très bien compris votre réponse. Pouvez-vous développer?
Vous devez vous connecter pour publier un commentaire.
Lorsque vous calculez l' (x,y) les coordonnées de votre intérieur et extérieur des points en vue de construire votre rectangles, vous devez vérifier que les coordonnées que vous obtenez en ajoutant ou en soustrayant à pt1 pt2 ou r.poids ou r.la hauteur n'est pas sorti de l'image. C'est assez souvent lorsque votre visage est tout près du bord de votre image.
Il peut être fait facilement en faisant quelque chose comme
Et répéter la vérification pour chaque coordonnée permet de calculer la. Lorsque vous soustrayez il suffit de vérifier que les coordonnées sont >= 0 et 0 si elles ne le sont pas.
Espère que cela aide..
if(faces.size() == 0){
..avez-vous vérifiérectangle_inner_old
etrectangle_outer_old
valeurs? Il ne devrait pas y avoir de différence dans l'attribution des valeurs dans ou hors du bloc si donc le problème doit être ailleurs..cv::Rect imageRect(0,0, imWidth,imHeight); adjustedRect = yourRect & imageRect;