Dessin de rectangle sur l'image opencv?
J'ai chargé une image à l'aide d'opencv bibliothèques python et maintenant je veux dessiner un rectangle à l'aide de la souris, mais tout de tracer le rectangle le rectangle doit être visible pour que la personne le dessin, il peut le placer de façon à ce que l'objet d'intérêt est complètement dans le rectangle mais mon code est de produire le résultat désiré
mon code est
import os
import sys
import numpy as np
import cv2
baseDir = '/home/aman/Downloads/shirt/'
filenames = next(os.walk(baseDir))[2]
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
tx,ty = -1,-1
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
print 'aman'
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.line(img, (ix,iy),(ix,y), 255, 1, 8, 0)
cv2.line(img, (ix,iy),(x,iy), 255, 1, 8, 0)
cv2.line(img, (ix,y),(x,y), 255, 1, 8, 0)
cv2.line(img, (x,iy),(x,y), 255, 1, 8, 0)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.rectangle(img,(ix,y),(x,y),(0,255,0),-1)
cv2.rectangle(img,(x,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
`
mais la sortie produite est quelque chose comme
Je ne veux pas ce genre de comportement, je veux juste un simple rectangle et pas pour chaque mouvement. Je sais que je devrais modifier le code de la souris déplacer l'événement, mais le problème est comment faire pour que quand la personne est le déplacement de la souris il est capable de voir le rectangle complet et quand il relâche le bouton du rectangle doit être fixé ?
Je ne sais vraiment pas comment le faire en Python (d'où le commentaire), mais l'idée est de dessiner chaque intermédiaire rectangle en faisant XOR entre la couleur de la ligne et de la couleur de l'image à chaque pixel. Puis, avant de dessiner le prochain rectangle, XOR à nouveau avec la couleur de la ligne pour annuler la dernière rectangle. En C++, vous auriez du le faire avec LineIterator. Seulement sur le dernier rectangle ne vous en tirer normalement dans la couleur finale.
OriginalL'auteur iec2011007 | 2015-03-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez penser que le processus de rendu dans tout autre rendu API comme l'OpenGL: mettre quelque chose sur l'écran, vous pouvez le nettoyer, puis tirer sur la zone propre.
Dans ce contexte, le nettoyage moyens de ramener l'image d'origine. S'appuyant sur cela signifie l'ajout de votre rectangles ou quoi que ce soit.
Donc, ce que je recommande est la création d'un
draw
méthode qui ne s'occupe que de cela. Appeler chaque fois qu'un changement pour le rendu de la cible est censé être fait.Un rapide extrait de code (pas de python véritable, juste pseudo-code):
Si vous souhaitez voir un exemple concret, voici un C++11 code qui vous permettra d'attirer plus d'un triangle, puis obtenir leurs centres de sortie en réponse à une saisie au clavier: https://gist.github.com/cirocosta/9f7a57bddb40c4e5cbca
OriginalL'auteur Ciro Costa
J'ai pu atteindre que dans l'arrière-plan noir avec le code suivant:-
Ceci a été réalisé par le chevauchement des plus âgés des rectangles avec le remplissage
Mais si tu veux plus d'image , je peux vous proposer des filigranes
OriginalL'auteur Abhijeet Sinha
Je suis juste de travailler à le même problème. La solution que j'ai trouvé est basée sur:
http://www.pyimagesearch.com/2015/03/09/capturing-mouse-click-events-with-python-and-opencv/
Tout fonctionne, mais je suis un peu malheureux sur les variables globales.
OriginalL'auteur tin man
J'ai toujours voulu un façon de faire glisser un rectangle facilement sur une image en utilisant opencv. Donc j'ai finalement écrit ce simple bibliothèque en python à l'aide d'opencv pour le faire. Découvrez la mise en œuvre ici.
https://github.com/arccoder/opencvdragrect
Si quelqu'un essaie. Je serais heureux d'entendre certains commentaires sur comment je peux l'améliorer ou toutes les questions que vous avez trouvé.
OriginalL'auteur arccoder