2016-01-08 2 views
1

Que se passe-t-il entre la ligne 129 et la ligne 133 dans this class de l'exemple d'application de détection de couleur blob?OpenCV4Android Sample App - que fait cet extrait de code?

QUELQUES CONTEXTE:

La vue de la caméra dans l'application ressemble à ceci: (Notez que dans la vue de la caméra, il y a une bordure noire autour du cadre de la caméra)

Image (If you can't see the image, check it here.)

De la ligne 114 à 128, ce qui suit se passe.

  1. int cols = mRgba.cols();cols() donne le nombre de colonnes dans une matrice. La matrice ici est le Mat représentant une image dans le flux en direct des images affichées (et non la vue complète de la caméra), c'est-à-dire la partie de la vue où est diffusée la diffusion en direct, EXCLUANT la bordure noire de la caméra .

  2. int rows = mRgba.rows();rows() donne le nombre de lignes dans le cadre de la caméra, la bordure noire EXCLUANT de la vue de la caméra.

  3. int xOffset = (mOpenCvCameraView.getWidth() - cols)/2; int yOffset = (mOpenCvCameraView.getHeight() - rows)/2;mOpenCvCameraView.getWidth() donne le nombre de lignes dans l'ensemble de vue de la caméra, à savoir le cadre de la caméra PLUS la bordure noire de la vue de la caméra autour du cadre. (mOpenCvCameraView.getWidth() - cols) donne la somme de la largeur de la bordure noire gauche et droite de la vue de la caméra. (mOpenCvCameraView.getWidth() - cols)/2 ou xOffset donne la largeur de la bordure noire d'un côté, c'est-à-dire le côté droit ou gauche, la bordure noire de la vue de la caméra. De même pour yOffset

  4. int x = (int)event.getX() - xOffset; int y = (int)event.getY() - yOffset;getX() renvoie la coordonnée X de cet événement pour le premier index de pointeur. Donc getX() donne la distance de la région touchée du côté extrême gauche de la vue de la caméra, qui comprend la bordure noire sur la gauche. Donc event.getX()-xOffset ou int x est la distance de la région touchée du côté extrême gauche du "cadre" de la caméra (qui n'inclut pas la bordure noire de la vue de la caméra). De même pour int y.

sont ensuite les lignes que je n'ai pas la moindre idée.

Répondre

0

Je suppose que vous vous posez au sujet de ces lignes:

touchedRect.x = (x>4) ? x-4 : 0; 
touchedRect.y = (y>4) ? y-4 : 0; 

touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x; 
touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y; 

D'après ce que je peux dire, il est fondamentalement juste faire en sorte que la hauteur et la largeur ne Rectangle vagabonder pas hors du cadre.

Répartition des raisons pour lesquelles -

L'opérateur ? (appelé l'opérateur ternaire) en Java est essentiellement un raccourci de if/else - la ligne touchedRect.x = (x>4) ? x-4 : 0 signifie

if (x>4) { 
    touchedRect.x = x-4; 
} else { 
    touchedRect.x = 0; 
} 

Ainsi, pour la ligne 129, si x > 4, définir touchedRect.x à x-4, sinon 0.

ligne 130, si y > 4, définir touchedRect.y à y-4, sinon 0.

ligne 131, touchedRect.width devient x+4 - touchedRect.x si x+4 < cols, sinon touchedRect.width devient cols - touchedRect.x

ligne 132, touchedRect.height devient y+4-touchedRect.y si y+4 < rows, sinon il devient rows - touchedRect.y