21xrx.com
2024-12-22 15:03:39 Sunday
登录
文章检索 我的文章 写文章
使用OpenCV根据4个点进行图像截图
2023-11-10 08:31:45 深夜i     --     --
OpenCV 图像截图 4个点

图像截图是计算机视觉领域中常见的任务之一。无论是在图像处理还是图像识别中,准确地选取所需的图像区域都是非常重要的。而在OpenCV中,我们可以利用4个点来进行图像截图,从而达到所需的效果。

首先,我们需要导入OpenCV库,并读取所要截图的图像。这可以通过使用cv2库的imread函数来实现,函数参数为图像的路径。

然后,我们需要在图像上选择4个点来定义我们所需的截图区域。这可以通过调用cv2库的imshow函数来实现,函数参数为图像的窗口名称和图像本身。在窗口中,我们可以使用鼠标来点击图像上的四个点,并记录它们的坐标。这可以通过调用cv2库的setMouseCallback函数来实现,在回调函数中,我们可以获取鼠标点击的位置坐标。

接下来,我们需要使用所选择的四个点来计算得到截图的宽度和高度。这可以通过计算所选择的点之间的距离来实现。然后,我们可以调用cv2库的getPerspectiveTransform函数来计算从选定区域到输出图像的透视变换矩阵。

最后,我们可以通过调用cv2库的warpPerspective函数来应用透视变换,并将结果保存为输出图像。函数参数为输入图像、透视变换矩阵和输出图像的大小。

下面是一个示例代码,展示了如何使用OpenCV根据4个点进行图像截图:

python

import cv2

import numpy as np

# 读取图像

image = cv2.imread('image.jpg')

# 创建窗口并显示图像

cv2.namedWindow('image')

cv2.imshow('image', image)

# 四个点的坐标

points = []

# 鼠标点击事件回调函数

def mouse_callback(event, x, y, flags, param):

  # 左键点击事件

  if event == cv2.EVENT_LBUTTONDOWN:

    points.append((x, y))

    

    # 绘制选定点

    cv2.circle(image, (x, y), 5, (0, 255, 0), -1)

    

    # 绘制连线

    if len(points) > 1:

      cv2.line(image, points[-2], points[-1], (0, 255, 0), 2)

    

    # 绘制最后的连线

    if len(points) == 4:

      cv2.line(image, points[0], points[-1], (0, 255, 0), 2)

      

      # 计算截图区域的宽度和高度

      width = np.linalg.norm(np.array(points[0]) - np.array(points[1]))

      height = np.linalg.norm(np.array(points[0]) - np.array(points[3]))

      

      # 透视变换

      src_pts = np.float32(points)

      dst_pts = np.float32([(0, 0), (width - 1, 0), (0, height - 1), (width - 1, height - 1)])

      matrix = cv2.getPerspectiveTransform(src_pts, dst_pts)

      result = cv2.warpPerspective(image, matrix, (int(width), int(height)))

      

      # 显示截图结果

      cv2.imshow('result', result)

      

# 设置鼠标事件回调函数

cv2.setMouseCallback('image', mouse_callback)

# 等待用户操作

cv2.waitKey(0)

cv2.destroyAllWindows()

在这个示例中,我们可以在原始图像上选择四个点来定义所需的截图区域。通过鼠标点击事件回调函数,我们可以获取所选点的坐标,并计算得到截图区域的宽度和高度。然后,我们使用透视变换将原始图像中选定区域的内容提取出来,并保存为输出图像。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复