首页 > 编程语言 >opencv-python 1

opencv-python 1

时间:2023-03-23 17:44:35浏览次数:58  
标签:鼠标 img python image EVENT opencv cv 255

参考地址:https://opencv-python-tutorials.readthedocs.io/zh/latest/

安装

pip install opencv-python

以下所有内容来自上边连接中整理,使用中参考上边连接中的文档

图片

import cv2 as cv
from matplotlib import pyplot as plt

def image():
    # 以灰度方式打开图片
    img = cv.imread('C:\\Users\\yuyalong\\Pictures\\Camera Roll\\15.jpg', 0)
    print(img)

    # 用pyplot显示
    plt.imshow(img, cmap='gray', interpolation='bicubic')
    plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
    plt.show()

    # 用opencv显示
    cv.imshow('image', img)
    k = cv.waitKey(0)
    if k == 27:  # wait for ESC key to exit
        cv.destroyAllWindows()
    elif k == ord('s'):  # wait for 's' key to save and exit
        cv.imwrite('messigray.png', img)
        cv.destroyAllWindows()

    # 保存图片
    cv.imwrite('my.png', img)

pyplot显示
image
opencv显示
image

视频

用摄像头捕获视频
import cv2 as cv

def video():
    cap = cv.VideoCapture(0)
    # Define the codec and create VideoWriter object
    fourcc = cv.VideoWriter_fourcc(*'XVID')
    out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
    while cap.isOpened():
        ret, frame = cap.read()

        if not ret:
            print('摄像头捕获图像失败')
            break

        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 显示
        cv.imshow('frame', gray)
        # 保存
        out.write(frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

    # When everything done, release the capture
    cap.release()
    out.release()
    cv.destroyAllWindows()

image

读取视频文件
def read_video():
    cap = cv.VideoCapture('output.avi')
    while cap.isOpened():
        res, frame = cap.read()
        if not res:
            print('读取视频失败')
            break
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('gray', gray)
        if cv.waitKey(25) & 0xFF == ord('q'):
            # cv.waitKey()参数 如果它太小,视频将非常快,如果它太高,视频将会很慢。在正常情况下,25毫秒就可以了
            break
    cap.release()
    cv.destroyAllWindows()

绘图功能

def draw_image():
    # Create a black image
    img = np.zeros((512, 512, 3), np.uint8)
    # Draw a diagonal blue line with thickness of 5 px
    # 直线 第一个参数是背景,第二个参数是线的起始点,第三个是终止点,第四个是线的颜色,第5个是线宽
    # cv.polylines()可用于绘制多条线。 只需创建要绘制的所有行的列表并将其传递给函数。 所有线条都将单独绘制。 绘制一组直线比每行调用cv.line()要好得多,速度更快。
    cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)

    # 矩形框
    cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

    # 圆
    cv.circle(img, (447, 63), 63, (0, 0, 255), -1)

    # 椭圆
    # 要绘制椭圆,我们需要传递几个参数,一个参数是椭圆中心位置(x,y),下一个是长轴长度和断轴长度(a,b),角度是椭圆在逆时针方向上的旋转角度,
    # startAngle和endAngle表示从主轴顺时针方向测量的椭圆弧的起点和终点,即给出值0和360给出完整的椭圆,给出值180则画出半个椭圆
    cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)

    # 多边形
    # 要绘制多边形,首先需要顶点坐标。 将这些点转换为ROWSx1x2的数组,其中ROWS是顶点数,它应该是int32类型。在这里,我们绘制一个带有四个黄色顶点的小多边形。
    # 注意:如果第三个参数为False,则绘制所有点的相连图形而不是闭合图形
    pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
    pts = pts.reshape((-1, 1, 2))
    cv.polylines(img, [pts], True, (0, 255, 255))

    # 添加文字
    font = cv.FONT_HERSHEY_SIMPLEX
    cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)

    cv.imshow('image', img)
    if cv.waitKey(0) & 0xFF == ord('q'):
        cv.destroyAllWindows()

image

鼠标做画笔

查看所有支持的事件
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)

--res

