大多数常用的OpenCv函数都在cv2模块内,cv2并非指OpenCv2.x.x,是指该模块引入了一个跟好的API接口
一、二维Numpy创建图像
cvtColor:格式转换
def cvtColor(src, code, dst=None, dstCn=None):
pass
#coding:utf-8
#绝对路径是使用的是‘/’
from cv2 import *
import numpy
#创建矩阵,元素类型是8位无符号整型
img=numpy.zeros((100,100),dtype=numpy.uint8)
print img.shape#shape返回图像的行列数及通道数
#格式转换:使用函数转换成BGR格式----3通道
img=cvtColor(img,COLOR_GRAY2BGR)
print img.shape
imshow("Img",img)
waitKey()
二、显示一张图片
将光标定位在函数名处,按下Ctrl+B。Pycharm会自动跳转到函数的定义:
函数:
1、imread:读取图片
def imread(filename, flags=None):参数1:图片名称
pass
参数2:flag默认1(原图)
还有:
IMREAD_ANYCOLOR = 4
IMREAD_ANYDEPTH = 2
IMREAD_GRAYSCALE = 0(灰度图)
IMREAD_LOAD_GDAL = 8
IMREAD_UNCHANGED = -1
2、nameWindow:窗口显示函数
def namedWindow(winname, flags=None):
pass
参数1:窗口名
参数2::
3、imshow:图片显示
def imshow(winname, mat): pass参数1:要显示图片所在窗口名
参数2:图片对象
#coding:utf-8#绝对路径是使用的是‘/’from cv2 import *image=imread('D:/temp/1.jpg')namedWindow('My picture',1)imshow('My picture',image)waitKey()
三、图片保存
imwrite:要求图像为BGR或灰度格式
def imwrite(filename, img, params=None): pass参数1:图片名加格式
参数2:待保存图片
四、图像元素访问
1、直接访问
image[i,j]:i表示图像的行坐标,j表示图像的纵坐标。输出的是该坐标处的像素值(个数>=1)。
image[i,j,k]:i表示图像的行坐标,j表示图像的纵坐标,k表示通道。输出的是该坐标处第k通道的像素值(=1)。
若一幅图像的每个通道为8位,则可将其显示转换为标准的一维Python bytearray格式:
byteArray = bytearray(image)
反之,bytearray含有恰当顺序的字节,可以通过显示转换和重构,得到numpy.array形式的图像:
garyImage = numpy.array(garyByteArray ).reshape(height, width)
bgrImage = numpy.array(bgrByteArray ).reshape(height, width, 3)
无论改变怎样的形状,图像的总像素值不变即 height*width*k 值一定
#coding:utf-8#绝对路径是使用的是‘/’from cv2 import *import numpy#创建矩阵,元素类型是8位无符号整型img=numpy.zeros((100,100),dtype=numpy.uint8)print imgprint img.shape#shape返回图像的行列数及通道数#格式转换:使用函数转换成BGR格式----3通道img=cvtColor(img,COLOR_GRAY2BGR)for i in range(50,60): for j in range(50,60): img[i,j]=[0,255,0]print img.shapebyteArray=bytearray(img)BgrImg=numpy.array(byteArray).reshape(1000,100,3)print byteArrayimshow("Img",img)imshow("Img1",BgrImg)waitKey()
Demo:
#coding:utf-8#绝对路径是使用的是‘/’from cv2 import *# from cv22 import *import numpyimport os# 创建一个90000个随机字节的数组##os.urandom(n) 返回n个随机byte值的rdByteArray=bytearray(os.urandom(90000))#转换成矩阵形式1*n形式flatNumpyArray=numpy.array(rdByteArray)# print flatNumpyArray# print rdByteArray#将矩阵改变形状为300*300=90000的灰度图grayImag=flatNumpyArray.reshape(600,600)#存储imwrite('ranImage.png',grayImag)#显示imshow('P1',grayImag)#将矩阵转换成200*150*3=360000的彩色图bgrImage=flatNumpyArray.reshape(200,150,3)imwrite("bgrImage.png",bgrImage)imshow("P2",bgrImage)waitKey()运行后显示结果:
2、使用item和itemset函数
item(i,j,k):i,j像素坐标,k表第k通道
itemset((i,j,k),val):(i,j,k)同上,val表该坐标下的值修改为val
from cv2 import *img=imread('D:/temp/1.jpg')print img.item(150,120,0)print img[150,120,0]img.itemset((150,120,0),255)print img[150,120,0]
图片的高度即行数,宽度即列数
3、Roi(感兴趣区域设置)
Demo:
from cv2 import *import numpyimg1=imread("D:/temp/1.jpg")img2=imread("D:/temp/3.jpg")#输出图片大小print img1.shapeprint img2.shapeprint img1.sizeprint img1.dtypeimshow("Pic1",img1)imshow("Pic2",img2)#选定区域赋值img1[100:110,100:110]=0imshow("Pic3",img1)Roi=img2[100:200,100:200]imshow("Roi",Roi)img1[0:100,300:400]=Roi#确保两个区域大小相同imshow("pic",img1)waitKey()
shape:NumPy返回包含宽度、高度和通道数(如果图像是彩色的)数组,这在调试图像类型时很有用;如果图像是单色或灰度的,将不包含通道值;
size:该属性是指图像像素的大小;
datatype:该属性会得到图像的数据类型(通常为一个无符号整数类型的变量和该类型占的位数,比如unit8类型)
五、视频文件读写
D:\Anaconda;D:\Anaconda\Scrips;D:\opencv\sources\3rdparty\ffmpeg;
1、读取视频
OpenCV读取视频, 获得视频的格式, 读取视频的每一帧, 播放控制; 使用VideoCapture()和read()函数
def VideoCapture(): # real signature unknown; restored from __doc__ """ VideoCapture() -> <VideoCapture object> or VideoCapture(filename) -> <VideoCapture object> or VideoCapture(device) -> <VideoCapture object> """ pass
read()函数返回两个值
第一个值为True或False,代表有没有读到图片
第二个是frame,是当前截取一帧的图片。
Demo1:
from cv2 import *import string#获得视频的格式filename='59.flv'videocapture=VideoCapture(filename)# #获得码率fps=videocapture.get(CAP_PROP_FPS)#读帧success,frame=videocapture.read()while success: # 显示 imshow("My video",frame) # 延迟 waitKey(1000/int(fps)) # 获取下一帧 success,frame=videocapture.read()通过编译器,可终止视频播放。
Demo2:
from cv2 import *filename='D:/temp/2.mp4'cap =VideoCapture(filename)while (cap.isOpened()): ret,frame = cap.read() imshow('video test',frame) key =waitKey(10) #按下Esc键视频退出 if key == 27: break #按下空格键,截取一张图 if key == ord(' '): imwrite('vid_result.jpg',frame)
2、写视频
OpenCV写视频, 需要指定视频的格式, 可以从原视频中获取; 使用VideoWriter()和write()函数
def VideoWriter(filename=None, fourcc=None, fps=None, frameSize=None, isColor=None): # real signature unknown; restored from __doc__
""" VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) -> <VideoWriter object> """ pass参数1:输出视频名称+格式
参数2:视频编码
fourcc为 四个字符用来表示压缩帧的codec 例如:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
参数3:fps“Frames Per Second”在计算机图像范畴内被翻译为:“每秒传输帧数”。
参数4:视频帧尺寸
参数5:如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
帧速率和帧大小也必须要指定,因为需要从另一个视频文件复制视频帧,这些属性可以通过VideoCapture类的get()函数得到。
from cv2 import *import string#获得视频的格式#输入视频路径InputVideoPath='D:/temp/6.mp4'videocapture=VideoCapture(InputVideoPath)#输出路径OutVideoPath='D:/temp/1.avi'# #获得码率及尺寸fps=videocapture.get(CAP_PROP_FPS)size=(int(videocapture.get(CAP_PROP_FRAME_WIDTH)),int(videocapture.get(CAP_PROP_FRAME_HEIGHT)))#指定写视频的格式, I420-avi, MJPG-mp4videowrite=VideoWriter(OutVideoPath,VideoWriter_fourcc('I', '4', '2', '0'),fps,size)#读帧success,frame=videocapture.read()while success: # 显示 imshow("My video",frame) # 延迟 waitKey(1000/int(fps)) # # 写视频帧 videowrite.write(frame) # 获取下一帧 success,frame=videocapture.read()
3、读/写视频出现错误
参考:
解决windows+python+opencv无法读取视频的问题:
http://blog.csdn.net/lql0716/article/details/52476190
Python Opencv2 Opencv3 videoCapture 视频读取失败解决办法:
http://blog.csdn.net/serena9636/article/details/52525379
python + opencv: 解决不能读取视频的问题:
http://lib.csdn.net/article/opencv/32902
Opecv + Anaconda 读取视频(windows)
https://www.cnblogs.com/ctfighting/p/5689925.html
解决python中opencv无法读取视频的问题
http://blog.sina.com.cn/s/blog_692047900102wpbv.html
参考:
http://www.cnblogs.com/xiaotongtt/p/6594133.html