数据处理——avi视频数据转png图片格式代码,mat转png图片格式代码,图片裁剪成固定大小代码。

本文介绍了一个Python脚本,用于读取HMC-QU数据集中的AVI视频,根据Excel文件中的帧范围转换为PNG格式,并对图片进行裁剪。脚本遍历avi文件夹,逐帧抓取并保存为PNG,同时处理可能存在的错误和文件管理问题。
摘要由CSDN通过智能技术生成

avi2png

处理HMC-QU数据集记录,每一个avi视频,通过xlsx中记录的初始帧和结束帧进行帧转png,保存在以avi视频名为名的文件夹下。

import os
import cv2
import pandas as pd

# 输入文件夹路径
folder_path = 'avidata'

# 输出文件夹路径
output_folder = 'avipng'
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 读取Excel文件
excel_path = 'du.xlsx'
df = pd.read_excel(excel_path)
def format_numbers(start, end, width=3):
    return [f"{num:0{width}}" for num in range(start, end + 1)]

# 生成png的名字id
save_id = format_numbers(1,1000,4)
# 遍历文件夹下所有avi文件
total = 0
for filename in os.listdir(folder_path):
    if filename.endswith(".avi"):
        video_path = os.path.join(folder_path, filename)
        cap = cv2.VideoCapture(video_path)

        # 检查视频是否成功打开
        if not cap.isOpened():
            print(f"Error: Could not open video {filename}")
            continue

        # 获取视频帧数
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        video_info = df[df['name'] == filename.split(".")[0]]

        if video_info.empty:
            print(f"No frame indices found for video {filename} in the Excel file.")
            continue

        # folder = os.path.join(output_folder, filename.split(".")[0])
        # os.makedirs(folder)

        start_frame = int(video_info['start'])
        end_frame = int(video_info['end'])

        # 检查索引是否在视频帧数范围内
        if start_frame < 1 or end_frame > frame_count or start_frame >= end_frame:
            print(f"Invalid frame indices for video {filename}. Skipping...")
            continue

        # 设置视频读取位置到起始帧
        cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame - 1)

         # 创建输出文件夹
        

        # 读取视频帧并保存为图片
        frame_num = start_frame
        while frame_num <= end_frame:
            ret, frame = cap.read()
            print(type(frame), frame.shape)

            # 检查视频是否读取完毕
        #     if not ret:
        #         break

        #     # 将视频帧保存为图片
        #     img_name = f"D{frame_num}.png"
        #     img_name = f"D{save_id[frame_num-start_frame]}.png"
        #     img_path = os.path.join(folder, img_name)
        #     cv2.imwrite(img_path, frame)

        #     # 打印进度
        #     print(f"Frame {frame_num} of {filename} saved")

        #     # 更新帧计数器
        #     frame_num += 1
        #     total += 1

        # # 释放资源
        # cap.release()

print("All videos processed successfully!")
print(total)

将图片裁剪成224大小

'''
Descripttion: 
Result: 
Author: Philo
Date: 2024-04-25 08:34:57
LastEditors: Philo
LastEditTime: 2024-04-25 08:35:10
'''
from PIL import Image
import os

def crop_and_replace(image_path, target_size=(224, 224)):
    try:
        # 打开图片文件
        image = Image.open(image_path)
        # 裁剪图片
        image = image.resize(target_size, Image.ANTIALIAS)
        # 替换原始图片
        image.save(image_path)
        print(f"{image_path} 裁剪并替换成功")
    except Exception as e:
        print(f"处理 {image_path} 时出错: {e}")

def crop_and_replace_in_folder(folder_path):
    # 遍历文件夹中的每个文件
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        # 如果是文件夹,则递归处理子文件夹
        if os.path.isdir(file_path):
            crop_and_replace_in_folder(file_path)
        # 如果是图片文件,则裁剪并替换
        elif filename.endswith(('.jpg', '.jpeg', '.png', '.bmp')):
            crop_and_replace(file_path)

# 指定包含图片文件的文件夹路径
folder_path = "2224"

# 开始裁剪并替换图片
crop_and_replace_in_folder(folder_path)

mat转png保存

'''
Descripttion: 
Result: 
Author: Philo
Date: 2024-04-24 10:18:47
LastEditors: Philo
LastEditTime: 2024-04-24 10:41:32
'''
# 生成的数据放在各自的文件夹中
import scipy.io as scio
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

# 根据自己任务指定文件夹的前缀和范围
folder_prefix = "LV Ground-truth Segmentation Masks"