中文解释
cv.EVENT_MOUSEMOVE 0 鼠标移动事件
cv.EVENT_LBUTTONDOWN 1 鼠标左键按下事件
cv.EVENT_RBUTTONDOWN 2 鼠标右键按下事件
cv.EVENT_MBUTTONDOWN 3 鼠标中键按下事件
cv.EVENT_LBUTTONUP 4 鼠标左键释放事件
cv.EVENT_RBUTTONUP 5 鼠标右键释放事件
cv.EVENT_MBUTTONUP 6 鼠标中键释放事件
cv.EVENT_LBUTTONBLCLK 7 鼠标左键双击事件
cv.EVENT_RBUTTONBLCLK 8 鼠标右键双击事件
cv.EVENT_MBUTTONBLCLK 9 鼠标中键双击事件
cv.EVENT_MOUSEWHEEL 10 滑动滚轮上下滚动
cv.EVENT_MOUSEHWHEEL 11 滑动滚轮左右滚动

鼠标事件回调
def mouse_event():
    # mouse callback function
    def draw_circle(event, x, y, flags, param):
        # 左键双击画圆
        if event == cv.EVENT_LBUTTONDBLCLK:
            cv.circle(img, (x, y), 10, (255, 0, 0), -1)
        # 当左键按下并移动时绘制图形,event可以查看移动,flag查看是否按下
        elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON:
            cv.circle(img, (x, y), 10, (255, 0, 0), -1)

    # Create a black image, a window and bind the function to window
    img = np.zeros((512, 512, 3), np.uint8)
    cv.namedWindow('image')

    # 鼠标事件回调
    cv.setMouseCallback('image', draw_circle)
    while True:
        cv.imshow('image', img)
        if cv.waitKey(20) & 0xFF == 27:  # esc
            break
    cv.destroyAllWindows()

双击画圆
image
按下左键移动画轨迹
image

调色盘
def nothing(x):
    pass

# Create a black image, a window
img = np.zeros((300, 512, 3), np.uint8)
cv.namedWindow('image')

# create trackbars for color change
cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)

# create switch for ON/OFF functionality
switch = 'switch'
cv.createTrackbar(switch, 'image', 0, 1, nothing)

while True:
    cv.imshow('image', img)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break

    # get current positions of four trackbars
    r = cv.getTrackbarPos('R', 'image')
    g = cv.getTrackbarPos('G', 'image')
    b = cv.getTrackbarPos('B', 'image')
    s = cv.getTrackbarPos(switch, 'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b, g, r]

cv.destroyAllWindows()

image

标签:鼠标,img,python,image,EVENT,opencv,cv,255
From: https://www.cnblogs.com/yimeimanong/p/17246390.html

相关文章

  • python 协程 第三方greenlet
    1.greenlet自行执行的微线程https://greenlet.readthedocs.io/en/latest/greenlet.html 2.终端安装pipinstallgreenlet 3.举个栗子importtimefromgree......
  • python 之 click 包,设置命令行参数
    原文链接:PythonClick学习笔记 Click 是Flask的团队pallets开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现。恰好我最近在......
  • Python 获取 KVM 虚拟机的监控信息(基于 libvirt API)
    Python获取KVM虚拟机的监控信息(基于libvirtAPI)通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如CPU的......
  • 请写一个用python3.x pool.map多进程下载文件的示例代码
    自己改了一下要下载的url,一个网页,一个exe,一个PDFimportrequestsimportmultiprocessingdefdownload_file(url):local_filename=url.split('/')[-1]with......
  • ArcMap将Python写的代码转为工具箱与自定义工具
      本文介绍在ArcMap软件中,通过已有的Python脚本程序,建立新的工具箱并在其中设置自定义工具的方法。  通过本文介绍的操作,我们便可以实现将自己的Python代码封装,并像其......
  • 20 个非常有用的 Python 单行代码!
    1一行For循环for循环是一个多行语句,但是在Python中,我们可以使用列表推导式方法在一行中编写for循环。以过滤小于250的值为例,查看下面的代码示例。#For循环在一行......
  • python 接口加密
    #-*-coding:utf-8-*-"""@author:Mr_zhang@software:PyCharm@file:encryption.py@time:2023/3/2310:00"""importjsonimporttimeimportbase64from......
  • 10 种聚类算法的完整 Python 操作示例
    一.聚类聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群......
  • python 协程
    1.协程定义不开辟新的线程的基础上,实现多个任务,是个特殊的生成器。一秒钟能切换上百次。2.原始版协程importtime#1.work1生成器defwork1():whileTrue:......
  • Python multiprocessing 多进程
    进程:process线程:threadPython多进程和多线程哪个快由于GIL的存在,很多人认为Python多进程编程更快,针对多核CPU,理论上来说也是采用多进程更能有效利用资源。但这不是......