1.1  读/写图像文件

Opencv中的imread函数()和imwrite函数()能支持各种静态图像文件格式。不同的系统支持的文件格式不一样,但都支持BMP格式,通常还支持PNG,JPEG,TIFF格式

读取一种格式的文件,然后将其保存为另一种形式

eg:

import  cv2
 
image = cv2.imread('mypic.png')
cv2.imwrite('mypic.jpg',image)

注:在默认情况下,即使图像文件为灰度格式,imread()函数也会返回BGR格式的图像

  BGR图像与RGB图像所标识的色彩空间相同,但字节顺序相反,BGR图像数据模式中,B在高位,RGB 中则相反

 

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

 

一个OpenCv图像是.array类型的二维或者三维数组。8位的灰度推向是一个含有字节值的二维数组,一个24位的BGR图像是一个三维数组

现在若有 一幅推向的每个通道位8 位,则可将其显式转化为标准的一维python bytearray格式:

 

byteArray = bytearray(image)

反之,bytearray含有恰当顺序的字节,可以通过显式转换和重构,得到numpy.array形式的图像:

grayImage =  numpy.array(grayByteArray).reshape(height,wodth)

bgrImage = numpy.array(bgrByteArray).reshape(height,width,3)

下面介绍一个更i详细的例子,即将含有随机字节的bytearray转换为灰度图像和BGR图像

 

import  cv2
import  numpy
import os

randomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = numpy.array(randomByteArray)
grayImage = flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)
bgrImage =flatNumpyArray.reshape(100,400,3)
cv2.imwrite("RandomColor.png",bgrImage)

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

最基础的例子:将BGR图像在(0,0)处的像素转换为白像素

import  cv2
import  numpy  as  np
img = cv.imread('mypic.png')
img[0,0] = [255,255,255]

将坐标(150,120)的当前值(127)变为255:

import  cv2
import numpy  as  np

img = cv2.imread('lala.jpg')
print(img.item(150,120,0))
img.itemset((150,120,0),255)
print(img.item(150,120,0))

通过numpy数组的索引访问原始的像素,会发现很多有趣的事;其中一件就是为设定感兴趣区域(Region  Of  Interest,ROI)一但设定了该区域,就可以执行很多操作,例如:将该区域与变量绑定,然后设定第二个区域,并将第一个区域的值分配该第二个区域(将图像的一部分拷贝到该图像的另一个位置):

import  cv2
import numpy  as  np

img = cv2.imread('mylala.png')
print(img.shape)     #返回宽度和高度以及通道数
print(img.size)      # 该属性是指图像像素的大小
print(img.dtype)     # 该属性会得到瑞祥的数据类型(通常为一个无符号的白能量和该类型占的位数,比如uint8类型)

my_roi = img[0:50,0:50]
img[50:100,50:100] =my_roi
cv2.imshow('pic',img)

1.4视频文件的读写

import  cv2

videoCapture = cv2.VideoCapture("test_video.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)))
videoWriter =  cv2.VideoWriter("test_output.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
success,frame =videoCapture.read()
while success:
    videoWriter.write(frame)
    success,frame = videoCapture.read()

要注意的是:必须为VideoWriter类的构造函数之哦对那个视频文件名,则会个文件名对应的文件如哦存在,则会被覆盖,也必须指定视频编解码器,编解码器的可用性根据系统不同而不同(这里就多说了)

1.5捕获摄像头的帧

import  cv2
 

cameraCapture = cv2.VideoCapture(1)    # 0是这带电脑自带的摄像头,1指USB摄像头
fps = 100
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter(
        'test2.avi',cv2.VideoWriter_fourcc('I','4','2','0'),
        fps,size)
success,frame = cameraCapture.read()
numFramesRemaining = 20*fps-1
while success  and numFramesRemaining >0:
    videoWriter.write(frame)
    success,frame = cameraCapture.read()
    numFramesRemaining -=1
cameraCapture.release()

FPS是测量用于保存、显示动态视频的信息数量。通俗来讲就是指每秒变化的画面数。

1.6在窗口显示帧

 

import   cv2
import  numpy

img =cv2.imread("lala.png")
cv2.imshow('sister',img)
cv2.waitKey()
cv2.destroyAlloWindows()

1.7在窗口显示摄像头帧:

import   cv2

clicked = False

def  onMouse(event,x,y,flags,param):
    global clicked
    if  event ==cv2.EVENT_LBUTTONUP:
        clicked = True
cameraCapture = cv2.VideoCapture(1)
cv2.namedWindow('mywindows')
cv2.setMouseCallback('mywindows',onMouse)
print('showinf camera  feed. Click  window or  press  any key to  stop.')
success,frame = cameraCapture.read()
while  success  and   cv2.waitKey(1) == -1 and  not clicked:
    cv2.imshow('mywindows',frame)
    success,frame = cameraCapture.read()
cv2.destroyWindow('mywindows')
cameraCapture.release()

OpenCv的窗口函数和waitKey()函数相互依赖,OpenCv的窗口只有在调用waitKey()函数只有在OpenCv窗口成为活动窗口是,才能捕获输入信息

鼠标会带哦函数setMouseCallback()有5个参数,如前面的实例代码所示,param为可选的参数,他是setMouseCallback()函数的第三个参数,默认情况下,该参数为0回调事件参数可以取如下的值,它们分别对应不同的鼠标事 CV.2_EVENT_RBUTTONDOWN 2           右键点击
 CV.2_EVENT_MBUTTONDOWN 3           中键点击
 CV,.2_EVENT_LBUTTONUP 4                 左键放开
 CV.2_EVENT_RBUTTONUP 5                 右键放开
 CV.2_EVENT_MBUTTONUP 6                 中键放开
CV.2_EVENT_LBUTTONDBLCLK 7         左键双击#define CV_EVENT_RBUTTONDBLCLK 8         右键双击
CV.2_EVENT_MBUTTONDBLCLK 9         中键双击
flags:
CV.2_EVENT_FLAG_LBUTTON 1           左键拖曳
CV.2_EVENT_FLAG_RBUTTON 2           右键拖曳
CV.2_EVENT_FLAG_MBUTTON 4           中键拖曳
CV.2_EVENT_FLAG_CTRLKEY 8     (8~15)按Ctrl不放事件

CV.2_EVENT_FLAG_SHIFTKEY 16   (16~31)按Shift不放事件

CV.2_EVENT_FLAG_ALTKEY 32       (32~39)按Alt不放