opencv python3记录(2)图片、视频基础操作

1.图像基本操作:读取图像,显示图像及保存图像

读图像

使用函数cv2.imread()来读取图像。图像应该在工作目录中,或者应该给出完整的图像路径。

参数标志,指定应读取图像的方式。

  • cv2.IMREAD_COLOR:加载彩色图像。任何形象的透明度将被忽略。这是默认的标志。
  • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
  • cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像

注意

若不填写这三个标志,你可以简单地传递整数1,0或-1。

例如:

import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('messi5.jpg',0)

显示图像

使用函数cv2.imshow()在窗口中显示图像。该窗口自动适合图像大小。

第一个参数是一个字符串的窗口名称。第二个参数是我们的图像。您可以根据需要创建多个窗口,但使用不同的窗口名称。

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey()是一个键盘绑定函数。它的论点是以毫秒为单位的时间。该函数等待指定的毫秒为任何键盘事件。如果在这段时间按任意键,程序将继续。如果0通过,它将无限期地等待键击。它也可以设置为检测特定的按键,如键a被按下等,我们将在下面讨论。

cv2.destroyAllWindows()只是销毁我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函数cv2.destroyWindow(),在其中传递确切的窗口名称作为参数。

注意

有一种特殊情况,可以在后面创建窗口并加载图像。在这种情况下,可以指定窗口是否可以调整大小。它是用函数cv2.namedWindow()完成的默认情况下,该标志是cv2.WINDOW_AUTOSIZE但是,如果指定标志cv2.WINDOW_NORMAL,则可以调整窗口大小。

如下:

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

写图像

使用函数cv2.imwrite()保存图像。

第一个参数是文件名,第二个参数是要保存的图像。

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

这会将图像以PNG格式保存在工作目录中。

下面程序加载灰度图像,显示图像,按's'保存图像并退出,或按ESC保存图像

import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()
执行出错可将 k   =   cv2.waitKey(0)修改为k = cv2.waitKey(0) & 0xFF

Matplotlib是Python的绘图库,提供各种绘图方法。可执行图像的放大保存等操作

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

2.视频基本操作:读,显示,写

OpenCV提供了一个非常简单的接口。让我们从相机中捕捉视频(我正在使用笔记本电脑的内置摄像头),将其转换为灰度视频并显示。要捕捉视频,需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个摄像头的号码。通常一个相机将被连接(就像我的情况)。所以我只是通过0(或-1)。也可以通过传递1等来选择第二台相机。之后,可以逐帧捕捉。但最后,不要忘记释放捕获。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # 捕获逐帧
    ret, frame = cap.read()

    # 框架上的操作
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 显示结果帧
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放捕获
cap.release()
cv2.destroyAllWindows()

cap.read()返回一个布尔(True / False)。如果帧被正确读取,则为真。所以可以通过检查这个返回值来检查视频的结束。

有时候,cap可能没有初始化捕获。在这种情况下,这段代码显示错误。此时可以通过cap.isOpened()方法检查它是否被初始化如果它是真的,好的。否则使用cap.open()打开它

还可以使用cap.get(propId)方法访问此视频的某些功能,其中propId是一个从0到18的数字。每个数字表示视频的一个属性(如果该视频适用于该视频),详细信息可以在这里可以看到:属性标识符其中一些值可以使用cap.set(propId,value)进行修改。value自己she'din

例如,我可以通过cap.get(3)检查框架的宽度和高度cap.get(4)它默认给我640x480。但我想修改为320x240。只要使用ret = cap.set(3,320)ret = cap.set(4,240)

显示视频: 与从相机拍摄相同,只需更改相机索引与视频文件名称即可。同时显示框架,使用适当的时间 cv2.waitKey() 如果它太少,视频会非常快,如果它太高,视频会很慢(那么,这是如何以慢动作显示视频)。正常情况下,25毫秒即可。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
保存视频:

创建一个VideoWriter对象。我们应该指定输出文件名(例如:output.avi)。那么我们应该指定FourCC代码(下一段的细节)。然后传递每秒帧数(fps)和帧大小。最后一个是isColor标志。如果为真,则编码器期望彩色帧,否则与灰度帧一起工作。

FourCC是用于指定视频编解码器的4字节代码。可用的代码列表可以在fourcc.org找到这是平台依赖。以下的编解码器对我来说工作得很好

  • 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(XVID是更可取的,MJPG导致高分辨率视频,X264分辨率非常小)
  • 在Windows中:DIVX(更多要测试和添加)

FourCC代码作为MJPG cv2.VideoWriter_fourcc('M','J','P','G')cv2.VideoWriter_fourcc(*'MJPG)MJPG 传递

下面的代码从摄像头捕获,在垂直方向翻转每一帧并保存。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值