计算机视觉(一)
大多数常用的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): pass
参数1:图片名称
参数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 img
print 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.shape
byteArray=bytearray(img)
BgrImg=numpy.array(byteArray).reshape(1000,100,3)
print byteArray
imshow("Img",img)
imshow("Img1",BgrImg)
waitKey()
Demo: #coding:utf-8
#绝对路径是使用的是‘/’
from cv2 import *
# from cv22 import *
import numpy
import 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 numpy
img1=imread("D:/temp/1.jpg")
img2=imread("D:/temp/3.jpg")
#输出图片大小
print img1.shape
print img2.shape
print img1.size
print img1.dtype
imshow("Pic1",img1)
imshow("Pic2",img2)
#选定区域赋值
img1[100:110,100:110]=0
imshow("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-mp4 videowrite=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
还没有评论,来说两句吧...