12/08/2018, 15:12

OpenCV With Python Part 2

Ở bài trước mình đã hướng dẩn các bạn tải python và các thư viện cần thiết như opencv, matplotlib để phục vụ cho chuổi bài hướng dẩn này. Mình đả hướng dẩn qua việc tải một bức ảnh lên như thế nào, một số thuật toán cần dùng để xử lý, định dạng bức ảnh theo ý muốn của mình. Và bây giờ chúng ta tiếp ...

Ở bài trước mình đã hướng dẩn các bạn tải python và các thư viện cần thiết như opencv, matplotlib để phục vụ cho chuổi bài hướng dẩn này. Mình đả hướng dẩn qua việc tải một bức ảnh lên như thế nào, một số thuật toán cần dùng để xử lý, định dạng bức ảnh theo ý muốn của mình. Và bây giờ chúng ta tiếp tục bứơc qua bài viết hướng dẩn về cách sử lý 1 video như thế nào nhé.

1.Mục tiêu.

  • Tìm hiểu để đọc video, hiển thị video và lưu video như thế nào.
  • Học cách lấy 1 bức ảnh từ video và hiển thị nó.
  • Giới thiệu 1 số chức năng từ các hàm cv2.VideoCapture(), cv2.VideoWriter()

2. Ví dụ .

Thông thường, chúng ta phải nắm bắt luồng trực tiếp bằng máy ảnh. OpenCV cung cấp một giao diện rất đơn giản cho việc này. Chúng ta hãy chụp một đoạn video từ máy ảnh (tôi đang sử dụng webcam được xây dựng trong máy tính xách tay của tôi), chuyển nó sang video màu xám và hiển thị nó. Chỉ cần một công việc đơn giản để bắt đầu.

Quan sát ví dụ.

Bây giờ chúng ta sẽ tìm hiểu rỏ về đoạn code dưới đây nhé.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Chốt một số khái niệm.

Đầu tiên, điều kiện cần và đủ là 2 thư viện

import numpy as np
import cv2

Tiếp theo.

cap = cv2.VideoCapture(0)

Để chụp một video, bạn cần tạo một đối tượng VideoCapture. Đối số của nó có thể là chỉ mục thiết bị hoặc tên của một tệp video. Chỉ mục thiết bị chỉ là số để chỉ định máy ảnh nào. Thông thường một máy ảnh sẽ được kết nối (như trong trường hợp của tôi). Vì vậy, tôi chỉ đơn giản là chọn giá trị 0 (hoặc -1). Bạn có thể chọn máy ảnh thứ hai bằng cách chọn số 1 . Sau đó, bạn có thể chụp khung từng khung. Nhưng cuối cùng, đừng quên show video chụp được.

ret, frame = cap.read()

Cap.read () trả về một giá trị bool (Đúng / Sai). Nếu khung được đọc đúng, nó sẽ là True. Vì vậy, bạn có thể kiểm tra kết thúc video bằng cách kiểm tra giá trị trả lại này.

Đôi khi, cap có thể không khởi tạo việc chụp. Trong trường hợp đó, mã này hiển thị lỗi. Bạn có thể kiểm tra xem nó được khởi tạo hay không bằng phương thức cap.isOpened (). Nếu nó là Đúng, OK. Nếu không mở nó bằng cap.open ().

Bạn cũng có thể truy cập vào một số tính năng của video này bằng cách sử dụng phương pháp cap.get (propId) với propId là một số từ 0 đến 18. Mỗi số biểu thị một thuộc tính của video (nếu có thể áp dụng cho video đó) và đầy đủ các chi tiết có thể Được hiển thị ở đây: Bộ định danh thuộc tính. Một số giá trị này có thể được sửa đổi bằng cap.set (propId, value). Giá trị là giá trị mới bạn muốn.

Ví dụ, tôi có thể kiểm tra độ rộng và chiều cao của khung bằng cap.get (3) và cap.get (4). Nó mang lại cho tôi 1 khung hình 640x480 theo mặc định. Nhưng tôi muốn sửa đổi nó thành 320x240. Chỉ cần sử dụng ret = cap.set (3,320) và ret = cap.set (4,240).

Tiếp theo.

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Tạo một khung màu cho video khi được hiển thị .

Ở đây, chúng ta định nghĩa một biến mới, màu xám, như là khung, chuyển thành màu xám. Chú ý điều này nói BGR2GRAY. Điều quan trọng cần lưu ý là OpenCV đọc màu như BGR (Blue Green Red), nơi mà hầu hết các ứng dụng máy tính được đọc là RGB (Red Green Blue). Nhớ lấy điều này.

cv2.imshow('frame',gray)

Lưu ý rằng, dù là một luồng video, chúng tôi vẫn sử dụng imshow. Ở đây, chúng tôi đang hiển thị nguồn cấp dữ liệu chuyển đổi sang màu xám. Nếu bạn muốn hiển thị cả hai cùng một lúc, bạn có thể làm imshow cho khung gốc, và imshow cho màu xám và hai cửa sổ sẽ xuất hiện.

if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Câu lệnh này chỉ chạy một lần mỗi khung. Về cơ bản, nếu chúng ta lấy key, và key đó là q, chúng ta sẽ thoát khỏi vòng lặp while với một break, sau đó chạy :

cap.release()
cv2.destroyAllWindows()

Thao tác này sẽ giải phóng webcam, sau đó đóng tất cả cửa sổ imshow ().

Quan sát ví dụ.

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Một số khái niệm.

Giống như chụp từ máy ảnh, chỉ cần thay đổi chỉ số máy ảnh với tên tệp video. Ngoài ra trong khi hiển thị khung, sử dụng thời gian thích hợp cho cv2.waitKey (). Nếu quá ít, video sẽ rất nhanh và nếu quá cao, video sẽ chậm (Vâng, đó là cách bạn có thể hiển thị video khi chuyển động chậm). 25 mili giây sẽ ổn trong các trường hợp bình thường.

Để lưu một video, tôi sẽ xử lý từng khung ảnh nếu tôi muốn lưu video đó. Đối với hình ảnh, nó rất đơn giản, chỉ cần sử dụng cv2.imwrite (). Đây là một công việc cần thiết.

Lần này chúng ta tạo một đối tượng VideoWriter. Chúng ta nên xác định tên tập tin đầu ra (ví dụ: output.avi). Sau đó chúng ta nên chỉ định mã FourCC (chi tiết trong đoạn tiếp theo). Sau đó, số khung hình mỗi giây (fps) và kích thước khung phải được truyền. Và cuối cùng là một cờ Coror. Nếu nó là True, encoder mong đợi khung màu, nếu không nó làm việc với khung grayscale.

FourCC là một mã 4-byte được sử dụng để chỉ định codec video. Danh sách các mã khả dụng có thể tìm thấy tại fourcc.org. Đó là nền tảng phụ thuộc. Sau codec hoạt động tốt cho tôi.

  • Trong Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID là thích hợp hơn.MJPG kết quả trong video kích thước cao.X264 cho video kích thước rất nhỏ)
  • Trong Windows: DIVX (Thêm nữa sẽ được thử nghiệm và bổ sung)
  • Trong OSX: (Tôi không có quyền truy cập vào OSX.Có thể một số một điền này?)

Mã FourCC được truyền như cv2.VideoWriter_fourcc ('M', 'J', 'P', 'G') hoặc cv2.VideoWriter_fourcc (* 'MJPG) cho MJPG. Dưới đây là đoạn code cụ thể về quá trình lưu 1 video như thế nào.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

http://docs.opencv.org/ https://techmaster.vn/ https://pythonprogramming.net/

0