2015-06-12 60 views
6

Tôi mới làm quen với Qt, tôi chỉ biết những điều cơ bản: tạo giao diện và kết nối các vùng. Trong một vài từ, kiến ​​thức của tôi không sâu sắc chút nào.Làm thế nào để lấy khung hình video trong Qt?

Tôi cần mở tệp video và chụp tất cả các khung hình để nhận các kênh R, G, B và sau đó xử lý luồng quang (điều này đã được thực hiện) thành khung để cuối cùng biểu thị nó trên cửa sổ .

Có thể tải khung hình video bằng Qt không? Tôi đã nghiên cứu rất nhiều nhưng không tìm thấy bất cứ điều gì kết luận.

+0

Bạn đã kiểm tra tài liệu chưa? http://doc.qt.io/qt-5/videooverview.html –

+0

[link] này (http://stackoverflow.com/questions/38468644/getting-video-frame-in-provided-time-qt/38484477 # 38484477) có thể giúp bạn chụp khung hình từ một tập tin video. – Jeet

Trả lời

1

Tôi không biết tại sao tôi không thể bao gồm các tiêu đề Qt cần thiết để xử lý khung hình (họ dường như luôn luôn có phụ thuộc chưa được giải quyết và một số không tồn tại) vì vậy tôi quay sang OpenCV 3.0 và đã làm nó theo cách này:

cv::VideoCapture cap(videoFileName); 

if(!cap.isOpened()) // check if we succeeded 
    return; 

while (cap.isOpened()) 
{ 
    cv::Mat frame; 
    cap >> frame; 
    cv::flip(frame, frame, -1); 
    cv::flip(frame, frame, 1); 

    // get RGB channels 
    w = frame.cols; 
    h = frame.rows; 
    int size   = w * h * sizeof(unsigned char); 
    unsigned char * r = (unsigned char*) malloc(size); 
    unsigned char * g = (unsigned char*) malloc(size); 
    unsigned char * b = (unsigned char*) malloc(size); 

    for(int y = 0; y < h;y++) 
    { 
     for(int x = 0; x < w; x++) 
     { 
      // get pixel 
      cv::Vec3b color = frame.at<cv::Vec3b>(cv::Point(x,y)); 
      r[y * w + x] = color[2]; 
      g[y * w + x] = color[1]; 
      b[y * w + x] = color[0]; 
     } 
    } 
} 

cap.release(); 

Nó đã hoạt động hoàn hảo vì mục đích của tôi nên tôi không tiếp tục nghiên cứu.

Cảm ơn mọi người.

6

Bạn có thể sử dụng QMediaPlayer để đạt được điều này.

  1. Khởi tạo QMediaPlayer.
  2. Phân lớp QAbstractVideoSurface.
  3. Đặt cài đặt của bạn làm đầu ra cho trình phát đa phương tiện qua QMediaPlayer::setVideoOutput.
  4. Nạp trình phát phương tiện vào tệp cần thiết và cuối cùng nó sẽ bắt đầu gọi QAbstractVideoSurface::present(const QVideoFrame & frame) khi bạn triển khai QAbstractVideoSurface nếu video được tải thành công. Sau đó, bạn có thể truy cập các kênh và mọi thứ từ QVideoFrame và vẽ khung trên tiện ích con.
+0

Tôi không thể tìm thấy QMediaPlayer ở bất cứ đâu. Tôi đã cài đặt Qt qua qt-unified-mac-x64-2.0.1-online.dmg nhưng tôi không có gói di động – Leo

+0

@Leo Nó không nên nằm trong gói di động, chỉ cần thêm '#include < QMediaPlayer> 'vào nguồn của bạn và' QT + = multimedia' vào tệp '.pro' của bạn như được nêu trong http://doc.qt.io/qt-5/qmediaplayer.html. Ngoài ra tôi không quen thuộc với các phiên bản osx, nhưng 2.0.1 có vẻ lạ - mà phiên bản qt là nó? –

Các vấn đề liên quan