CodeGym /Các khóa học /Python SELF VI /Trích xuất, xử lý và lưu khung hình từ video với MoviePy

Trích xuất, xử lý và lưu khung hình từ video với MoviePy

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Tại sao cần làm điều này?

Trước khi bắt đầu công cụ trích xuất khung hình ảo, chúng ta hãy thảo luận tại sao điều này lại quan trọng. Trích xuất và xử lý từng khung hình có thể hữu ích để tạo hiệu ứng, phân tích sự thay đổi theo thời gian, cũng như chuẩn bị hình ảnh cho học máy. Đây cũng là cách tuyệt vời để sử dụng khung hình để tạo trình chiếu hoặc hoạt hình.

Các bước chính khi làm việc với khung hình

  1. Trích xuất khung hình từ video.
  2. Xử lý các khung hình đã được trích xuất.
  3. Lưu các khung hình đã xử lý.

Giờ khi chúng ta đã biết mục tiêu của mình, hãy bắt tay vào thực hành nhé.

2 Trích xuất Khung Hình từ Video

Bắt đầu từ cơ sở - trích xuất khung hình. Với MoviePy, bạn có thể dễ dàng truy cập các khung hình riêng lẻ trong video, bằng cách sử dụng các phương thức của lớp VideoFileClip. Mỗi khung hình được biểu diễn dưới dạng một mảng (mảng đa chiều của các pixel), có thể được xử lý bằng MoviePy hoặc các thư viện khác như NumPy hoặc Pillow.

Mở video và truy cập khung hình cụ thể


from moviepy.editor import VideoFileClip

# Mở file video
video_clip = VideoFileClip("sample_video.mp4")

# Trích xuất khung hình tại giây thứ 5
frame = video_clip.get_frame(5)

# In thông tin về khung hình
print("Loại dữ liệu của khung hình:", type(frame))
print("Kích thước khung hình:", frame.shape)

Trong ví dụ này:

  • VideoFileClip("sample_video.mp4") mở file video và tạo đối tượng video_clip.
  • video_clip.get_frame(5) trích xuất khung hình ở giây thứ 5.
  • frame.shape hiển thị kích thước khung hình (chiều cao, chiều rộng và số kênh màu).

3. Lưu khung hình dưới dạng ảnh

Sau khi trích xuất khung hình, bạn có thể lưu nó dưới dạng một ảnh. Để làm điều này, bạn có thể sử dụng thư viện Pillow (PIL) để làm việc với hình ảnh.

Cài đặt Pillow

Nếu Pillow chưa được cài đặt, hãy cài nó bằng pip:

pip install pillow

Lưu khung hình dưới dạng ảnh


from PIL import Image
from moviepy.editor import VideoFileClip

# Mở video và trích xuất khung hình tại giây thứ 5
video_clip = VideoFileClip("sample_video.mp4")
frame = video_clip.get_frame(5)

# Chuyển đổi khung hình sang ảnh và lưu
image = Image.fromarray(frame)
image.save("frame_at_5_seconds.png")

Ở đây:

  • Image.fromarray(frame) chuyển đổi mảng pixel thành một đối tượng ảnh.
  • image.save("frame_at_5_seconds.png") lưu khung hình dưới dạng file PNG.

4. Trích xuất loạt khung hình từ video

Nếu bạn cần trích xuất nhiều khung hình theo chu kỳ (ví dụ: mỗi khung, mỗi giây hoặc theo một khoảng thời gian cụ thể), bạn có thể sử dụng vòng lặp để lấy các khung hình mong muốn. Điều này hữu ích nếu bạn cần phân tích hoặc tạo hình thu nhỏ từ video.

Ví dụ: Trích xuất và lưu khung hình mỗi giây


from PIL import Image
from moviepy.editor import VideoFileClip

# Mở file video
video_clip = VideoFileClip("sample_video.mp4")

# Thời lượng video tính bằng giây
duration = int(video_clip.duration)

# Trích xuất và lưu khung hình mỗi giây
for i in range(duration):
    frame = video_clip.get_frame(i)
    image = Image.fromarray(frame)
    image.save(f"frame_{i}_second.png")

