2009-12-10 39 views
7

Sự cố: Tôi đang cố gắng căn chỉnh hai khung hình của một video chuyển động.Làm thế nào để trích xuất vectơ tốc độ từ dòng quang dày đặc?

Tôi hiện đang cố gắng sử dụng hàm "cvCalcOpticalFlowLK" và kết quả là các vectơ vận tốc của x và y dưới dạng "CvArr".

Vì vậy, tôi nhận được kết quả, nhưng tôi không chắc chắn cách sử dụng các mảng vectơ này.

Câu hỏi của tôi là ... làm sao tôi biết vận tốc của mỗi pixel là bao nhiêu? Nó chỉ là giá trị của mỗi giá trị pixel tại điểm cụ thể đó?

Lưu ý: Tôi đã sử dụng các chức năng dòng quang khác như cvCalcOpticalFlowPyrLK() vì nó dễ dàng hơn nhiều, nhưng tôi muốn có dòng quang dày đặc.

+0

Vì vậy, tôi đã chơi xung quanh với hình ảnh kết quả và tôi sẽ giả định rằng mỗi giá trị pixel đại diện cho vận tốc của mỗi pixel, nhưng trong đơn vị nào được đo chính xác? Có ai biết các giá trị vận tốc này tương ứng với tốc độ của điểm ảnh đó không? Có phải pixel trên mỗi khung hình không? Hay cái gì khác? Giá trị của mỗi pixel nằm trong Điểm nổi 32 bit. – monky822

Trả lời

4

Dường như giả định ban đầu của tôi là đúng sự thật. Các đầu ra "velx" và "vely" từ hàm lưu lượng quang là vận tốc thực tế cho mỗi giá trị pixel. Để trích xuất chúng tốt nhất, tôi đã truy cập pixel từ dữ liệu thô và kéo giá trị. Có 2 cách để làm điều này.

cvGet2D() - cách này sẽ chậm hơn nhưng nếu bạn chỉ cần truy cập 1 pixel thì không sao.

hoặc

(uchar *) (image-> imageData + height * image-> widthStep + width);

(hình ảnh là một IplImage, chiều rộng và chiều cao chỉ là độ rộng tương ứng và chiều cao của hình ảnh)

0

velx và vely là dòng quang không phải là vận tốc thực tế. Phương pháp bạn sử dụng đã lỗi thời. Sử dụng calcOpticalFlowFarneback()

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