Tôi có một thiết lập bằng Python, nơi tôi sử dụng thư viện OpenCV để đọc các khung của một video ở dạng mảng 2D - những video này là màu xám, vì vậy tôi sử dụng số nguyên 8 bit chưa được ký cho các giá trị pixel.Hiển thị mảng 2D từ OpenCV trong Matplotlib.pyplot.imshow()
Trong bước tiếp theo, tôi đang cố gắng sử dụng pyplot.imshow()
từ matplotlib để hiển thị khung của video. Thật không may, tôi nhận được một cái gì đó mà không có ý nghĩa gì cả.
Dưới đây là đoạn code để đọc video:
import numpy as np
import cv
def read_video(filename):
video = cv.CaptureFromFile('%s' % filename)
num_frames = int(cv.GetCaptureProperty(video, cv.CV_CAP_PROP_FRAME_COUNT))
frames = []
for i in range(0, num_frames):
frame = cv.QueryFrame(video)
if frame is None:
quit('Failed to extract frame %s of %s!' % (i, num_frames))
toadd = cv2numpy(frame, 'uint8')
frames.append(np.array(toadd))
return np.array(frames)
cv2numpy
là một chức năng hữu ích có thể chuyển đổi các mảng OpenCV để một mảng NumPy (chỉ cần một cuộc gọi đến fromstring
và sau đó một reshape
). Dưới đây là đoạn code tôi đang sử dụng để vẽ khung đầu tiên của video:
import matplotlib.pyplot as plot
import matplotlib.cm as cm
frames = read_video('video.avi')
plot.imshow(frames[0], cmap = cm.gray)
plot.show()
Trong một số mã khác, tôi đã sử dụng OpenCV SaveImage
trên một khung duy nhất để cung cấp một tài liệu tham khảo cho những gì tôi mong chờ từ imshow
. Here's the image I get from the former và here's the image I get from the code above.
Như bạn có thể thấy chúng cực kỳ khác nhau. Điều duy nhất tôi có thể thu thập từ hình ảnh thực tế là dải phân cách: có vẻ như nó bị sai kích thước, có nhiều pixel hơn chiều rộng hơn chiều cao (ảnh này được cho là 128 x 256). Nhưng tôi đã cố gắng chuyển mảng trước khi vẽ đồ thị, thay đổi các thông số extent
và aspect
và shape
theo imshow documentation và ngoại trừ một số điểm ảnh kỳ lạ mà tôi không tìm thấy bản sửa lỗi.
Mọi suy nghĩ?
EDIT 1: Tôi hình dung nó có thể là khôn ngoan để thêm mã cv2numpy
, trong trường hợp đó định hình lại được bằng cách nào đó muddling vật (kể từ khi tôi "chân lý" hình ảnh trên không sử dụng mã đó và vì thế cv2numpy
chỉ tham gia vào việc đường ống có vấn đề).
def cv2numpy(cvarr, the_type):
a = np.fromstring(
cvarr.tostring(),
dtype = the_type,
count = cvarr.width * cvarr.height)
a.shape = (cvarr.height, cvarr.width)
return a
Đây chính xác là vấn đề. OpenCV vẫn đọc các video như RGB, vì vậy tôi đã thêm vào trong 'cv.CreateImage' và' cv.CvtColor', in ra hình ảnh, và nó trông giống như những gì tôi mong đợi. Cám ơn rất nhiều! Dường như chuyển đổi các mảng OpenCV thành các mảng có nhiều mảng thông qua chuỗi là tối ưu. – Magsol