计算机视觉(一)

时间:2023-01-09 08:48:16

大多数常用的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 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