python opencv生成钢琴键与五线谱的对照图

代码

做一个壁纸帮助学习钢琴。

import cv2
import numpy as np

badu = 5
baijiankuan = 46
heijiankuan = 24
baijianchang = 288
heijianchang = 190
fengxikuan = 1
zitishangxia = 15
zitizuoyou = 10
shuzizuoyou = 17
shuzishangxia = 10
img = np.ones([baijianchang, (baijiankuan + fengxikuan) * badu * 7], dtype=np.uint8) * 255
for i in range(fengxikuan):
    img[:, baijiankuan + i::baijiankuan + fengxikuan] = 0
for i in range(heijiankuan):
    for j in [0, 1, 3, 4, 5]:
        img[:heijianchang,
        baijiankuan + i - heijiankuan // 2 + j * (baijiankuan + fengxikuan)::(baijiankuan + fengxikuan) * 7] = 0
for i, j in enumerate(['C', 'D', 'E', 'F', 'G', 'A', 'B']):
    cv2.putText(img, j, (i * (baijiankuan + fengxikuan) + baijiankuan // 2 - zitizuoyou, baijianchang - zitishangxia),
                cv2.FONT_HERSHEY_SIMPLEX, 1, 0, 1, cv2.LINE_AA)
for i, j in enumerate(['c', 'd', 'e', 'f', 'g', 'a', 'b']):
    for k in range(badu - 1):
        cv2.putText(img, j, (
            i * (baijiankuan + fengxikuan) + baijiankuan // 2 - zitizuoyou + (baijiankuan + fengxikuan) * 7 * (k + 1),
            baijianchang - zitishangxia), cv2.FONT_HERSHEY_SIMPLEX, 1, 0, 1, cv2.LINE_AA)
    for k in range(badu - 2):
        cv2.putText(img, str(k + 1), (
            i * (baijiankuan + fengxikuan) + baijiankuan // 2 - zitizuoyou + (baijiankuan + fengxikuan) * 7 * (
                        k + 2) + shuzizuoyou,
            baijianchang - zitishangxia - shuzishangxia), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 0, 1, cv2.LINE_AA)

tupianchang = 470
wuxianpuweizhi1 = 120
wuxianpuweizhi2 = 300
wuxianpukuan = 20
wuxianpuxiankuan = 1
yinfuxianchang = 60
yinfuzuoyou = 12
yinfushangxia = 1
jiaxianchang = 30
img2 = np.zeros([tupianchang, (baijiankuan + fengxikuan) * badu * 7], dtype=np.uint8)
for i in range(fengxikuan):
    img2[:, baijiankuan + i::baijiankuan + fengxikuan] = 80
for i in range(wuxianpuxiankuan):
    img2[
    wuxianpuweizhi1 + i:wuxianpuweizhi1 + i + (wuxianpukuan + wuxianpuxiankuan) * 5:wuxianpukuan + wuxianpuxiankuan,
    :] = 255
    img2[
    wuxianpuweizhi2 + i:wuxianpuweizhi2 + i + (wuxianpukuan + wuxianpuxiankuan) * 5:wuxianpukuan + wuxianpuxiankuan,
    :] = 255
for i in range(20):
    cv2.ellipse(img2, (baijiankuan // 2 + i * (baijiankuan + fengxikuan),
                       wuxianpuweizhi2 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2),
                (wuxianpukuan // 2 + 2, wuxianpukuan // 2 - 3), -25, 0, 360, 255, -1, cv2.LINE_AA)
    if i < 3:
        for j in range((4 - i) // 2):
            for k in range(wuxianpuxiankuan):
                img2[wuxianpuweizhi2 + k + (wuxianpukuan + wuxianpuxiankuan) * 5:wuxianpuweizhi2 + k + (
                        wuxianpukuan + wuxianpuxiankuan) * (j + 6):wuxianpukuan + wuxianpuxiankuan,
                baijiankuan // 2 + i * (baijiankuan + fengxikuan) - jiaxianchang // 2:baijiankuan // 2 + i * (
                        baijiankuan + fengxikuan) + jiaxianchang // 2] = 255

    if i > 13:
        for j in range((i - 12) // 2):
            for k in range(wuxianpuxiankuan):
                img2[wuxianpuweizhi2 + k + (wuxianpukuan + wuxianpuxiankuan) * (-j - 1):wuxianpuweizhi2 + k + (
                        wuxianpukuan + wuxianpuxiankuan) * (0):wuxianpukuan + wuxianpuxiankuan,
                baijiankuan // 2 + i * (baijiankuan + fengxikuan) - jiaxianchang // 2:baijiankuan // 2 + i * (
                        baijiankuan + fengxikuan) + jiaxianchang // 2] = 255
for i in range(23):
    cv2.ellipse(img2, (baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan),
                       wuxianpuweizhi1 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2),
                (wuxianpukuan // 2 + 2, wuxianpukuan // 2 - 3), -25, 0, 360, 255, -1, cv2.LINE_AA)
    if i < 3:
        for j in range((4 - i) // 2):
            for k in range(wuxianpuxiankuan):
                img2[wuxianpuweizhi1 + k + (wuxianpukuan + wuxianpuxiankuan) * 5:wuxianpuweizhi1 + k + (
                        wuxianpukuan + wuxianpuxiankuan) * (j + 6):wuxianpukuan + wuxianpuxiankuan,
                baijiankuan // 2 + (i + 13) * (baijiankuan + fengxikuan) - jiaxianchang // 2:baijiankuan // 2 + (
                            i + 13) * (
                                                                                                     baijiankuan + fengxikuan) + jiaxianchang // 2] = 255

    if i > 13:
        for j in range((i - 12) // 2):
            for k in range(wuxianpuxiankuan):
                img2[wuxianpuweizhi1 + k + (wuxianpukuan + wuxianpuxiankuan) * (-j - 1):wuxianpuweizhi1 + k + (
                        wuxianpukuan + wuxianpuxiankuan) * (0):wuxianpukuan + wuxianpuxiankuan,
                baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan) - jiaxianchang // 2:baijiankuan // 2 + (
                            i + 12) * (
                                                                                                     baijiankuan + fengxikuan) + jiaxianchang // 2] = 255
for i in range(8):
    cv2.line(img2, (baijiankuan // 2 + i * (baijiankuan + fengxikuan) + yinfuzuoyou,
                    wuxianpuweizhi2 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 - yinfushangxia),
             (baijiankuan // 2 + i * (baijiankuan + fengxikuan) + yinfuzuoyou,
              wuxianpuweizhi2 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 - yinfushangxia - yinfuxianchang),
             255, 1, cv2.LINE_AA)
for i in range(8, 20):
    cv2.line(img2, (baijiankuan // 2 + i * (baijiankuan + fengxikuan) - yinfuzuoyou,
                    wuxianpuweizhi2 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 + yinfushangxia),
             (baijiankuan // 2 + i * (baijiankuan + fengxikuan) - yinfuzuoyou,
              wuxianpuweizhi2 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 + yinfushangxia + yinfuxianchang),
             255, 1, cv2.LINE_AA)
for i in range(8):
    cv2.line(img2, (baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan) + yinfuzuoyou,
                    wuxianpuweizhi1 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 - yinfushangxia),
             (baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan) + yinfuzuoyou,
              wuxianpuweizhi1 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 - yinfushangxia - yinfuxianchang),
             255, 1, cv2.LINE_AA)
for i in range(8, 23):
    cv2.line(img2, (baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan) - yinfuzuoyou,
                    wuxianpuweizhi1 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 + yinfushangxia),
             (baijiankuan // 2 + (i + 12) * (baijiankuan + fengxikuan) - yinfuzuoyou,
              wuxianpuweizhi1 - (i - 12) * (wuxianpuxiankuan + wuxianpukuan) // 2 + yinfushangxia + yinfuxianchang),
             255, 1, cv2.LINE_AA)
img3 = np.concatenate((img, img2), axis=0)
h, w = img3.shape
new_h = int(w / 16 * 9)
img4 = np.concatenate((np.zeros([new_h - h, w], dtype=np.uint8), img3), axis=0)
cv2.imwrite('1.png', img4)
cv2.imshow('a', img4)
cv2.waitKey()

结果图

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值