• opencv入门到精通——图片,视频,摄像头的读取与保存


     简介


    OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。


    1.计算机眼中的图像

    RGB图像是一种由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成的彩色图像。每个像素点都有三个数值,分别代表其在红色、绿色和蓝色通道中的亮度。每个数的取值为(0-255),三个不同的值组合就形成一个像素点。

    这三个通道共同组成了RGB图像,它们的组合形成了每个像素点的颜色。通过调整每个通道的亮度和色彩分布,可以改变图像的颜色和外观。

    1. import cv2
    2. import numpy as np
    3. # 读取图片
    4. image = cv2.imread('image/1.jpg')
    5. # 打印图片的形状,即高宽和通道数
    6. h, w, c = image.shape
    7. print(h, w, c)
    8. # 打印(60,60)的像素点的rgb值
    9. pixel = image[60, 60]
    10. print(pixel)
    11. # 创建一个空数组和图像格式大小相同
    12. pixels = np.zeros((h, w, c), dtype=np.uint8)
    13. # 遍历每个像素点
    14. for y in range(h):
    15. for x in range(w):
    16. # 获取像素点的数值
    17. pixel = image[y, x]
    18. # 将像素点的数值存储到新数组中
    19. pixels[y, x] = pixel
    20. # 输出结果
    21. print(pixels)

     打印结果如下所示,这就是一张的图片在计算机眼中的结构,实操过程中可以采用断点方式依次打印。

    当然以上是为了更好的看清图片的本质,我们可以直接用数组完成上述的操作

    1. import cv2
    2. import numpy as np
    3. # 读取图片
    4. image = cv2.imread('image.jpg')
    5. # 将图像转换为NumPy数组
    6. pixels = np.array(image)
    7. # 输出结果
    8. print(pixels)

    2.图片的读取、显示与保存

    1. import cv2
    2. # 读取图片并转为灰度图
    3. # image = cv2.imread('image/1.jpg')
    4. image = cv2.imread('image/1.jpg', cv2.IMREAD_GRAYSCALE)
    5. # 显示图片窗口,并命名为 'IMG'
    6. cv2.imshow('IMG', image)
    7. # 保存到image路径下并命名为jujingyi
    8. cv2.imwrite('image/jujingyi.jpg', image)
    9. # 等待键盘输入,参数为0表示一直等待,直到按下任意键
    10. cv2.waitKey(0)
    11. # 关闭所有打开的窗口
    12. cv2.destroyAllWindows()

     cv2.imread()函数用来读取图片

    cv2.imwrite()函数用来保存图片

    cv2.waitKey(0) 0表示按任意键停止,1000表示1000毫秒后关闭窗口

     

    3.视频的读取与显示

    1. import cv2
    2. cap = cv2.VideoCapture(0)
    3. while True:
    4. success, image = cap.read()
    5. cv2.imshow('IMG', image)
    6. # 等待1毫秒,检测键盘输入
    7. if cv2.waitKey(1) & 0xFF == ord('q'):
    8. break
    9. # 循环结束后释放摄像头资源和关闭窗口
    10. cap.release()
    11. cv2.destroyAllWindows()

    cv2.VideoCapture(0)  设为0 表示使用电脑自带的摄像头,使用外设的话,选择1或者2,具体查看你的外设摄像头在电脑中的编号。你也可以输入视频地址来读取指定视频。

    使用while循环来遍历摄像头读取的每一帧图片,并存入image中。

    我们使用了 cv2.waitKey(1) 函数等待1毫秒并检测键盘输入。使用位运算符 & 和函数 ord() 将键盘输入的字符与 ASCII 码中字符 'q'(即按下 'q' 键)进行比较。如果相等,则通过 break 语句退出循环。

    当退出循环后,我们需要释放摄像头资源和关闭窗口。使用 cap.release() 释放摄像头资源,然后调用 cv2.destroyAllWindows() 关闭显示窗口。

    这样,当按下键盘上的 "q" 键时,程序会退出循环,并释放摄像头资源和关闭窗口。

    如果我们希望保存我们摄像头记录的图片

    1. import cv2
    2. cap = cv2.VideoCapture(0)
    3. # 设置保存视频的参数
    4. save_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    5. save_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    6. fourcc = cv2.VideoWriter_fourcc(*'XVID')
    7. out = cv2.VideoWriter('output.avi', fourcc, 20.0, (save_width, save_height))
    8. while True:
    9. success, image = cap.read()
    10. cv2.imshow('IMG', image)
    11. # 保存每一帧图像到视频文件
    12. out.write(image)
    13. if cv2.waitKey(1) & 0xFF == ord('q'):
    14. break
    15. cap.release()
    16. out.release()
    17. cv2.destroyAllWindows()

    我们根据摄像头的参数设置视频保存的相关参数:保存的视频宽度和高度与摄像头的参数相同,使用四字符码(fourcc)定义视频编解码器为XVID,帧率设定为20.0,并指定保存的视频尺寸。

    在进入循环之前,我们使用cv2.VideoWriter()函数创建一个用于保存视频的对象。其中,第一个参数是保存的视频文件名,第二个参数是指定视频编解码器,第三个参数是帧率,第四个参数是保存的视频尺寸。

    在循环中,每一帧图像都会被保存到视频文件中,通过out.write(image)实现。

    最后,在退出循环后,我们需要释放摄像头资源和关闭视频对象。使用cap.release()释放摄像头资源,out.release()关闭视频对象。

    这样,当按下键盘上的 "q" 键时,程序会退出循环,并保存摄像头读取的数据为视频文件 "output.avi"。

    其中

    cv2.VideoWriter()函数用于创建一个用于保存视频的对象。它的参数解释如下:

    filename: 保存的视频文件名。 这里的 'output.avi' 是保存视频的文件名,可以根据需要自行更改。

    fourcc: 视频编解码器。 fourcc 是一个四字符码,用于指定视频的编解码器。常见的四字符码包括 MP4V、XVID、MJPG等,可以根据需要选择。在示例代码中,我们使用了 *'XVID' 表示使用 XVID 编解码器。

    fps: 帧率(Frames per Second)。 fps 表示保存视频时的帧率,即每秒播放的帧数。在示例代码中,我们将帧率设定为20.0,可以根据需要进行调整。

    frameSize: 视频尺寸。 frameSize 是保存视频时的尺寸,即每一帧图像的大小。在示例代码中,我们将尺寸设置为(save_width, save_height),其中 save_width 和 save_height 是根据摄像头的参数获得的宽度和高度
     

    如果你想保存为MP4格式的视频文件,你可以修改fourcc参数为适合MP4格式的编解码器

    1. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    2. out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (save_width, save_height))

     

    在上述代码中,我们使用了*'mp4v'作为fourcc参数,表示使用MP4编解码器。同时,将保存的文件名改为 'output.mp4'

    这样修改后,摄像头读取的数据将以MP4格式进行保存。请确保你的OpenCV版本支持该编解码器,否则可能会出现错误。

  • 相关阅读:
    WebSocket与SSE区别
    WinFrom应用程序开机自启动
    【C语言学习笔记---学指针必刷它】
    解决Iterm2升级后遇到“Stashed changes“的问题
    Dubbo之属性设置。
    1款可以美颜变妆换装的虚拟人SDK|Android
    Python学习备忘录
    C++数组莫名其妙出现NaN——记一次由C++数组错误初始化导致的问题
    多线程-AQS
    从0开始搭建Web自动化测试框架全网最牛最全教程
  • 原文地址:https://blog.csdn.net/weixin_45303602/article/details/133934918