用opencv生成4位数字验证码,数字随机小角度旋转,数字位置不重叠,写出代码
时间: 2024-04-17 22:24:58 浏览: 116
以下是使用OpenCV生成4位数字验证码的示例代码,其中数字会随机进行小角度旋转,并且数字位置不会重叠:
```python
import cv2
import numpy as np
import random
# 随机生成4位数字验证码
def generate_verification_code(width, height):
code = str(random.randint(1000, 9999))
# 创建白色背景图像
bg_color = (255, 255, 255)
img = np.ones((height, width, 3), dtype=np.uint8) * bg_color
# 设置字体、字体大小、字体厚度
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
font_thickness = 2
# 随机生成每个数字的位置和角度
positions = random.sample(range(width // 4, width * 3 // 4), len(code))
angles = [random.randint(-30, 30) for _ in range(len(code))]
# 在图像上绘制每个数字
for i, digit in enumerate(code):
# 随机生成数字颜色(黑色或者深灰色)
digit_color = (random.randint(0, 50), random.randint(0, 50), random.randint(0, 50))
# 计算数字的起始位置
(digit_width, digit_height), _ = cv2.getTextSize(digit, font, font_scale, font_thickness)
x = positions[i] - digit_width // 2
y = random.randint(digit_height, height - digit_height)
# 旋转数字并绘制到图像上
M = cv2.getRotationMatrix2D((x + digit_width // 2, y), angles[i], 1)
digit_img = cv2.warpAffine(img, M, (width, height), borderValue=bg_color)
cv2.putText(digit_img, digit, (x, y), font, font_scale, digit_color, font_thickness)
# 将数字图像与背景图像叠加
img = cv2.bitwise_or(img, digit_img)
return img
# 生成验证码并显示
width, height = 200, 80
verification_code = generate_verification_code(width, height)
cv2.imshow("Verification Code", verification_code)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
上述代码中,首先定义了一个`generate_verification_code`函数来生成4位数字验证码。在函数内部,使用`cv2.putText`函数在图像上绘制每个数字,并通过旋转矩阵`M`进行小角度的旋转操作。最后,将每个数字图像与背景图像进行叠加,得到最终的验证码图像。
可以根据需要调整验证码的宽度、高度、字体大小等参数,以及旋转角度的范围和数字颜色的范围,来生成符合要求的验证码图片。
阅读全文