Python / OpenCV:event.pos()与正确的点击值

时间:2017-09-25 22:04:18

标签: python opencv coordinates

我们正在使用Python 3.6和OpenCV。

我们试图从呈现的图像中的两个点获得坐标(x,y)。

我们有setFrame功能来显示如下图像:

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)

另外,我们有getPos函数来获取(x,y)坐标:

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()

问题是当我们点击显示图像上的某个点时,坐标不正确。例如。我们点击一​​个点,我们看到此点上方的圆圈,(x,y)与我们点击的点不对应。

我们也尝试使用pygame获取坐标,但仍然没有运气。

我们必须进行某种转型吗?如果我们不使用self.video_frame.setScaledContents(True),则会在QPixmap中显示所呈现的图像。 你能帮帮我们吗?

1 个答案:

答案 0 :(得分:0)

我们找到了解决方案。

问题是QLabel尺寸与呈现的图像尺寸不对应。

QLabel尺寸为491x371,图像尺寸为512x512。所以我们必须转换点击的坐标,如:

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

现在命令cv2.circle(video[int(self.frame_3.text())-1],(x,y),3,(0,0,255),-1)将圆圈设计在正确的位置。