计算机视觉(一)

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值