• opencv图形绘制2


    目录

    制作宣传语(中文)

    制作宣传语(英文)

    绘制标记

    鼠标交互绘制十字线

    鼠标交互绘制图形

    鼠标交互制作几何画板

    滚动条控制

    鼠标事件练习


    制作宣传语(中文)

    1. import cv2
    2. import numpy as np
    3. from PIL import Image, ImageDraw, ImageFont # Pillow库(由Image,ImageDraw,ImageFont模块组成),用于图像处理
    4. def add_text(img, text, left, top, color=(0, 255, 0), size=20):
    5. # 该函数接受图像、文字、起始位置、颜色和字体大小作为输入参数。
    6. # isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。
    7. if isinstance(img, np.ndarray): # 检查输入的图像是否是一个NumPy数组。
    8. img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    9. # 如果输入的图像是一个NumPy数组,那么这行代码将把BGR图像(OpenCV默认的格式)转换为RGB图像(Pillow库需要的格式)。
    10. draw = ImageDraw.Draw(img)
    11. # 使用Pillow的ImageDraw模块在给定的图像上创建一个可以绘制的位置。
    12. font_text = ImageFont.truetype("font/simsun.ttc", size, encoding="utf-8")
    13. # 加载了一个TrueType字体文件(“simsun.ttc”),并设定字体大小。
    14. draw.text((left, top), text, color, font=font_text)
    15. # draw.text()在指定的位置上以给定的颜色和字体绘制文字。
    16. return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
    17. # 将Pillow的图像对象转换回NumPy数组,然后将颜色空间从RGB转换回BGR。
    18. img = np.ones((300, 512, 3), np.uint8) * 255
    19. img = add_text(img, "普天同庆 爱我中华", 30, 120, (255, 0, 0), 50) # 白色
    20. cv2.imshow("img", img)
    21. cv2.waitKey(0)
    22. cv2.destroyAllWindows()

    制作宣传语(英文)

    # cv2.putText函数在图像上添加文本
    # cv2.putText(img, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
    '''
        img:图像
        text:要写入的文本
        org:文本的左下角坐标 (x, y)
        font:字体类型
        fontScale:字体大小
        color:字体颜色
        thickness:线条的粗细
        lineType:线条类型
        bottomLeftOrigin:这个参数是False,坐标系统是从左上角到右下角(默认),如果设置为True,坐标系统将从左下角到右上角。

    '''

    1. # encoding=utf-8
    2. import cv2
    3. import numpy as np
    4. img = np.zeros((512, 512, 3), np.uint8)
    5. # cv2.FONT_HERSHEY_SIMPLEX是cv2库内置的一种等宽字体,无需加载外部字体文件,因此使用起来更为方便。
    6. # fontScale=2是字体的大小比例,这个值越大,字体就越大
    7. # thickness=2是文本的线条宽度。这个值越大,文本就越粗。
    8. # lineType=cv2.LINE_AA是线条的类型。这里使用的是抗锯齿线型,这种线型可以使得文本的边缘更加平滑。
    9. cv2.putText(img, " HELLO OPENCV", (0, 300), cv2.FONT_HERSHEY_SIMPLEX, fontScale=2, color=(105, 219, 64), thickness=2,
    10. lineType=cv2.LINE_AA)
    11. cv2.imshow("putText ", img)
    12. cv2.waitKey(0)
    13. cv2.destroyAllWindows()

    绘制标记

    1. # encoding=utf-8
    2. import numpy as np
    3. import cv2
    4. img = np.ones((320, 320, 3), np.uint8) * 255
    5. # cv2.drawMarker()函数在图像上绘制不同类型的标记
    6. '''
    7. markerType(标记类型):指定标记的类型。这里使用的标记类型分别为:
    8. 0:普通的黑色标记
    9. 2:叉号
    10. 3:圆圈
    11. 4:四边形
    12. 5:五边形
    13. 6:六边形
    14. 1:倒三角形
    15. 7:自定义形状(需要提供额外的参数)这里没有给出具体的形状参数,所以会显示一个默认的自定义形状。
    16. '''
    17. cv2.drawMarker(img, (30, 30), (0, 0, 255), 0)
    18. cv2.drawMarker(img, (60, 60), (0, 0, 255), 2)
    19. cv2.drawMarker(img, (90, 90), (0, 0, 255), 3)
    20. cv2.drawMarker(img, (120, 120), (0, 0, 255), 4)
    21. cv2.drawMarker(img, (150, 150), (0, 0, 255), 5)
    22. cv2.drawMarker(img, (180, 180), (0, 0, 255), 6)
    23. cv2.drawMarker(img, (210, 210), (0, 0, 255), 1)
    24. cv2.drawMarker(img, (240, 240), (0, 0, 255), 7)
    25. cv2.imshow('drawMarker', img)
    26. cv2.waitKey(0)
    27. cv2.destroyAllWindows()

    鼠标交互绘制十字线

    1. # encoding=utf-8
    2. import cv2
    3. import numpy as np
    4. # 回调函数
    5. def onmouse_pick_points(event, x, y, flags, param):
    6. if event == cv2.EVENT_LBUTTONDOWN: # cv2.EVENT_LBUTTONDOWN 鼠标左键
    7. print("x=%d,y=%d" % (x, y))
    8. # 图像上绘制标记
    9. cv2.drawMarker(param, (x, y), (0, 0, 255)) # 图像 坐标 颜色
    10. # 新建画布
    11. image = np.ones((256, 256, 3), np.uint8) * 255
    12. # 新建窗口
    13. cv2.namedWindow("pick_points",0)
    14. # 使用setMouseCallback函数为图像窗口绑定鼠标回调函数
    15. cv2.setMouseCallback("pick_points", onmouse_pick_points, image)
    16. # 循环,按下ESC键退出循环
    17. while True:
    18. cv2.imshow("pick_points", image)
    19. key = cv2.waitKey(30)
    20. if key == 27:
    21. break
    22. # 销毁窗口
    23. cv2.destroyAllWindows()

    鼠标交互绘制图形

    1. import cv2
    2. import numpy as np
    3. def draw_rectangle(event, x, y, flags, param):
    4. global ix, iy # 设置全局变量ix和iy为鼠标左键按下时的x和y坐标
    5. if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键
    6. ix, iy = x, y
    7. print("point1:=", x, y)
    8. elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键释放
    9. # 打印出第二个点的坐标以及矩形的宽度和高度,并在图像上绘制矩形。
    10. print("point2:=", x, y)
    11. print("width=", x - ix)
    12. print("height=", y - iy)
    13. cv2.rectangle(img, (ix, iy), (x, y), (0, 0, 255), 2)
    14. img = np.ones((512, 512, 3), np.uint8) * 255
    15. cv2.namedWindow('image')
    16. cv2.setMouseCallback('image', draw_rectangle)
    17. while True:
    18. cv2.imshow('image', img)
    19. key = cv2.waitKey(30)
    20. if key == 27:
    21. break
    22. cv2.destroyAllWindows()

    鼠标交互制作几何画板

    1. import numpy as np
    2. import cv2
    3. # 定义一个函数draw_circle,它接受五个参数:事件类型,x坐标,y坐标,标志和参数。
    4. def draw_circle(event, x, y, flags, param):
    5. # 声明全局变量ix和iy,这两个变量被用来存储鼠标左键按下时的位置。
    6. global ix, iy
    7. # 声明全局变量drawing,这个变量被用来标记是否正在绘制图形。
    8. global drawing
    9. # 如果事件是鼠标左键按下:
    10. if event == cv2.EVENT_LBUTTONDOWN:
    11. # 将drawing设为True,表示开始绘制图形。
    12. drawing = True
    13. # 将鼠标左键按下的x和y坐标赋值给ix和iy。
    14. ix, iy = x, y
    15. # 如果事件是鼠标移动:
    16. elif event == cv2.EVENT_MOUSEMOVE:
    17. # 如果drawing为True,表示正在绘制图形:
    18. if drawing:
    19. # 如果mode为True,则绘制一个矩形。这里的矩形的颜色是绿色(RGB值为(0,255,0))。
    20. if mode:
    21. cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
    22. # 如果mode为False,则绘制一个圆。这里的圆的直径是5个像素。
    23. else:
    24. cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
    25. # 如果事件是鼠标左键松开:
    26. elif event == cv2.EVENT_LBUTTONUP:
    27. # 将drawing设为False,表示停止绘制图形。
    28. drawing = False
    29. # 如果mode为True,则绘制一个矩形。
    30. if mode:
    31. cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
    32. # 如果mode为False,则绘制一个圆。这里的圆的直径是5个像素的随机值。颜色是红色和绿色(RGB值为(0,随机值,随机值))的混合。
    33. else:
    34. cv2.circle(img, (x, y), 5 * np.random.randint(5, 15),
    35. (0, np.random.randint(200, 255), np.random.randint(200, 255)), -1)
    36. # 设置drawing为False,表示开始时没有正在绘制图形。
    37. drawing = False
    38. # 设置mode为True,表示开始时默认绘制矩形。
    39. mode = True
    40. # 将ix和iy初始化为-1,表示开始时没有鼠标左键被按下的位置。
    41. ix, iy = -1, -1
    42. # 创建一个512x512的黑色图像。注意这个图像是三通道的,每个通道的像素值都是0(也就是黑色)。
    43. img = np.zeros((512, 512, 3), np.uint8)
    44. # 创建一个名为'image'的窗口,并设置鼠标回调函数为draw_circle。这样当鼠标在窗口内移动或者点击时,就会调用draw_circle函数。
    45. cv2.namedWindow('image')
    46. cv2.setMouseCallback('image', draw_circle)
    47. # 进入一个无限循环,显示图像并等待按键输入。
    48. while True:
    49. # 在'image'窗口中显示图像。
    50. cv2.imshow('image', img)
    51. # 等待按键输入,按键的ASCII值在返回之前会被过滤掉(只保留一个字节)。这里等待的时间是无限长,所以只会返回有效的ASCII值或者ESC键的值(ASCII值为27)。
    52. k = cv2.waitKey(1) & 0xFF
    53. # 如果按键是'm':
    54. if k == ord('m'):
    55. # 将mode取反,也就是切换绘制矩形和圆形的模式。
    56. mode = not mode
    57. # 如果按键是ESC键(ASCII值为27):
    58. elif k == 27:
    59. # 跳出无限循环,结束程序。
    60. break
    61. # 销毁所有创建的窗口。

    滚动条控制

    1. # 导入cv2库,这是一个开源的计算机视觉库
    2. import cv2
    3. # 导入numpy库,这是一个用于进行数组操作的库
    4. import numpy as np
    5. # 定义一个名为update_alpha的函数,函数功能为更新alpha值
    6. def update_alpha(x):
    7. # 全局变量alpha,储存alpha值
    8. global alpha, img, img2
    9. # 获取alpha的当前位置
    10. alpha = cv2.getTrackbarPos('Alpha', 'hehua')
    11. # 将alpha值乘以0.01,可能是为了将其缩放到一个合适的范围
    12. alpha = alpha * 0.01
    13. # 更新img的值,此处的img2可能未定义,或者定义在函数外部
    14. img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))
    15. # 定义一个名为update_beta的函数,功能为更新beta值
    16. def update_beta(x):
    17. # 全局变量beta,储存beta值
    18. global beta, img, img2
    19. # 获取beta的当前位置
    20. beta = cv2.getTrackbarPos('Beta', 'hehua')
    21. # 更新img的值
    22. img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))
    23. # 初始化alpha的值为0.1
    24. alpha = 0.1
    25. # 初始化beta的值为60
    26. beta = 60
    27. # 定义图片的路径,此处的路径似乎不完整,通常应该是一个完整的文件路径如'path/to/your/image.jpg'
    28. img_path = "hehua..jpg"
    29. # 通过cv2.imread读取图片路径的图片,将图片存储在img变量中
    30. img = cv2.imread(img_path)
    31. # 再次读取同一图片路径的图片,将图片存储在img2变量中,此处可能img2未被使用或未被初始化
    32. img2 = cv2.imread(img_path)
    33. # 创建一个名为'hehua'的窗口,如果窗口已存在则会被重绘
    34. cv2.namedWindow('hehua')
    35. # 创建一个名为'Alpha'的滑动条,当滑动条的位置改变时,会调用update_alpha函数
    36. cv2.createTrackbar('Alpha', 'hehua', 0, 300, update_alpha)
    37. # 创建一个名为'Beta'的滑动条,当滑动条的位置改变时,会调用update_beta函数
    38. cv2.createTrackbar('Beta', 'hehua', 0, 255, update_beta)
    39. # 设置滑动条'Alpha'的初始位置为100
    40. cv2.setTrackbarPos('Alpha', 'hehua', 100)
    41. # 设置滑动条'Beta'的初始位置为10
    42. cv2.setTrackbarPos('Beta', 'hehua', 10)
    43. # 进入无限循环,每次循环都会显示图片,直到遇到退出条件
    44. while True:
    45. # 在'hehua'窗口显示图片
    46. cv2.imshow('hehua', img)
    47. # 等待30毫秒,如果没有键按下则继续等待,如果有键按下则获取该键的ASCII码并赋值给key
    48. key = cv2.waitKey(30)
    49. # 如果key的值为27(ASCII码对应于ESC键),则退出循环
    50. if key == 27:
    51. break
    52. # 销毁所有创建的窗口并退出程序
    53. cv2.destroyAllWindows()

    鼠标事件练习

    请编写一个程序,建立一个200*300的白色画布,在该画布上双击鼠标左键时以鼠标双击的位置为圆心画一个半径为20的蓝色圆形,
    鼠标右键双击时在鼠标双击的位置画一个边长为20的红色正方形(矩形的宽和高都为20),当单击ESC键时可以退出程序。
    1. # encoding=utf-8
    2. import numpy as np
    3. import cv2
    4. img = np.zeros((200, 320, 3), np.uint8) + 255 # 创建一幅白色图像
    5. def draw(event, x, y, flag, param):
    6. if event == cv2.EVENT_LBUTTONDBLCLK:
    7. cv2.circle(img, (x, y), 20, (255, 0, 0), -1) # 双击鼠标左键时画圆
    8. elif event == cv2.EVENT_RBUTTONDBLCLK:
    9. cv2.rectangle(img, (x, y), (x + 20, y + 20), (0, 0, 255), -1) # 双击鼠标右键时画矩形
    10. cv2.namedWindow('drawing')
    11. cv2.setMouseCallback('drawing', draw)
    12. while (True):
    13. cv2.imshow('drawing', img) # 显示图像
    14. k = cv2.waitKey(1)
    15. if k == 27: # 按【Esc】键时结束循环
    16. break
    17. cv2.destroyAllWindows()

  • 相关阅读:
    DNS服务器部署
    王道树5.3(上)
    【前端面试必知】JS面试之数据结构
    基于SpringBoot的旅游路线管理系统(源码+讲解+运行)做毕设/课设均可
    啥?PS一秒成图?Adobe的逆天黑科技大公开
    【DR_CAN-MPC学习笔记】2.最优化数学建模推导
    mysql怎么导入sql文件
    你应该知道的vue3.0优势对比
    PyQt5 数据库处理
    crypto:Rabbit
  • 原文地址:https://blog.csdn.net/m0_74261473/article/details/133820803