pyqt5笔记——截取QLabel图片四个顶点,做文档较正

要求

  1. 利用QLabel控件显示图片;
  2. 鼠标点击,获取单机坐标,根据四个顶点坐标,在图中画出截取区域;
  3. 确定,根据鼠标点击的四个点,求取单适应矩阵,做图像较正。

说明

画图

在QLabel画图,需要继承QLabel类,重写paintEventmouseReleaseEvent

需要注意的是,在mouseReleaseEvent中获取鼠标点击的点的时候,global_point = event.globalPos()是在你1920*1080的屏幕上的点击坐标,event.pos()是你在UI窗口中的坐标,UI界面左上角为(0,0),而用event.globalPos()获取UI界面左上角的坐标可能是(765,532),一般不为0。而真实对应的图片中的坐标则是pos()-(centralWidget.pos()+leftImgLabel.pos())具体见参考3。

有一个简单的方法,获得真实图片中的坐标,利用self.mapFromGlobal(global_point)即可。

在ImageLabel类中,pantEvent和mouseReleaseEvent代码如下:

    def paintEvent(self, event):
        QLabel.paintEvent(self, event)
        painter = QPainter()
        painter.begin(self)

        pen = QPen(Qt.red, 4 , Qt.DashDotLine)#虚线画笔
        painter.setPen(pen)

        for k in range(len(self.points)):
            if k + 1 != len(self.points):
                painter.drawLine(self.points[k][0], self.points[k][1], self.points[k + 1][0], self.points[k + 1][1])
            else:
                painter.drawLine(self.points[k][0], self.points[k][1], self.points[0][0], self.points[0][1])
        painter.end()

    # 开启标记功能时,获取点击坐标
    def mouseReleaseEvent(self, event):
        if len(self.points) < 4:
            global_point = event.globalPos()
            local_point = self.mapFromGlobal(global_point)

            point_x = local_point.x()
            point_y = local_point.y()
            self.points.append([point_x, point_y])

            self.update()#获取鼠标点击的点之后,通知画线

功能如下:

求解单适应矩阵

可以用 h, s = cv2.findHomography(src_point, dst_point, cv2.RANSAC, 10) 来求解。

我们获取上面的点范围是(400, 600)之后,需要利用mapfromLoal()函数,将点击的坐标,还原到真实图像(3024, 4536)上,需要注意的是,要让上面两个坐标值,是按比例缩放,否则,会有问题。mapfromLoal()代码如下:

    def mapfromLoal(self, points):
        points_origanal = []
        y_ratio = np.float32(self.image.shape[0] / self.image_label.height())
        x_ratio = np.float32(self.image.shape[1] / self.image_label.width())
        for point in points:
            points_origanal.append([point[0] * x_ratio, point[1] * y_ratio])

        return points_origanal

单适应矩阵求解如下:

            points = self.image_label.get_points()#获取image_label上点击的点
            #单适应矩阵
            po
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值