OpenCV计算机视觉(Python实现)-1:处理文件、摄像头和图形用户界面

第2章    处理文件、摄像头和图形用户界面(原书第二版目录)

2.1    基本I/O脚本

2.1.1    读/写图像文件 

2.1.2    图像与原始字节之间的转换

2.1.3    使用numpy.array访问图像数据

2.1.4    视频文件的读/写

2.1.5    捕获摄像头的帧

2.1.6    在窗口显示图像

2.1.7    在窗口显示摄像头帧

2.2    Cameo项目(人脸跟踪和图像处理)

2.3    Cameo——面向对象设计

2.3.1    使用managers.CaptureManager提取视频流

2.3.2    使用managers.WindowManager抽象窗口和键盘

2.3.3    cameo.Cameo的强大实现

2.4    总结



读/写图像文件

import numpy
import cv2
img = numpy.zeros((3, 3), dtype=numpy.uint8)    # 创建一个黑色的正方形图像
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)     # 将图像转换为BGR格式
print(img.shape)    # 查看图像结构,返回行和列/通道数

image = cv2.imread('home.jpg')
cv2.imwrite('home.png', image)  # 实现图像格式的转换

grayImage = cv2.imread('home.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imwrite('homeGray.jpg', grayImage)  # 加载图片为灰度图像


下列选项可以作为imread()函数的参数

IMREAD_ANYCOLOR = 4

IMREAD_ANYDEPTH = 2

IMREAD_COLOR = 1

IMREAD_GRAYSCALE = 0

IMREAD_LOAD_GDAR = 8

IMREAD_UNCHANGED = -1

无论哪一种模式,imread()函数会删除所有alpha通道的信息(透明度)


图像与原始字节之间的转换

.array类型的二维或三维数组。如image[0,0]或image[0,0,0]

第一个值代表像素的y坐标或行,0表示顶部

第二个值是像素的x坐标或列,0代表最左边

第三个值(可用)便是颜色通道

# 将含有随机字节的 bytearray 转换为灰度图像和 BGR 图像
# 构建一个包含120000随机字节的数组
randomByteArrray = bytearray(os.urandom(120000))
flatNumpyArray = numpy.array(randomByteArrray)
# 将数组转换为300*400的灰度图像
grayImage = flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png', grayImage)
# 将数组转换为400*100的彩色图像
bgrImage = flatNumpyArray.reshape(100,400,3)
cv2.imwrite('RandomColor.png', bgrImage)

    灰度图

    彩色图


使用numpy.array访问图像数据

# 将BGR图像(0,0)处的像素转化为白像素
img = cv2.imread('home.png')
img[0, 0] = [255, 255, 255]
cv2.imshow('image', img)
cv2.waitKey(0)
# 图像所有的绿值设为0
img = cv2.imread('home.png')
img[:,:,1]=0
cv2.imshow('image',img)
cv2.waitKey(0)
# 图像的一部分拷贝到另一个位置
img = cv2.imread('test.png')
my_roi = img[0:100, 0:100]
img[300:400, 300:400] = my_roi
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

numpy.array获得图像属性,是Python处理图像的基础

shape:numpy返回包含宽度、高度和通道数(针对彩色图像)的数组。第一个程序里有用到

size:图像的像素大小

datatype:得到图像的数据类型



视频文件的读/写

OpenCV提供了VideoCapture类和VideoWriter类支持各种格式的视频文件

videoCapture = cv2.VideoCapture('video/Input.avi')
fps = videoCapture.get(cv2.CAP_PROP_FPS)
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 帧的速率和大小必须指定,通过videoCapture类的get来获取
videoWrighter = cv2.VideoWriter(
    'video/Output.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = videoCapture.read()
while success:
    videoWrighter.write(frame)
    success, frame = videoCapture.read()

必须指定解码器,

cv2.VideoWrighter_fourcc('I', '4', '2', '0')未压缩的YUV颜色编码,是4;2:0色度子采样。兼容性好单回产生较大文件



捕获摄像头的帧

# 获取摄像头10秒的视频信息,并将其写入一个avi文件中
cameraCapture = cv2.VideoCapture(0)
fps = 30
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrighter = cv2.VideoWriter(
    'out.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = cameraCapture.read()
numFrameRemaining = 10 * fps - 1
while success and numFrameRemaining > 0:
    videoWrighter.write(frame)
    success, frame = cameraCapture.read()
    numFrameRemaining -= 1
cameraCapture.release()


在窗口显示摄像头的帧

# 获取摄像头的视频信息,并将其写入一个avi文件中
# 同时可以在窗口显示摄像头帧,通过鼠标点击来控制视频结束
cliked = False
def onMouse(event, x, y, flag, param):
    global cliked
    if event == cv2.EVENT_LBUTTONUP:
        cliked = True
cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)
fps = 30
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrighter = cv2.VideoWriter(
    'out.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not cliked:
    videoWrighter.write(frame)
    cv2.imshow('MyWindow', frame)
    success, frame = cameraCapture.read()
cv2.destroyWindow('MyWindow')
cameraCapture.release()

// 回调事件可以取如下的值,分别对应不同的鼠标事件
cv2.CV_EVENT_MOUSEMOVE  //鼠标移动
cv2.CV_EVENT_LBUTTONDOWN    //鼠标左键按下
cv2.CV_EVENT_RBUTTONDOWN    //鼠标右键按下
cv2.CV_EVENT_MBUTTONDOWN    //鼠标中键按下
cv2.CV_EVENT_LBUTTONUP  //鼠标左键松开
cv2.CV_EVENT_RBUTTONUP  //鼠标右键松开
cv2.CV_EVENT_MBUTTONUP  //鼠标中键松开
cv2.CV_EVENT_LBUTTONDBLCLK  //鼠标左键双击
cv2.CV_EVENT_RBUTTONDBLCLK  //鼠标右键双击
cv2.CV_EVENT_MBUTTONDBLCLK  //鼠标中键双击
// 鼠标回调的标志参数可能是一下事件的按位组合
cv2. CV_EVENT_FLAG_LBUTTON  //鼠标左键拖拽(按下鼠标左键,然后在窗口中拖动鼠标)
cv2.CV_EVENT_FLAG_RBUTTON   //鼠标右键拖拽
cv2.CV_EVENT_FLAG_MBUTTON   //鼠标中键拖拽
cv2.CV_EVENT_FLAG_CTRLKEY   //按下键值CTRL不放
cv2.CV_EVENT_FLAG_SHIFTKEY  //按下键值SHIFT不放
cv2.CV_EVENT_FLAG_ALTKEY    //按下键值ALT不放

Cameo项目

具体代码见下一个:OpenCV计算机视觉(Python实现)-2



OpenCV计算机视觉(Python实现)-2

猜你喜欢

转载自blog.csdn.net/jesmine_gu/article/details/80936234