Ở đây:

  • for i in range(duration) lặp qua từng giây cho đến hết video.
  • Tại mỗi giây, khung hình được trích xuất, chuyển đổi sang ảnh và lưu với tên duy nhất (ví dụ: frame_1_second.png, frame_2_second.png).

5. Thay đổi kích thước khung hình trước khi lưu

MoviePy cho phép bạn thay đổi kích thước khung hình trước khi lưu. Điều này hữu ích nếu bạn cần tạo hình thu nhỏ hoặc ảnh nhỏ hơn từ các khung hình.

Thay đổi kích thước khung hình và lưu


from PIL import Image
from moviepy.editor import VideoFileClip

# Mở file video
video_clip = VideoFileClip("sample_video.mp4")

# Trích xuất khung hình tại giây thứ 10
frame = video_clip.get_frame(10)

# Chuyển đổi khung hình sang ảnh
image = Image.fromarray(frame)

# Thay đổi kích thước khung hình thành 200x200 pixel
image_resized = image.resize((200, 200))

# Lưu ảnh đã thay đổi kích thước
image_resized.save("resized_frame_at_10_seconds.png")

6. Trích xuất khung hình với tần số cụ thể

Nếu bạn cần trích xuất khung hình với tần số cụ thể (ví dụ: mỗi khung thứ 10 để phân tích chuyển động), bạn có thể sử dụng thông số fps.

Ví dụ: Trích xuất mỗi khung thứ 10


from PIL import Image
from moviepy.editor import VideoFileClip

# Mở file video
video_clip = VideoFileClip("sample_video.mp4")

# Thiết lập tần số lấy mẫu khung hình (ví dụ: mỗi khung thứ 10)
frame_interval = 10

# Trích xuất và lưu mỗi khung thứ 10
for i, frame in enumerate(video_clip.iter_frames()):
    if i % frame_interval == 0:
        image = Image.fromarray(frame)
        image.save(f"frame_{i}.png")

Ở đây:

  • video_clip.iter_frames() cho phép lặp qua tất cả các khung hình trong video.
  • if i % frame_interval == 0 chỉ trích xuất mỗi khung thứ 10.

7. Xử lý Khung Hình

Trích xuất khung hình chỉ là một nửa công việc, có thể bạn muốn thêm một chút "ma thuật" vào bức ảnh của mình. Chúng ta sẽ sử dụng thư viện Pillow để xử lý hình ảnh.


# Chuyển đổi ảnh thành đen trắng
image_bw = image.convert("L")
image_bw.save("mid_frame_bw.png")

Ở đây, chúng ta đã lấy khung hình trích xuất và chuyển đổi nó thành ảnh đen trắng. Sự thay đổi đơn giản nhưng hiệu quả này có thể làm cho khung hình của bạn trở nên ấn tượng hơn.

8. Vấn đề và giải pháp

Trong thế giới xử lý video, có những khó khăn riêng. Hãy đảm bảo rằng đường dẫn file của bạn chính xác, nếu không thì code của bạn có thể nhanh chóng biến thành "tìm kim trong đống rơm". Và đừng quên kiểm tra xem tất cả các thư viện và gói cần thiết đã được cài đặt chưa, đặc biệt nếu bạn đã khởi động lại hệ thống hoặc cập nhật Python. Đôi khi các phụ thuộc bị bỏ quên có thể gây ra "bữa tiệc lỗi" bất ngờ.

Quá trình trích xuất và xử lý khung hình này thực sự hữu ích trong nhiều lĩnh vực. Ví dụ: tạo tài liệu hướng dẫn, phân tích video thể thao để luyện tập, hoặc áp dụng cách tiếp cận sáng tạo để chỉnh sửa và xử lý video.

Vì vậy, một khi bạn nắm vững tất cả các kỹ thuật này, bạn có thể dễ dàng chia nhỏ bất kỳ video nào thành các khung hình riêng lẻ và làm bất cứ điều gì bạn muốn với chúng! Hãy quên đi sự nhàm chán và đơn điệu — công cụ mới của bạn mở ra một thế giới đầy cơ hội. Và hãy nhớ rằng, với MoviePy, bạn không cần siêu năng lực để tạo ra thứ gì đó thực sự tuyệt vời.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION