目录

前言

一、图像操作

参数详解

1、cv2.imread(filename: Any, flags: Any = None)读取图像
2、cv2.imshow(winname: Any, mat: Any)显示图像
3、cv2.imwrite(filename: Any, img: Any, params: Any = None) 保存图像

代码演示

二、视频操作

参数详解

1、从相机获取视频

1.1、连接计算机摄像头

1.2、连接外部(海康)工业相机

2、从文件读取播放视频

3、保存视频

代码演示

参考


前言

跟着官网学习才是基础入门的最佳选择,下文是opencv-python官网的学习记录及扩展!

一、图像操作

参数详解

1、cv2.imread(filename: Any, flags: Any = None)读取图像

filename:图像路径

flags:图像颜色模式,默认空缺时为彩色模式
        cv2.IMREAD_GRAYSCALE:以灰度模式读入图像,可用数字  0  代替
        cv2.IMREAD_COLOR:读入彩色图像,可用数字  1  代替
        cv2.IMREAD_UNCHANGED: 保持原图格式读取,可用数字  -1

cv2.imread('lena.png', 0) # cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE) 
cv2.imread('lena.png', 1) # cv2.imread('lena.png', cv2.IMREAD_COLOR)

2、cv2.imshow(winname: Any, mat: Any)显示图像

winname: 窗口名称
mat: 读取到的图像数据

cv2.namedWindow('Display window', cv2.WINDOW_NORMAL) #设定可调窗口
# cv2.WINDOW_NORMAL可用数字 0 代替,默认为cv2.WINDOW_AUTOSIZE = 1
cv2.imshow('image',img) #显示图像
cv2.waitKey(0) #等待键盘输入,为毫秒级
cv2.destroyAllWindows() #可以轻易删除任何我们建立的窗口,括号内输入想删除的窗口名

3、cv2.imwrite(filename: Any, img: Any, params: Any = None) 保存图像

filename: 保存图像的全路径
img: 图像数据
params: 见官方文档

cv2.imwrite('lena_save.png', img)

读写操作中的flags和param详细设置见官方文档:

OpenCV: Flags used for image file reading and writing

代码演示

import cv2
import sys

cv2.namedWindow('Display window', cv2.WINDOW_NORMAL)  # cv2.WINDOW_NORMAL:0  cv2.WINDOW_AUTOSIZE:1

img = cv2.imread("./lena.png", cv2.IMREAD_GRAYSCALE)  # IMREAD_COLOR:1  IMREAD_GRAYSCALE:0
if img is None:
    sys.exit("Could not read the image.")
print("Image Shape: " + str(img.shape))
cv2.imshow("Display window", img)
k = cv2.waitKey(0)
if k == ord("s"):  # wait for 's' key to save and exit
    cv2.imwrite("./lena_save.png", img)
elif k == 27:  # wait for ESC key to exit
    cv2.destroyWindow("Display window")  # destroy specified window by winname
    cv2.destroyAllWindows()  # destroy all windows

二、视频操作

参数详解

1、从相机获取视频

cv2.VideoCapture(flag)

flag: 0为默认计算机默认摄像头,1可以更换来源

1.1、连接计算机摄像头

import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

当代码报错时,可以使用cap.isOpened()来检查是否成功初始化了,返回值是True,就没有问题,否则就要使用cap.open()。
可以使用cap.get(propId)来获取视频的一些参数信息。propId可以是0到18之间的任何数,每一个数代表一个属性。
其中一些值可以使用cap.set(propId,value)来修改,例如cap.get(3)和cap.get(4)来查看每一帧的宽和高,默认是640x480。我们可以使用ret=cap.set(3,320)和ret = cap.set(4,240)来把宽和高改成320x240。

1.2、连接外部(海康)工业相机

采用海康工业相机测试

首先,安装海康相机的SDK,海康机器人-机器视觉-下载中心 (hikrobotics.com)

安装DirectShow,在MVS软件目录D:\Program Files\MVS\MVS\Development\ThirdPartyPlatformAdapter\DirectShow\x64\MvDSS2\InstallDSSvc_x64.bat 以管理员运行安装DirectShow。

python3 opencv 中文路径乱码 python opencv文档_学习

运行代码如下:

import cv2

cap = cv2.VideoCapture(1)  # 调用摄像头‘0’一般是打开电脑自带摄像头,‘1’是打开外部摄像头(只有一个摄像头的情况)

if False == cap.isOpened():
    print(0)
else:
    print(1)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 5120)  # 设置图像宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 5120)  # 设置图像高度
cap.set(cv2.CAP_PROP_FPS, 4)  # 设置帧率
# 显示图像
cv2.namedWindow('frame',0)
while True:
    ret, frame = cap.read()
    frame_1 = cv2.resize(frame, (640, 480))
    cv2.imshow("frame", frame_1)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("gray.png", gray)

    input = cv2.waitKey(1)
    if input == ord('q'):
        break

cap.release()  # 释放摄像头
cv2.destroyAllWindows()  # 销毁窗口

2、从文件读取播放视频

把设备索引号改成文件名即可。在播放每一帧时,使用cv2.waitKey()适当持续时间,一般可以设置25ms。

import cv2 as cv

    cap = cv.VideoCapture('vtest.avi')
    while cap.isOpened():
        ret, frame = cap.read()
        # if frame is read correctly ret is True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('frame', gray)
        cv.waitKey(25)  # set 25ms to slow video
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    cv.destroyAllWindows()

确保安装了正确版本的 ffmpeg 或 gstreamer。有时使用视频捕获会令人头疼,主要是由于错误地安装了ffmpeg / gstreamer。

3、保存视频

创建一个VideoWrite的对象,指定输出文件名,指定FourCC编码,播放频率和帧的大小,最后是isColor标签,True为彩色。
FourCC是一个4字节码,用来确定视频的编码格式。
1.In Fedora : DIVX , XVID , MJPG , X264 , WMV1 , WMV2
XVID是最好的,MJPG是高尺寸视频,X264得到小尺寸视频
2.In Windows : DIVX
3.In OSX :MJPG (.mp4), DIVX (.avi), X264 (.mkv).

设置FourCC格式时,原文里采用了cv2.VideoWriter_fourcc()这个函数,若运行程序的时候显示这个函数不存在,可以改用了cv2.cv.CV_FOURCC这个函数。

import numpy as np
import cv2 as cv
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("Can't receive frame (stream end?). Exiting ...")
        break
    frame = cv.flip(frame, 0)
    # write the flipped frame
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

代码演示

import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")

    # open video file
    import cv2 as cv

    cap = cv.VideoCapture('../Resources/vtest.avi')

    # Define the codec and create VideoWriter object
    fourcc = cv.VideoWriter_fourcc(*'XVID')
    out = None

    while cap.isOpened():
        ret, frame = cap.read()
        if out is None:
            h,w,c=frame.shape
            print(h,w,c)
            out = cv.VideoWriter('../Resources/output.avi', fourcc, 20.0, (w, h))

        # if frame is read correctly ret is True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break

        frame = cv.flip(frame, 0)
        # write the flipped frame
        out.write(frame)

        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('frame', gray)
        # cv.waitKey(25)  # set 25ms to slow video
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    out.release()
    cv.destroyAllWindows()

    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

参考

OpenCV: OpenCV-Python Tutorials

学习、进步、坚持。。。内容不间断更新中。。。