OpenCV 3计算机视觉 python语言实现笔记(一)

#读/写图像文件


#OpenCV的imread()函数和imwrite()函数能支持各种静态图像文件格式。
#不同系统支持得文件格式不一样,但都支持BMP格式,通常还应该支持PNG、JPENG和TIFF格式。

#通过二维numpy数组来简单创建一个黑色的正方形图像:
img = numpy.zeros((3,3),dtype=numpy.uint8)

#打印结果:
array([[0,0,0],
       [0,0,0],
       [0,0,0]],dtype=uint8)

#利用cv2.cvtColor函数将该图像转换为BGR格式:
img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

#打印结果:
array([[[0,0,0],
        [0,0,0],
        [0,0,0]],
      
      [[0,0,0],
       [0,0,0].
       [0,0,0]],
      
      [[0,0,0],
       [0,0,0],
       [0,0,0]]],dtype=uint8)

#可以通过shape属性来查看图像的结构,它会返回行和列以及通道数
img = numpy.zeros((3,3),dtype=numpy.uint8)
img.shape

#读取一种格式的图像文件,然后将其保存为另一种格式。
#从PNG转换为JPEG格式:
import cv2

img = cv2.imread('MyPic.png')
cv2.imwrite('MyPic.jpg',img)

#加载一个PNG文件作为灰度图像(在这个过程中会丢失所有的颜色信息),
#然后又将其保存为灰度的PNG图像:
import cv2

grayImage = cv2.imread('MyPic.png',cv2.IMREAD_GRAYSCALE)
cv2.imwrite('MyPicGray.png',grayImage)


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


#若一幅图像的每个通道为8位,则将其显式转换为标准的一维python bytearray形式的图像:
byteArray = bytearray(image)

#反之,bytearray含有适当顺序的字节,可以通过显式转换和重构,得到numpy.array形式的图像:
grayImage = numpy.array(byteArray).reshape(height,width)
bgrImage = numpy.array(byteArray).reshape(height,width,3)

#将含有随机字节的bytearray转换为灰度图像和BGR图像:
import cv2
import numpy
import os 

#创建一个含12000个字节的随机一维数组:
randomByteArray = bytearray(os.urandom(120000))
#显式转换为numpy.array
flatNumpyArray = numpy.array(randomByteArray)
#重构为400*300的灰度图像:
grayImage = flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)

#转换为400*100的彩色图像:
bgrImage = flatNumpyArray.reshape(100,400,3)
cv2.imwrite('RandomColor.png',bgrImage)

#使用python标准的os.urandom()函数可随机生成原始字节,随后会把该字节转换为numpy数组。
#需要注意的是,诸如numpy.random,randint(0,256,120000).reshape(300,400)
#语句也能直接(并且更高效地)随机生成numpy数组。使用os.urandom()函数的唯一理由
#是该语句有助于展示原始字节的转换。

#==================================================================
#使用numpy.array访问图像数据


#将BGR图像在(0,0)处的像素转换为白像素:
import cv2
import numpy as np

img = cv2.imread('MyPic.png')
img[0,0] = [255,255,255]

#将坐标(150,120)的当前蓝色值(127)变成255:
import cv2
import numpy as np

img = cv2.imread('MyPic.png')
#获取当前坐标的值127
print(img.item(150,120,0))
#将值变成255
img.itemset((150,120,0),255)
#输出变化后的值255
print(img.item(150,120,0))

#将图像的所有的G(绿色)值设为0:
import cv
import numpy as np
img = cv.imread('MyPic.png')
img[:,:,1] = 0

#将感兴趣区域(ROI)与变量绑定,然后设置第二个区域,并将第一个区域的
#值分配给第二个区域(将图像的一部分拷贝到该图像的另一个位置)
import cv2
import numpy as np

img = cv2.imread('MyPic.png')
my_roi = img[0:100,0:100]
img[300:400,300:400] = my_roi

#获取图像的属性
#shape:返回(高度,宽度,通道数)
img.shape

#size:该属性是指图像像素的大小
img.size

#dtype:该属性会得到图像的数据类型(通常是一个无符号整数类型的变量和
#该变量占的位数,比如uint8类型)
img.dtype


#==================================================================
#视频文件的读/写


#OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。
#支持得格式会因系统的不同而变化,但应该都支持AVI格式。在达到视频文件
#末尾之前,VideoCapture类通过read()函数来获取新的帧,每帧是一幅基于BGR
#格式的图像。
#可将一幅图像传递给VideoWriter类的write()函数,该函数会将这幅图像加到
#VideoWriter类所指向的文件中。


#读取AVI文件的帧,并采用YUV颜色编码将其写入另一个帧中:
import cv2

videoCapture = cv2.VideoCapture('MyInputVid.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的参数为:(指定的视频文件名,编解码器,帧速率,帧大小)
videoWriter = cv2.VideoWriter(
    'MyOutputVid.avi',cv2.VideoWriter_fourcc('I','4','2','0'),
    fps.size)
        
#获取一帧的图像
success, frame = videoCapture.read()
#循环访问,直到文件末尾
while success:
    #将获取的一帧图像加到VideoWriter类所指向的文件中
    videoWriter.write(frame)
    #获取下一帧图像
    success, frame = videoCapture.read()


#捕获摄像头10秒的视频信息,并将其写入一个AVI文件中:
import cv2

cameraCapture = cv2.VideoCapture(0)
#设置帧速率,VideoCapture类的get()方法不能返回摄像头帧速率的准确值时,返回0
fps = 30
#获取帧大小
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

#videoWriter的参数为:(指定的视频文件名,编解码器,帧速率,帧大小)
videoWriter = cv2.VideoWriter(
    'MyOutputVid.avi',cv2.VideoWriter_fourcc('I','4','2','0'),
    fps.size)
        
#获取一帧的图像
success, frame = cameraCapture.read()
#计算10秒视频的帧数,由于已经获取了一帧图像,所以还剩299帧
numFramesRemaining = 10 * fps -1
#循环访问
while success and numFramesRemaining > 0:
    #将获取的一帧图像加到VideoWriter类所指向的文件中
    videoWriter.write(frame)
    #获取下一帧图像
    success, frame = cameraCapture.read()
    numFramesRemaining -= 1
cameraCapture.release()
     
    
#当需要同步一组摄像头或一个多头摄像头(例如立体摄像头或Kinect)时,
#read()方法求不再合适了,可用grab()和retrieve方法替代它。
#对于一组摄像头,可以使用一下代码:
success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
    frame0 = cameraCapture0.retrieve()
    frame1 = cameraCapture1.retrieve()
    
    
    
    
#==================================================================
#显示图像是OpenCV最基本的操作之一,imshow()函数可以实现该操作。
#一下是几行简单的代码可以显示一幅图像:
import cv2
import numpy as np

img = cv2.imread('MyPic.png')
#显示图像
cv2.imshow('MyPic',img)
#等待按下任意键
cv2.waitKey()
#释放由OpenCV创建的所有窗口
cv2.destroyALLWindows()

#imshow()函数有两个参数:显示图像的帧名称以及要显示的图像本身

#首先waitKey()的默认值为0,即不写参数时默认值为0,代表无限等待。当写参数时,例如waitKey(5),意思是等待5ms。
#另外当等待时间内无任何操作时等待结束后返回-1,当等待时间内有输入字符时,则返回字符的ASCII码。 
#waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值是-1(表示
#没有键被按下)或ASCII码。


#==================================================================
#在窗口显示摄像头帧
#OpenCV的namedWindow()、imshow()和DestroyWindow()函数允许指定窗口名来
#创建、显示和销毁窗口。此外,任意窗口下都可以通过waitKey()函数来获取
#键盘输入,通过setMouseCallback()函数来获取鼠标输入。
#一下代码可以实时显示摄像头帧:
import cv2 

clicked = False
def onMouse(event,x,y,flags,param):
    global clicked
    if event == cv2.EVENT_LBUTTONOP:
        clicked = True

cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow',onMouse)

print("正在显示摄像头帧,单击窗口或按下任意键停止。")

success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
    cv2.imshow('MyWindow',frame)
    success, frame = cameraCapture.read()

cv2.destroyWindow('MyWindow')
cameraCapture.release()


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值