2010-08-07 49 views
32

Tôi có nguồn cấp dữ liệu video được chụp bằng camera di chuyển và chứa các đối tượng chuyển động. Tôi muốn ổn định video, để tất cả các đối tượng tĩnh sẽ vẫn tĩnh trong nguồn cấp dữ liệu video. Làm cách nào tôi có thể thực hiện việc này với OpenCV?Ổn định video với OpenCV

Ví dụ: nếu tôi có hai hình ảnh prev_frame và next_frame, làm cách nào để chuyển đổi next_frame sao cho máy quay video có vẻ tĩnh?

Trả lời

32

Tôi có thể đề nghị một trong những giải pháp sau:

  1. Sử dụng các tính năng cao cấp địa phương: OpenCV bao gồm SURF, vì vậy: cho mỗi khung hình, trích xuất các tính năng SURF. Sau đó, xây dựng tính năng Kd-Tree (cũng trong OpenCV), sau đó kết hợp hai khung hình liên tiếp để tìm cặp các tính năng tương ứng. Cho các cặp đó vào cvFindHomography để tính toán homography giữa các frame đó. Warp khung theo (kết hợp ..) homographies để ổn định. Đây là, theo hiểu biết của tôi, một cách tiếp cận rất mạnh mẽ và tinh vi, tuy nhiên việc khai thác và kết hợp SURF có thể khá chậm
  2. Bạn có thể thử thực hiện ở trên với các tính năng "kém bền hơn", nếu bạn chỉ mong đợi chuyển động nhỏ giữa hai khung hình, ví dụ sử dụng phát hiện góc Harris và xây dựng các cặp góc gần nhau nhất trong cả hai khung hình, nạp vào cvFindHomography như sau. Có lẽ nhanh hơn nhưng kém bền hơn.
  3. Nếu bạn di chuyển đối tượng dịch, bạn có thể có thể thay thế cvFindHomography với một cái gì đó nhiều hơn ... đơn giản, chỉ cần có bản dịch là giữa tính năng cặp (ví dụ trung bình)
  4. Sử dụng pha tương quan (ref. http://en.wikipedia.org/wiki/Phase_correlation) , nếu bạn chỉ mong đợi bản dịch giữa hai khung hình. OpenCV bao gồm DFT/FFT và IFFT, xem bài viết wikipedia được liên kết về công thức và giải thích.

EDIT Ba nhận xét tôi nên đề cập một cách rõ ràng hơn, chỉ trong trường hợp: Cách tiếp cận dựa

  1. Các homography có khả năng rất chính xác, đối tượng để cố định sẽ vẫn đứng yên. Tuy nhiên, các tính năng đồng hồ bao gồm méo mó phối cảnh và thu phóng cũng vì vậy kết quả có thể trông hơi ... hiếm gặp (hoặc thậm chí bị bóp méo đối với một số chuyển động nhanh). Mặc dù chính xác, điều này có thể ít trực quan hơn; vì vậy hãy sử dụng điều này thay vì xử lý thêm hoặc, như, pháp y. Nhưng bạn nên thử nó, có thể là siêu dễ chịu cho một số cảnh/phong trào là tốt.
  2. Theo hiểu biết của tôi, ít nhất một số công cụ ổn định video miễn phí sử dụng tương quan pha.Nếu bạn chỉ muốn "bỏ rung" máy ảnh, điều này có thể thích hợp hơn.
  3. Có một số nghiên cứu đang diễn ra trong lĩnh vực này. Bạn sẽ tìm thấy một số phương pháp tiếp cận phức tạp hơn trong một số giấy tờ (mặc dù chúng có thể đòi hỏi nhiều hơn là chỉ OpenCV).
+0

Great câu trả lời! Một danh sách tốt đẹp. Tôi không biết về sự tương quan pha. Cảm ơn ! –

3

Đây là một vấn đề phức tạp, nhưng tôi có thể đề xuất một tình huống hơi đơn giản trên đỉnh đầu của tôi.

  1. phím Shift/xoay next_frame bởi một số lượng tùy ý
  2. Sử dụng nền trừ threshold(abs(prev_frame-next_frame_rotated)) để tìm các yếu tố tĩnh. Bạn sẽ phải chơi xung quanh với giá trị ngưỡng nào để sử dụng.
  3. Tìm min(template_match(prev_frame_background, next_frame_rotated_background))
  4. Ghi ca/​​vòng quay của trận đấu gần nhất và áp dụng nó vào next_frame

này sẽ không làm việc tốt cho nhiều khung thời gian, vì vậy bạn sẽ muốn xem xét sử dụng một background accumulator để nền thuật toán tìm kiếm tương tự theo thời gian.

2

Tôi nên thêm các nhận xét sau để hoàn thành zerm's answer. Nó sẽ đơn giản hóa vấn đề của bạn nếu một đối tượng tĩnh được chọn và sau đó làm việc với phương pháp tiếp cận của zerm (1) với đối tượng duy nhất đó. Nếu bạn tìm thấy một đối tượng tĩnh và áp dụng hiệu chỉnh cho nó, tôi nghĩ sẽ an toàn khi cho rằng các vật thể tĩnh khác cũng sẽ ổn định.

Mặc dù nó chắc chắn là hợp lệ cho vấn đề khó khăn của bạn, bạn sẽ có những vấn đề sau đây với phương pháp này:

  • Phát hiện và ước tính homography đôi khi sẽ thất bại vì nhiều lý do: occlusions, di chuyển đột ngột, chuyển động mờ, sự khác biệt ánh sáng nghiêm trọng. Bạn sẽ phải tìm cách để xử lý nó.

  • Đối tượng mục tiêu của bạn (s) có thể có sự che khuất, có nghĩa là phát hiện của nó sẽ thất bại trên khung đó và bạn sẽ phải xử lý các vùi mà chính nó là một chủ đề nghiên cứu toàn bộ.

  • Tùy thuộc vào phần cứng và độ phức tạp của giải pháp, bạn có thể gặp một số khó khăn khi đạt được kết quả thời gian thực bằng SURF. Bạn có thể thử triển khai gpu của opencv hoặc các tính năng dò tìm nhanh khác như ORB, BRIEF hoặc FREAK.

14

OpenCV có hàm calculateRigidTransform() và warpAffine() xử lý loại sự cố này thực sự tốt.

của nó khá nhiều càng đơn giản như thế này:

Mat M = estimateRigidTransform(frame1,frame2,0) 
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 

Bây giờ output chứa nội dung của frame2 đó là tốt nhất phù hợp để phù hợp với frame1. Đối với những thay đổi lớn, M sẽ là một ma trận zero hoặc nó có thể không phải là một ma trận ở tất cả, tùy thuộc vào phiên bản OpenCV, vì vậy bạn sẽ phải lọc và không áp dụng chúng. Tôi không chắc nó lớn thế nào; có lẽ một nửa chiều rộng khung hình, có thể nhiều hơn nữa.

Tham số thứ ba để ước lượngRigidTransform là một boolean cho biết liệu có áp dụng ma trận affine tùy ý hay hạn chế nó để dịch/xoay/chia tỷ lệ hay không. Với mục đích ổn định hình ảnh từ máy ảnh, bạn có thể chỉ muốn hình ảnh sau. Trong thực tế, để ổn định hình ảnh máy ảnh, bạn cũng có thể muốn loại bỏ bất kỳ tỷ lệ nào từ ma trận được trả về bằng cách chuẩn hóa nó để chỉ xoay và dịch.

Ngoài ra, đối với máy ảnh chuyển động, bạn có thể muốn lấy mẫu M theo thời gian và tính giá trị trung bình.

Dưới đây là liên kết để biết thêm về estimateRigidTransform(), và warpAffine()

+0

Thư viện nào là phương pháp 'Kích thước' trong? – user3731622

2

Đây đã là câu trả lời tốt, nhưng nó sử dụng một chút thuật toán cũ chút và tôi đã phát triển chương trình để giải quyết vấn đề tương tự vì vậy tôi thêm câu trả lời bổ sung.

  1. Lúc đầu, bạn nên trích xuất tính năng từ hình ảnh bằng trình trích xuất tính năng như thuật toán SIFT, SURF. Trong trường hợp của tôi, thuật toán FAST + ORB là tốt nhất. Nếu bạn muốn biết thêm thông tin, See this paper
  2. Sau khi bạn nhận được các tính năng trong hình ảnh, bạn nên tìm các đối tượng địa lý phù hợp với hình ảnh. Có nhiều đối sánh nhưng đối sánh Bruteforce không phải là xấu. Nếu Bruteforce chậm trong hệ thống của bạn, bạn nên sử dụng một thuật toán như KD-Tree.
  3. Cuối cùng, bạn sẽ nhận được ma trận chuyển đổi hình học để giảm thiểu lỗi của các điểm được chuyển đổi. Bạn có thể sử dụng thuật toán RANSAC trong quá trình này. Bạn có thể phát triển tất cả quy trình này bằng cách sử dụng OpenCV và tôi đã phát triển nó trong các thiết bị di động. See this repository
3

Tôi đã trả lời câu trả lời từ câu trả lời này. How to stabilize Webcam video?


Hôm qua tôi chỉ làm một số công trình (trong Python) về chủ đề này, các bước chính là:

  1. sử dụng cv2.goodFeaturesToTrack để tìm góc tốt.
  2. sử dụng cv2.calcOpticalFlowPyrLK để theo dõi các góc.
  3. sử dụng cv2.findHomography để tính ma trận homography.
  4. sử dụng cv2.warpPerspective để chuyển đổi khung video.

Nhưng kết quả không phải là lý tưởng bây giờ, có thể tôi nên chọn SIFT keypoints ngoài goodFeatures.


Nguồn:

enter image description here

Ổn định xe:

enter image description here

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