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

所有代码,复制粘贴即可运行。
希望有能力的朋友还是拿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()

  • JETSON nano可用如下版本:
#!/usr/bin/env python
#coding=UTF-8

import cv2
cap = cv2.VideoCapture(1)
 
## some videowriter props
sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
 
fps = 30

fourcc = cv2.VideoWriter_fourcc(*'mpeg')
 
## open and set props
out = cv2.VideoWriter()
out.open('output.mp4',fourcc,fps,sz,True)
 
while(True):
    ret,frame=cap.read()
    out.write(frame)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1)&0xff == ord('q'):
        break
 
out.release()
cap.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++打开符号显示可以看到

好好努力

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于文件大小超过csdn限制的60M,所以分割成2个文件了,请注意下载。 Delphi-OpenCV (master) OpenCV version - 2.4.8 Development environment - Delphi XE2-XE5 Contributors: Laentir Valetov email: laex@bk.ru Mikhail Grigorev email: sleuthhound@gmail.com How to install: 1.Download the archive Delphi-OpenCV-master.zip 2.Unzip it to a convenient directory, thus get the following directory structure <Directory, such as 'C:\OpenCV\' - <PROJECT_ROOT>> <bin> <component> <include> <opencv_classes> <samples> 3.Add the search path for the modules of the project in Delphi IDE (Tools-Options-Delphi Options-Library-Library path) <PROJECT_ROOT>\Include <PROJECT_ROOT>\Include\core <PROJECT_ROOT>\Include\highgui <PROJECT_ROOT>\Include\imgproc <PROJECT_ROOT>\Include\legacy <PROJECT_ROOT>\Include\nonfree <PROJECT_ROOT>\Include\objdetect <PROJECT_ROOT>\Include\calib3d <PROJECT_ROOT>\Include\contrib <PROJECT_ROOT>\Include\video <PROJECT_ROOT>\Include\ml <PROJECT_ROOT>\Include\stitching <PROJECT_ROOT>\component where <PROJECT_ROOT> directory, which was unzipped project. Additionally, you can specify the path to the library header files FFMPEG <PROJECT_ROOT>\Include\ffmpeg <PROJECT_ROOT>\Include\ffmpeg\ctypes <PROJECT_ROOT>\Include\ffmpeg\libavcodec <PROJECT_ROOT>\Include\ffmpeg\libavfilter <PROJECT_ROOT>\Include\ffmpeg\libavformat <PROJECT_ROOT>\Include\ffmpeg\libavutil <PROJECT_ROOT>\Include\ffmpeg\libswscale Examples of using FFMPEG library header files are in the <PROJECT_ROOT>\Delphi-OpenCV-master\Include\ffmpeg\examples 4.Open in Delphi IDE and compile: Examples of the use of certain functions and procedures <PROJECT_ROOT>\samples\LibDemo.groupproj Examples of the use of video processing algorithms <PROJECT_ROOT>\samples\MultiDemo.groupproj Examples of the use of video processing algorithms using VCL.Forms <PROJECT_ROOT>\samples\VCLDemo.groupproj Examples of use of components. To install the components, open and install <PROJECT_ROOT>\Include\component\OpenCV.dpk <PROJECT_ROOT>\samples\ComponentDemo.groupproj

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值