利用opencv从视频中,逐帧提取轮廓面积数据,并保存到与视频相同名称的mat文件中
时间: 2024-02-15 10:05:24 浏览: 32
好的,以下是代码实现:
```python
import cv2
import numpy as np
import os
# 读取视频文件
video_path = 'video.mp4'
cap = cv2.VideoCapture(video_path)
# 获取视频属性
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建用于保存轮廓面积的数组
contour_areas = np.zeros(frame_count)
# 遍历每一帧并提取轮廓面积
frame_num = 0
while True:
ret, frame = cap.read()
if not ret:
break
# 进行灰度化和二值化处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓并计算面积
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour_areas[frame_num] = sum([cv2.contourArea(contour) for contour in contours])
# 显示当前进度
print(f'正在处理第 {frame_num+1}/{frame_count} 帧')
frame_num += 1
# 释放视频对象
cap.release()
# 保存轮廓面积数据到 mat 文件中
mat_file_path = os.path.splitext(video_path)[0] + '.mat'
np.savetxt(mat_file_path, contour_areas)
print(f'轮廓面积数据已保存到 {mat_file_path} 文件中')
```
这段代码会逐帧读取视频文件,对每一帧进行灰度化和二值化处理,然后查找轮廓并计算面积。最后将轮廓面积保存到与视频相同名称的 mat 文件中。
需要注意的是,此代码中使用的是 OpenCV 的旧版轮廓提取函数 `cv2.findContours()`,如果你使用的是 OpenCV 4.x 版本,可以改用新版轮廓提取函数 `cv2.findContours()`。