2015-12-31 1 views
2

J'ai un dessin à l'intérieur fbo, et en essayant de réduire fbo taille en recadrant aux parties visibles en utilisant la boîte de délimitation. Voici une représentation visuelle de ce que je suis en train de réaliser: bounding box exampleRecadrer Fbo à un cadre dans Openframeworks

J'ai trouvé la solution: passer fbo données à pixels puis détecter les premiers pixels de couleur à gauche, à droite, en haut, la partie inférieure de l'image.

Dans la partie suivante du code, j'essaie de détecter l'intersection inférieure. Mais j'ai un problème étrange avec les pixels.

int w = 4; 
int h = 4; 

fbo.allocate(w, h, GL_RGBA); 
fbo.begin(); 
ofClear(0, 0); 
fbo.end(); 

fbo.begin(); 
ofSetColor(255, 0, 0); 
ofDrawRectangle(0, 0, 4, 2); 
fbo.end(); 

pixels.allocate(w, h, GL_RGBA); 

fbo.readToPixels(pixels); 

for(auto line = pixels.getLines().end(); line != pixels.getLines().begin(); --line){ 
    for(auto pixel: line.getPixels()){ 
     cout << "line: " << line.getLineNum() << " color: " << pixel.getColor() << endl; 
    } 
} 

sortie:

line: 4 color: 24, 215, 83, 118 
line: 4 color: 255, 127, 0, 0 
line: 4 color: 173, 7, 0, 0 
line: 4 color: 1, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 

line:1 semble bien, mais ce qui ne va pas avec line:4, ce sont les couleurs au hasard là? Après la reconstruction de l'application, ils ont peut-être disparu, mais avec la chance aléatoire. Peut-être qu'il y a une autre façon de recadrer fbo par des parties visibles de l'image? Cette solution ne fonctionne pas pour moi.

Répondre

0

Votre boucle est le problème. Ligne 4 points dans une zone de mémoire non initialisée alors que la ligne 0 est manquante. Votre rectangle est dessiné dans la ligne 0 et la ligne 1.

l'itérateur :: De la documentation end():

iterator Retour à fin Retourne un itérateur se référant à l'élément passé, la fin de la conteneur de vecteur.

L'élément passé-la-fin est l'élément théorique qui suivrait le dernier élément du vecteur. Il ne désigne aucun élément et ne doit donc pas être déréférencé.

Une question avec des réponses qui vous aideront à: Iterating C++ vector from the end to the begin

+0

Cela est logique. Je vous remercie! – Gordey