将变换矩阵应用于 OpenCV 中的 warpTransform

贝纽泰克

因此,我想转换图像,但无法真正找到使用 OpenCV 进行转换的正确方法。

我有图像的第一件事就是说 500x600px 里面有一个扭曲的东西,我想“拉直”看图像: 带有扭曲数独的图像

我正在像这样获得数独的轮廓:

cropped_image, contours, _ = 
cv2.findContours(cropped_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
max_contour = max(contours, key=cv2.contourArea)

然后我得到max_contour和图像极端像素(左上角、右上角、右下角和左下角)并获取变换矩阵并像这样变换图像:

x, y = cropped_image.shape
image_extreme_pixels = np.array([[0, y], [x, y], [x, 0], [0, 0]], dtype=np.float32)
c_x, c_y = [], []
for i in contour:
  c_x.append(i[0][0])
  c_y.append(i[0][1])
contour_extreme_pixels = np.array([
  [min(c_x), max(c_y)],
  [max(c_x), max(c_y)],
  [max(c_x), min(c_y)],
  [min(c_x), min(c_y)]],
  dtype=np.float32)

t_matrix = cv2.getPerspectiveTransform(contour_extreme_pixels, image_extreme_pixels)

transformed_image = cv2.warpPerspective(cropped_image, t_matrix, (y, x))


plt.imshow(cropped_image, interpolation='nearest', cmap=plt.cm.gray)

但是当我查看图像时,它以一种奇怪的方式发生了变化。我想拉伸数独的顶部,使其轮廓笔直。

你能指出我的代码有什么问题吗?我假设这可能是我创建 4 个极端像素的方式,然后将这些像素放入getPerspectiveTransform以获得转换矩阵,但尚未设法使其工作。

贝纽泰克

所以事实证明我发现的极端点是不正确的。在我们期望为矩形的形状中找到 4 个极值点的正确方法(众多方法之一)是这样的:

def get_contour_extreme_points(img, contour):
  m_point = image_center(img)
  l1, l2, l3, l4 = 0, 0, 0, 0
  p1, p2, p3, p4 = 0, 0, 0, 0

  for point in contour:
    d = distance(m_point, point[0])
    if inside_bottom_right(m_point, point[0]) and l1 < d:
      l1 = d
      p1 = point[0]
      continue
    if inside_bottom_left(m_point, point[0]) and l2 < d:
      l2 = d
      p2 = point[0]
      continue
    if inside_top_right(m_point, point[0]) and l3 < d:
      l3 = d
      p3 = point[0]
      continue
    if inside_top_left(m_point, point[0]) and l4 < d:
      l4 = d
      p4 = point[0]
      continue

  return np.float32([p1, p2, p3, p4])

def inside_bottom_right(center, point):
  return center[0] < point[0] and center[1] < point[1]

def inside_bottom_left(center, point):
  return center[0] > point[0] and center[1] < point[1]

def inside_top_right(center, point):
  return center[0] < point[0] and center[1] > point[1]

def inside_top_left(center, point):
  return center[0] > point[0] and center[1] > point[1]

def distance(p1, p2):
  return math.sqrt( ((p1[0]-p2[0])**2)+((p1[1]-p2[1])**2) )

def image_center(img):
  x, y = img.shape

  return tuple([x/2, y/2])

那么我将不得不小心图像的 4 个极值点的顺序。应该是这样的:

x, y = img.shape
img_extreme_points = np.float32([[x, y], [0, y], [x, 0], [0, 0]]) 

所以首先是右下极点,然后是左下角、右上角和左上角。只要极值点索引正确对应,矩阵也将被正确计算。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将OpenCV函数polylines()应用于C ++中的列表

来自分类Dev

如何将OpenCV函数polylines()应用于C ++中的列表

来自分类Dev

如何将泰勒级数扩展应用于opencv中的图像?

来自分类Dev

将函数应用于R中的列表矩阵

来自分类Dev

将函数应用于矩阵--arrayfun中的每个元素

来自分类Dev

将函数应用于R中矩阵的行

来自分类Dev

将阈值应用于MATLAB中的矩阵元素

来自分类Dev

根据其他列(R)中的值将变换应用于向量的列

来自分类Dev

使用OpenCV 3.0将颜色矩阵应用于RGB图像的最快方法?

来自分类Dev

如何在OpenCV中将转换矩阵应用于点?

来自分类Dev

openCV中的矩阵运算

来自分类Dev

将函数应用于R中两个矩阵的所有列对

来自分类Dev

将一堆函数应用于R中矩阵的列

来自分类Dev

Prolog将约束应用于矩阵中的原始列表项

来自分类Dev

Python Numpy将旋转矩阵应用于数组中的每一行

来自分类Dev

将函数应用于R中两个矩阵的所有列对

来自分类Dev

如何将函数应用于矩阵中的所有向量对

来自分类Dev

将 repmat 应用于具有不同输入的 Matlab 中矩阵的每一行

来自分类Dev

如何将&运算符应用于R中的布尔矩阵?

来自分类Dev

将变换应用于矩阵,而不是旋转和平移

来自分类Dev

了解OpenCV中的距离变换

来自分类Dev

openCV中的小波变换

来自分类Dev

OPENCV PYTHON中的透视变换

来自分类Dev

在OpenCV中应用遮罩

来自分类Dev

使用for()循环或apply()应用于矩阵中的引导程序

来自分类Dev

R - 将命令应用于矩阵中的所有行和列。逻辑地更改命令中使用的值

来自分类Dev

OpenCV 2.4.9(Python)中的概率Hough变换

来自分类Dev

将渐变应用于Android中的ListView中的行

来自分类Dev

矩阵函数是应用于整个矩阵还是Fortran中的每一行?

Related 相关文章

  1. 1

    如何将OpenCV函数polylines()应用于C ++中的列表

  2. 2

    如何将OpenCV函数polylines()应用于C ++中的列表

  3. 3

    如何将泰勒级数扩展应用于opencv中的图像?

  4. 4

    将函数应用于R中的列表矩阵

  5. 5

    将函数应用于矩阵--arrayfun中的每个元素

  6. 6

    将函数应用于R中矩阵的行

  7. 7

    将阈值应用于MATLAB中的矩阵元素

  8. 8

    根据其他列(R)中的值将变换应用于向量的列

  9. 9

    使用OpenCV 3.0将颜色矩阵应用于RGB图像的最快方法?

  10. 10

    如何在OpenCV中将转换矩阵应用于点?

  11. 11

    openCV中的矩阵运算

  12. 12

    将函数应用于R中两个矩阵的所有列对

  13. 13

    将一堆函数应用于R中矩阵的列

  14. 14

    Prolog将约束应用于矩阵中的原始列表项

  15. 15

    Python Numpy将旋转矩阵应用于数组中的每一行

  16. 16

    将函数应用于R中两个矩阵的所有列对

  17. 17

    如何将函数应用于矩阵中的所有向量对

  18. 18

    将 repmat 应用于具有不同输入的 Matlab 中矩阵的每一行

  19. 19

    如何将&运算符应用于R中的布尔矩阵?

  20. 20

    将变换应用于矩阵,而不是旋转和平移

  21. 21

    了解OpenCV中的距离变换

  22. 22

    openCV中的小波变换

  23. 23

    OPENCV PYTHON中的透视变换

  24. 24

    在OpenCV中应用遮罩

  25. 25

    使用for()循环或apply()应用于矩阵中的引导程序

  26. 26

    R - 将命令应用于矩阵中的所有行和列。逻辑地更改命令中使用的值

  27. 27

    OpenCV 2.4.9(Python)中的概率Hough变换

  28. 28

    将渐变应用于Android中的ListView中的行

  29. 29

    矩阵函数是应用于整个矩阵还是Fortran中的每一行?

热门标签

归档