机器视觉学习(三)—— 保存视频流

该博客围绕OpenCV保存视频展开。介绍了使用OpenCV保存视频的操作步骤,包括导入必要库、创建VideoWriter对象、从摄像头或视频文件读取帧等,还给出通过摄像头拍摄视频并保存到相应路径的典型代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、获取视频

二、知识拓展

三、典型代码举例


一、获取视频

要使用OpenCV保存视频,可以按照以下步骤进行操作:

"""
    OpenCV打开摄像头
    设置摄像头参数
    录制视频
"""

1.  导入必要的库:

import cv2

2.  创建一个VideoWriter对象:

#定义保存视频的文件名、编解码器、帧率和分辨率
filename = 'output.avi'
codec = cv2.VideoWriter_fourcc(*'XVID')
fps = 30.0
frame_size = (640, 480)

#创建VideoWriter对象
video_writer = cv2.VideoWriter(filename, codec, fps, frame_size)

3.  从摄像头或者视频文件中读取帧:

#打开摄像头或者视频文件
cap = cv2.VideoCapture(0) #传入0表示打开默认摄像头
#cap = cv2.VideoCapture('input.avi') #传入视频文件名

while True:
    #读取一帧
    ret, frame = cap.read()

    #显示帧
    cv2.imshow('Video', frame)

    #保存帧到视频文件
    video_writer.write(frame)

    #按下q键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#释放资源
cap.release()
video_writer.release()
cv2.destroyAllWindows()

"""
cv2.VideoCapture()          函数从摄像头或者视频文件中读取帧
cv2.imshow()                函数显示
video_writer.write()        函数将帧写入视频文件
cap.release()               释放摄像头或者视频文件资源
video_writer.release()      释放视频文件资源
cv2.destroyAllWindows()     关闭所有窗口
"""

二、知识拓展

个人笔记(仅供参考)

"""
图像显示:
    cv2.imshow(winname,img)
        winname:    窗口名称
        img:        显示的图像

图层(通道)分离: 
    cv2.split(img)
        img:    要分离的图像

图层(通道)合并:
    cv2.merge(img)
        img:    要合并的色彩通道

视频流读取:
    cv2.VideoCapture(filename)
        filename:       打开的摄像头设备或者打开的视频路径  
    cv2.VideoCapture(0)
        0:              读取摄像头, 0为摄像头索引,当有多个摄像头时,从 0开始编号

视频流参数读改:
    cap(变量名).get(propId)                         获得视频的一些参数信息
        propId:                             可以是 0到 18之间的任何整数,即下表代码
    cap(变量名).get(3),cap.get(4)                   查看每一帧的宽和高,默认得到的值是 640x480

    cap(变量名).set(propId,value)                   修改参数
        value:                              想要设置成的新值
    cap(变量名).set(3,320),cap.set(4,240)           来把宽和高改成 320x240

        propId                              可以以数字代替,按顺序从0开始
        代码                       代替数字                                   代码                         代替数字          
CV_CAP_PROP_POS_MSEC                  0                             CV_CAP_PROP_BRIGHTNESS                  10
CV_CAP_PROP_POS_FRAMES                1                             CV_CAP_PROP_CONTRAST                    11
CV_CAP_PROP_POS_AVI_RATIO             2                             CV_CAP_PROP_SATURATION                  12                               
CV_CAP_PROP_FRAME_WIDTH               3                             CV_CAP_PROP_HUE                         13    
CV_CAP_PROP_FRAME_HEIGHT              4                             CV_CAP_PROP_GAIN                        14                                 
CV_CAP_PROP_FPS                       5                             CV_CAP_PROP_EXPOSURE                    15                                     
CV_CAP_PROP_FOURCC                    6                             CV_CAP_PROP_CONVERT_RGB                 16                                            
CV_CAP_PROP_FRAME_COUNT               7                             CV_CAP_PROP_WHITE_BALANCE               17                                      
CV_CAP_PROP_FORMAT                    8                             CV_CAP_PROP_RECTIFICATION               18                                  
CV_CAP_PROP_MODE                      9                                                                          


视频流保存:
    VideoWriter(filename,fourcc,fps,frameSize)
        filename:           打开的摄像头设备或者打开的视频路径
        fourcc:             
        指定编码器  (编码器是将数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备) 
        fps:                要保存的视频的帧率
        frameSize:          要保存的文件的画面尺寸

视频流接收:
    ret,frame = cam(变量名).read()
        cam(变量名).read()              返回一个布尔值
        ret                     接收布尔值,如果为 True,则说明每一帧图像都被正常读取
        frame                   用于接收得到的每一帧图片

视频流编码设置:
    cv.VideoWriter_fourcc()
    常用编码格式有以下几种:
                    Fourcc                                          视频文件后缀
            cv2.VideoWriter_fourcc('M', 'P', '4', 'V')                  .mp4
            cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')                  .avi
            cv2.VideoWriter_fourcc('I', '4', '2', '0')                  .avi
            cv2.VideoWriter_fourcc('P', 'I', 'M', 'I')                  .avi
            cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')                  .ogv
            cv2.VideoWriter_fourcc('F', 'L', 'V', '1')                  .flv

"""

