我是python的初学者,目前正在学习二维码检测和解码.我很难将检测到的二维码旋转到正确的位置.我已经用了minAreaRect()来旋转我的二维码,但它不起作用.有什么解决办法或正确的方法吗?谢谢

ROI2 = cv2.imread('ROI.png')
gray2 = cv2.cvtColor(ROI2, cv2.COLOR_BGR2GRAY)
blur2 = cv2.GaussianBlur(gray2, (9, 9), 0)
thresh2 = cv2.threshold(blur2, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Morph close
# kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# close2 = cv2.morphologyEx(thresh2, cv2.MORPH_CLOSE, kernel2, iterations=10)

# Find contours and filter for QR code
cnts2 = cv2.findContours(thresh2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts2 = cnts2[0] if len(cnts2) == 2 else cnts2[1]
c = sorted(cnts2, key=cv2.contourArea, reverse=True)[0]

draw = cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR)
cv2.drawContours(draw, [c], 0, (0, 255, 0), 2)

rotrect = cv2.minAreaRect(c)
box = cv2.boxPoints(rotrect)
box = numpy.int0(box)
cv2.drawContours(draw, [box], 0, (0, 0, 255), 2)

cv2.imshow('thresh', thresh2)
cv2.imshow('ROI', ROI2)
cv2.imshow('minarearect', draw)

thresh ROI minAreaRect output

推荐答案

据我所知,你正在try 对图像进行反扭曲.为此,我们需要首先计算旋转的边界框Angular ,然后执行线性变换.这个 idea 是使用

(center(x, y), (width, height), angle of rotation) = cv2.minAreaRect(...)

第三个参数为我们提供了反扭曲图像所需的Angular .


输入图像->输出结果

Skew angle: -39.99416732788086

密码

import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold
image = cv2.imread('2.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = 255 - gray
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Compute rotated bounding box
coords = np.column_stack(np.where(thresh > 0))
angle = cv2.minAreaRect(coords)[-1]

if angle < -45:
    angle = -(90 + angle)
else:
    angle = -angle
print("Skew angle: ", angle)

# Rotate image to deskew
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

cv2.imshow('rotated', rotated)
cv2.waitKey()

Note:参见Python OpenCV skew correction,了解使用投影轮廓法纠正倾斜的另一种方法.

Python相关问答推荐

使用Python C API重新启动Python解释器

Polars Select 多个元素产品

有没有方法可以修复删除了换码字符的无效的SON记录?

使用matplotlib pcolormesh,如何停止从一行绘制的磁贴连接到上下行?

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

将numpy数组存储在原始二进制文件中

使用mySQL的SQlalchemy过滤重叠时间段

try 与gemini-pro进行多轮聊天时出错

如何将ctyles.POINTER(ctyles.c_float)转换为int?

Pandas 都是(),但有一个门槛

运行终端命令时出现问题:pip start anonymous"

两个pandas的平均值按元素的结果串接元素.为什么?

我们可以为Flask模型中的id字段主键设置默认uuid吗

ODE集成中如何终止solve_ivp的无限运行

如何在Raspberry Pi上检测USB并使用Python访问它?

改进大型数据集的框架性能

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何在BeautifulSoup/CSS Select 器中处理regex?

Polars Group by描述扩展

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性: