• opencv基础教程


    1,基本语法

    环境:python3.6.6+numpy+opencv3

    安装:没有详细编译,直接pip install opencv-python

    矩阵和图片:

    img=numpy.zeros((3,3),dtype=numpy.uint8)    #创建一个3*3的矩阵,每个像素用八位整数来表示
    img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)    #把矩阵转换成bgr格式,bgr:blue,green,read通道,实际上是创建了一个3*3的小黑方块

    读写图片:

    image=cv2.imread("D:\opencv/31.png")    #读取图片,格式转换,写出
    cv2.imwrite("31.png",image)

    转换图片:

    image=cv2.imread("31.png",0)    #读取装换成灰度图,写出,后边的参数的含义如下
    cv2.imwrite("any31.png",image)
    """
    IMREAD_ANYCOLOR=4
    IMREAD_ANYDEPTH=2
    IMREAD_COLOR=1
    IMREAD_GRAYSCALE=0 gray image
    IMREAD_LOAD_GDAL=8
    IMREAD_UNCHANGED=-1
    """

    2,图像与原始字节之间的关系

    灰度图:image[0,0]第一个值表示y轴,第二个表示x轴,合起来表示左上角第一个像素,灰度值为255。还可以表示成image.setitem((0,0),128)

    彩图:image[0,0,0]第一个值y轴,第二个x轴,第三个表示颜色通道。对于左上角有蓝色像素的图而言,image[0,0]是[255,0,0]

    数组转换成图像数据:

    import numpy
    import cv2
    import os
    
    randomByteArray=bytearray(os.urandom(120000))  #生成一堆字节数组,可以理解为元素介于0-255之间
    flatNumpyArray=numpy.array(randomByteArray)    #bytearray是字节数组,py3特有的,把一堆数或字符串变成字节
    #flatNumpyArray=numpy.random.randint(0,256,120000)这样也是可以的
    
    grayImage=flatNumpyArray.reshape(300,400)    #转换数组使之成为300*400的灰度图
    cv2.imwrite("randomgray.png",grayImage)
    """字节,
    一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十
    进制。最小值:0 最大值:255 。如一个ASCII码就是一个字节,此类单位的换算为: 1KB(Kilobyte 千
    字节)=1024B,1MB(Megabyte 兆字节 简称“兆”)=1024KB,1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,"""
    
    bgrImage=flatNumpyArray.reshape(100,400,3)    #把数组转换成100*400有三个通道的彩图
    cv2.imwrite("randoncolor.png",bgrImage)

     通过操作数组来编辑图

    import numpy as np
    import cv2 as cv
    
    img=cv.imread("31.png")
    img[0,0]=[255,255,255]    #[255,255,255] bgr三个通道合起来是白色,把左上第一个像素变成白色
    
    print(img.item(100,0,0))    #打印出图片中坐标为(100,0)的b通道值(g对应的是1,r对应的是2)
    img.itemset((100,0,0),0)    #把该像素的b通道设置为0
    print (img.item(100,0,0))    #再次打印出来
    
    #至此我们发现,我们可以迭代整个数组来实现为每个像素换颜色,但是这样并不高效,建议使用索引
    img[:,:,1]=0    #把图像的每一个像素的g通道(绿色,对应的是1)的值都设置成0
    cv.imwrite("test.png",img)    #写下来的图片完全没有绿色
    
    #通过复制数组,把图像的一个区域复制到另一个区域
    apart=img[0:100,0:100]    #俩区域要一样大
    img[100:200,100:200]=apart
    cv.imwrite('test1.png',img)

    获取图像的属性

    
    
    import cv2 as cv
    
    img=cv.imread("31.png")
    print (img.shape) #分辨率加通道数的数组(407, 500, 3)
    print (img.size) #像素数乘以通道数
    print (img.dtype) #图像的数据类型,比如uint

    3,视频文件的读写

    import cv2
    videoCapture=cv2.VideoCapture("test.mp4")    #先赋值视频文件以便获取各种参数
    fps=videoCapture.get(cv2.CAP_PROP_FPS)   #fps每秒传输的帧数
    #此处是可以打出来的:print(fps)返回14
    size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))    #获取宽和高
    #此处也是可以打印出来的,基本上就是图片的长宽:print (size)
    videoWriter=cv2.VideoWriter('myoutput.avi',cv2.VideoWriter_fourcc("I",'4','2','0'),fps,size)    #定义打印视频文件的打印器,写文件,参数分别是文件名,编解码器(下附详情),帧数和大小
    #另注意,这个编码器是未压缩的yuv颜色编码
    success,frame=videoCapture.read()    #一帧一帧地读取videoCapture,如果成功的话继续执行
    while success:
        videoWriter.write(frame)    #读到就用打印器写下来
        success,frame=videoCapture.read()    #重新赋值以便循环

    视频编码器类型:

    实时捕获摄像头的帧:

    2.1.7

     

     感谢《OpenCV3计算机视觉Python语言实现》这本书,感谢脚本之家。

  • 相关阅读:
    HttpServletResponse对锂
    搭建java Web项目开发环境(一)
    React Native动画-Animated
    React-Navigation redux集成
    react-navigation 使用详解
    echart
    io-输出流
    react-native-lesson
    集合类-HashSet去重
    kafka不同主题使用同一个group.id的坑
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/9835991.html
Copyright © 2020-2023  润新知