folders_name = os.listdir(folder_prefix)

# 循环创建文件夹
for name in folders_name:
    # 使用zfill方法来保证文件夹名称的固定长度
    rename = name.split(".")[0]
    folder_name = os.path.join(folder_prefix, rename)
    print(folder_name)
#     # 使用os.makedirs来创建文件夹,exist_ok=True表示如果文件夹已存在则不会引发错误
    os.makedirs(folder_name, exist_ok=True)

# 生成图片名称,因为mat数据格式都有顺序
# 从1-100和从001100的命名方式对图片的影响不同
def format_numbers(start, end, width=3):
    return [f"{num:0{width}}" for num in range(start, end + 1)]

# 生成png的名字id
save_id = format_numbers(1,1000,4)

# 二值数据转到0-255范围(可见)
def MatrixToImage(data):
    data = data*255
    new_im = Image.fromarray(data.astype(np.uint8))
    return new_im
sum = 0
for tt in folders_name:
    rename = tt.split(".")[0]
    name = os.path.join(folder_prefix, rename)
    path = name
    mat_data = scio.loadmat(path)
    data = mat_data["predicted"]  # 这里是根据自己mat文件中提取数值
    for j in range(data.shape[0]):
        sum += 1
        new_im = MatrixToImage(data[j])
        save_name = save_id[j]
        new_im.save(f"{path}/D{save_name}.png")
    
print(sum)

以下是使用Qt和OpenCV打开摄像头,录取视频和截图的代码: mainwindow.h ```c++ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <opencv2/opencv.hpp> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_OpenCamera_clicked(); void on_pushButton_Record_clicked(); void on_pushButton_Screenshot_clicked(); private: Ui::MainWindow *ui; cv::VideoCapture cap; cv::VideoWriter writer; bool isRecording; }; #endif // MAINWINDOW_H ``` mainwindow.cpp ```c++ #include &quot;mainwindow.h&quot; #include &quot;ui_mainwindow.h&quot; #include <QFileDialog> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), isRecording(false) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_OpenCamera_clicked() { if(!cap.isOpened()){ cap.open(0); if(cap.isOpened()){ ui->pushButton_OpenCamera->setText(&quot;Close Camera&quot;); } else{ QMessageBox::warning(this, &quot;Error&quot;, &quot;Failed to open camera.&quot;); } } else{ cap.release(); ui->pushButton_OpenCamera->setText(&quot;Open Camera&quot;); } } void MainWindow::on_pushButton_Record_clicked() { if(!cap.isOpened()){ QMessageBox::warning(this, &quot;Error&quot;, &quot;Please open camera first.&quot;); return; } if(!isRecording){ QString filename = QFileDialog::getSaveFileName(this, &quot;Save Video&quot;, &quot;.&quot;, &quot;Videos (*.avi)&quot;); if(filename.isEmpty()){ return; } writer.open(filename.toStdString(), cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, cv::Size(cap.get(cv::CAP_PROP_FRAME_WIDTH), cap.get(cv::CAP_PROP_FRAME_HEIGHT))); if(!writer.isOpened()){ QMessageBox::warning(this, &quot;Error&quot;, &quot;Failed to save video.&quot;); return; } isRecording = true; ui->pushButton_Record->setText(&quot;Stop Record&quot;); } else{ writer.release(); isRecording = false; ui->pushButton_Record->setText(&quot;Start Record&quot;); } } void MainWindow::on_pushButton_Screenshot_clicked() { if(!cap.isOpened()){ QMessageBox::warning(this, &quot;Error&quot;, &quot;Please open camera first.&quot;); return; } cv::Mat frame; cap.read(frame); if(frame.empty()){ QMessageBox::warning(this, &quot;Error&quot;, &quot;Failed to get frame.&quot;); return; } QString filename = QFileDialog::getSaveFileName(this, &quot;Save Screenshot&quot;, &quot;.&quot;, &quot;Images (*.png *.jpg)&quot;); if(filename.isEmpty()){ return; } cv::imwrite(filename.toStdString(), frame); } ``` 这个代码利用了Qt的UI设计,包含了三个按钮:打开摄像头,开始/停止录制和截图。打开摄像头使用OpenCV的VideoCapture类,录制视频使用VideoWriter类,截图则是读取一帧图像并使用imwrite函数保存。 希望这个代码对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Philo`

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

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

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

打赏作者

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

抵扣说明:

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

余额充值