栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【opencv图像处理】--1. 图像,视频,鼠标,trackbar控件简单使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【opencv图像处理】--1. 图像,视频,鼠标,trackbar控件简单使用

“这世界有那么多人”
  • 1. 图像处理
    • 1.1 打开和销毁图像显示窗口
    • 1.2 保存和加载图片
  • 2. 视频
    • 2.1 打开摄像头/加载视频
    • 2.2 录制视频和保存视频
  • 3 鼠标
  • 4. Trackbar控件
  • 5. 改进

所有代码,复制粘贴即可运行。
希望有能力的朋友还是拿C++运行一下,python对opencv再封装的时候,少了一些C库中的对象和方法。

笔者采用jupyter-notebook,python和opencv视觉处理库实现本专栏的功能
本节讨论对图像、视频的基本使用,以及trackbar的简单使用

1. 图像处理 1.1 打开和销毁图像显示窗口
  • 使用可自定义窗口大小
  • ord是计算ASCII的函数,读取键盘q值退出
  • waitKey(0),等待用户读取按键,非0的时候,表示等待图像显示时长,单位毫秒
  • 0xff是C++的习惯,在这里可以不写
import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window',800,600)
cv2.imshow('window', 0)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
    cv2.destroyAllWindows()
1.2 保存和加载图片
  • cv2.imread默认读取彩色图像
  • cv2.imwrite保存图片至同目录下
  • opencv读进来通道顺序是BGR
  • 故用opencv的展示方法较为方便
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 默认读彩图
img = cv2.imread('cat.jpeg')
# numpy 的 ndarray
while True:
    cv2.imshow('img', img)
    key = cv2.waitKey(0)
    if key & 0xff == ord('q'):
        break
    elif key & 0xff == ord('s'):
        cv2.imwrite('cat_cp.png', img)
    else:
        print(key)
cv2.destroyAllWindows()
        
2. 视频 2.1 打开摄像头/加载视频
  • 打开的是没有音频的视频,速度全靠waitKey的参数设置
import cv2

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)


cap0 = cv2.VideoCapture(0)
# 查看视频,其余以下不变,无声且加速
# cap0 = cv2.VideoCapture('1.mp4')
while cap0.isOpened():
    #读一帧数据,返回标记和一帧数据,TRUE表示读到了
    ret, frame = cap0.read()
    
    #根据ret做判断,没读到数据,直接退出
    if not ret:
        break
        
    cv2.imshow('video', frame)
#     假如一个视频是30帧,那么视频间隔可以自己计算
    key = cv2.waitKey(10)
    
    if key & 0xff == ord('q'):
        break

#释放资源
cap0.release()
cv2.destroyAllWindows()
    
2.2 录制视频和保存视频
import cv2

cap = cv2.VideoCapture(0)

# *'mp4v'就是解包操作,等同于'm','p','4','v', 在opencv中mp4的完整叫法是mp4v
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# avi的格式压缩视频内存较大
##fourcc = cv2.VideoWriter_fourcc(*'XVID')


# 保存函数对象      输出文件, 多媒体格式文件VideoWriter_fourcc, 帧率, 分辨率
# 主要是这个分辨率
##vw = cv2.VideoWriter('output.avi', fourcc, 20, (640, 480))
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("can not recive frame, Exiting")
        break
    #写一帧数据(写入缓存)
    vw.write(frame)
    cv2.imshow('frame', frame)
    
    if cv2.waitKey(1) == ord('q'):
        break
        
#释放videoWriter,在release后才会把缓存的数据写到磁盘
cap.release()
vw.release() 
cv2.destroyAllWindows()

3 鼠标

鼠标在选定的窗口上移动时也可以触发事件响应。
鼠标事件::

  • EVENT_MOUSEMOVE 0 鼠标移动
  • EVENT_LBUTTONDOWN 1 按下鼠标左键
  • EVENT_RBUTTONDOWN 2 按下鼠标右键
  • EVENT_MBUTTONDOWN 3 按下鼠标中键
  • EVENT_LBUTTONUP 4 左键释放
  • EVENT_RBUTTONUP 5 右键释放
  • EVENT_MBUTTONUP 6 中键释放
  • EVENT_LBUTTONDBLCLK 7 左键双击
  • EVENT_RBUTTONDBLCLK 8 右键双击
  • EVENT_MBUTTONDBLCLK 9 中键双击
  • EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
  • EVENT_MOUSEHWHEEL 11 鼠标左右滑动

组合事件:

  • EVENT_FLAG_LBUTTON 1 按下左键
  • EVENT_FLAG_RBUTTON 2 按下右键
  • EVENT_FLAG_MBUTTON 4 按下中键
  • EVENT_FLAG_CRTLKEY 8 按下CTRL键
  • EVENT_FLAG_SHIFTKEY 16 按下SHIFT键
  • EVENT_FLAG_ALTKEY 32 按下ALT键
import cv2
import numpy as np

# 五个参数缺一不可
# event 鼠标事件
# x,y为鼠标的坐标
# flags为组合时间 比如shift+左键
# userdata为用户数据

def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)
    if event == 1:  #按下左键退出,但是未退出循环
        cv2.destroyAllWindows()

cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)

#为某窗口绑定鼠标回调事件,里边对应的userdata为123
cv2.setMouseCallback('mouse', mouse_callback, '123')

#生成全黑的图片
img = np.zeros((360, 640), np.uint8)
while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
        
cv2.destroyAllWindows()
4. Trackbar控件

进度条 可拖动 例子:制作一个调色板

import cv2
import numpy as np

cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)

def callback(value):
    #print(value)
    pass
#有改变就进入callback函数中一次
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

img = np.zeros((480, 640, 3), np.uint8)

while True:
    #获取当前trackbar的值
    r = cv2.getTrackbarPos('R', 'trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')
    #用获取到的三个值 修改背景图片
    img[:] = [b, g, r]
    cv2.imshow('trackbar', img)
    key = cv2.waitKey(1)
    
    if key & 0xff == ord('q'):
        break
        
cv2.destroyAllWindows()
5. 改进
  • 可以将cv_show此类常用函数封装到其他文件中,以后直接调用
  • 例如 form utils import cv_show
  • 但是必须执行外部文件 %run utils.py
  • 如果有indentation错误,是tab和空格缩进混用 用notepad++打开符号显示可以看到

好好努力

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号