三、典型代码举例

通过摄像头拍摄视频并保存到相应路径:

import cv2 as cv

cap = cv.VideoCapture(0)                        # 读取摄像头
cap.set(cv.CAP_PROP_EXPOSURE,0)                 # 视频流参数读改       或者 cap.set(15,0) 
# cap.set(3,4080),cap.set(4,3060)               # 把窗口宽和高改成 4080x3060

fourcc = cv.VideoWriter_fourcc(*"MJPG")
xin = cv.VideoWriter("xin_1.avi",fourcc,80,(640,480))                   # 视频流保存

while(cap.isOpened()):                          # 用于判断 cap是否正常初始化,返回布尔值,正常则返回 True
    ret,frame = cap.read()
    xin.write(frame)
    cv.imshow("CAP",frame)
    if cv.waitKey(1) == 27:                     # 等候 1ms,播放下一帧
        break

cap.release()
xin.release()
cv.destroyAllWindows()

### 使用Java实现机器视觉中的长度测量 #### 技术背景与原理 为了利用Java进行机器视觉中的长度测量,需要理解基本的工作原理和技术栈。通过OpenCV库可以在Java环境中处理图像数据,并应用几何学方法如相似角形来估计实际尺寸。 对于基于图像的长度测量而言,核心在于建立物理世界坐标系下的已知尺度对象与其投影在二维平面上对应特征之间的关系[^1]。当拍摄角度固定时,可以通过预先校准获取相机参数以及设定标准参照物,在此基础上分析待测物体边缘轮廓或其他显著标记点的位置变化情况,进而推导出目标的真实大小或间距。 #### 实现方案概述 具体来说,要完成这项任务涉及以下几个方面: - **环境搭建**:确保安装了适合版本JDK,并配置好IDE(例如Eclipse/IntelliJ IDEA)。下载并导入官方发布的OpenCV Java包作为依赖项。 - **初始化设置**:编写程序加载所需的视频流或者静态图片文件;定义ROI(Region of Interest),即感兴趣区域用于限定后续操作范围;调用`Mat`类实例化矩阵容器保存读取的数据帧。 - **预处理阶段**:运用灰度变换、高斯模糊滤波等手段改善原始素材质量,减少噪声干扰影响最终精度。接着执行二值化转换使前景主体更加突出明显以便于下一步提取边界线段信息。 - **特征识别过程**:借助Canny算子检测边缘像素集合形成闭合曲线结构表示实物外形轮廓。再者,可考虑引入霍夫直线变换寻找特定方向上的连续分布模式辅助定位端点座标位置。 - **计算逻辑部分**:依据前述提到的比例因子关联理论模型求解未知量——被摄体的实际宽度高度数值。此环节可能还会涉及到透视畸变矫正补偿措施以提高准确性。 下面给出一段简化版代码片段展示上述思路的具体编码实践方式: ```java import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class LengthMeasurement { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { Mat srcImage = Imgcodecs.imread("path/to/image.jpg"); // Convert to grayscale and apply Gaussian blur Mat grayImage = new Mat(); Imgproc.cvtColor(srcImage, grayImage, Imgproc.COLOR_BGR2GRAY); Imgproc.GaussianBlur(grayImage, grayImage, new Size(7, 7), 0); // Edge detection using Canny algorithm Mat edges = new Mat(); Imgproc.Canny(grayImage, edges, 50, 150); // Find contours from the edge-detected image List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); Imgproc.findContours(edges, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // Assuming we have a reference object with known width (in pixels or real-world units) double refWidthInPixels = ...; // Set this value based on your calibration // Calculate distance between camera and object here... // This would involve more complex calculations depending on setup specifics. // For demonstration purposes only: System.out.println("Reference Width in Pixels: " + refWidthInPixels); } } ``` 这段示例展示了如何使用OpenCV API来进行基础的图像处理和初步的对象轮廓发现工作。然而请注意这只是一个起点,完整的解决方案还需要进一步细化各个步骤间的衔接机制并且加入必要的错误检查语句保障稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慕卿扬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值