2017-09-25 1 views
0

Nous utilisons Python 3.6 et OpenCV.Python/OpenCV: event.pos() ne correspond pas aux valeurs correctes cliquées

Nous essayons d'obtenir les coordonnées (x, y) à partir de deux points d'une image présentée.

Nous avons fonction setFrame pour afficher l'image comme ci-dessous:

def setFrame(self): 

     global video 

     num = self.frame_scrollBar.value() 
     self.video_frame.setScaledContents(True); #QLabel will resize itself to the size of pixmap/image and scroll-bar will get visible. 
     cvRGBImg = cv2.cvtColor(video[num-1], cv2.COLOR_BGR2RGB) #Convert opencv RGB image to QImage 
     qimg = QtGui.QImage(cvRGBImg.data,cvRGBImg.shape[1], cvRGBImg.shape[0], QtGui.QImage.Format_RGB888) 
     qpm = QtGui.QPixmap.fromImage(qimg) 
     self.video_frame.setPixmap(qpm) 

De plus, nous avons la fonction getPos afin d'obtenir le (x, y) Coordonnées:

def getPos(self, event): 

     global setPoint 
     global coords 
     global video 

     if setPoint == True: 
      x = event.pos().x() 
      y = event.pos().y() 

      coords.append((x,y)) 
      cv2.circle(video[int(self.frame_3.text())-1],(x,y),3,(0,0,255),-1) 
      self.setFrame() 
      if len(coords)==2: 
       setPoint = False 
       print (coords[0]) 
       print (coords[1]) 
       self.message() 

Le problème est que lorsque nous cliquons sur un point de l'image présentée, les coordonnées ne sont pas correctes. Par exemple. On clique sur un point a on voit le cercle au dessus de ce point et les (x, y) ne correspondent pas au point sur lequel on a cliqué.

Nous avons également essayé d'obtenir les coordonnées en utilisant pygame mais toujours pas de chance.

Devons-nous effectuer une sorte de transformation? Dans le cas où nous n'utilisons pas self.video_frame.setScaledContents(True) alors l'image présentée est déplacée dans le QPixmap. Pouvez-vous s'il vous plaît nous aider?

Répondre

0

Nous avons trouvé la solution.

Le problème est que la taille QLabel ne correspondait pas à la taille d'image présentée.

QLabel La taille est 491x371 et la taille de l'image est 512x512. Nous devons donc transformer les coordonnées cliqués comme:

x = event.pos().x() 
x = int(x*(512/491)) # coordinates/pixels must be integers 
y = event.pos().y() 
y = int(y*(512/371)) 

Alors maintenant, la commande cv2.circle(video[int(self.frame_3.text())-1],(x,y),3,(0,0,255),-1) conçoit le cercle dans la bonne position.