2012-06-19 57 views
5

Tôi đang sử dụng chức năng Kim tự tháp Lukas Kanade của OpenCV để ước tính lưu lượng quang học. tôi gọi số cvGoodFeaturesToTrack và sau đó cvCalcOpticalFlowPyrLK. Đây là mã của tôi:Luồng quang học sử dụng opencv

while(1) 
{ 
... 

cvGoodFeaturesToTrack(frameAth,eig_image,tmp_image,cornersA,&corner_count,0.01,5,NULL,3,0.4); 

std::cout<<"CORNER COUNT AFTER GOOD FEATURES2TRACK CALL = "<<corner_count<<std::endl; 

cvCalcOpticalFlowPyrLK(frameAth,frameBth,pyrA,pyrB,cornersA,cornersB,corner_count,cvSize(win_size,win_size),5,features_found,features_errors,cvTermCriteria(CV_TERMCRIT_ITER| CV_TERMCRIT_EPS,20,0.3),CV_LKFLOW_PYR_A_READY|CV_LKFLOW_PYR_B_READY); 

cvCopy(frameBth,frameAth,0); 
... 
} 

frameAth là khung màu xám trước và frameBth là khung màu xám hiện tại từ một webcam. Nhưng khi tôi đầu ra số lượng các tính năng tốt để theo dõi trong mỗi khung số giảm sau khi tổng thời gian và tiếp tục giảm. nhưng nếu tôi chấm dứt chương trình và thực thi lại mã (không làm ảnh hưởng đến lĩnh vực xem webcam) thì số điểm được hiển thị là các tính năng tốt để theo dõi ... làm thế nào có thể cho cùng một trường xem và cho cùng một cảnh chức năng cung cấp cho sự khác biệt về số điểm ... và sự khác biệt là cao ... một số điểm như các tính năng tốt để theo dõi sau 4 phút thực hiện là 20 hoặc 50 ... nhưng khi cùng một chương trình chấm dứt và thực hiện một lần nữa số lượng là 500 đến 700 khởi đầu nhưng một lần nữa từ từ giảm .. tôi đang sử dụng opencv trong 4 tháng qua vì vậy tôi đang lil mới để openCV..please hướng dẫn tôi hoặc cho tôi biết nơi tôi có thể tìm thấy một giải pháp ... rất nhiều thanx trước ..

Trả lời

1

Bạn đang gọi số cvGoodFeatureToTrack và chuyển qua số corner_count bằng cách tham chiếu. Giá trị của nó giảm nếu ít tính năng được tìm thấy. Bạn phải đặt lại giá trị của corner_count thành giá trị ban đầu trước khi gọi số cvGoodFeaturesToTrack trong mỗi vòng lặp lặp lại trong khi.

+0

@ sgar91 ... thanx ... tôi đã cải thiện hiệu suất theo đề xuất của bạn –

+0

tôi đã gặp phải sự cố tương tự cách đây một thời gian. – sgarizvi

+0

@rotating_image Tôi không hiểu tại sao câu trả lời này được chọn là được chấp nhận. Khi bạn đặt lại số lượng đối tượng địa lý, điều này không có ý nghĩa gì khi gọi 'cvCalcOpticalFlowPyrLK'. Nó sẽ cho bạn kết quả tương tự khi bạn không gọi nó ... Đọc tài liệu trước. – ArtemStorozhuk

6

Bạn phải gọi cvGoodFeaturesToTrack một lần (ở đầu, trước vòng lặp) để phát hiện các tính năng tốt để theo dõi và theo dõi các tính năng này bằng cách sử dụng cvCalcOpticalFlowPyrLK. Hãy xem ví dụ opencv mặc định: OpenCV/samples/cpp/lkdemo.cpp.

+0

@Astor ... thanx Astor cho phản hồi nhanh ... quá trình bạn nói hoạt động tốt để theo dõi một đối tượng chuyển động trong trường xem ... tuy nhiên tôi đang sử dụng luồng quang để ước tính chuyển động của máy ảnh..so khi máy ảnh đang di chuyển tầm nhìn của nó đang thay đổi ... chi tiết cảnh cũng thay đổi chậm ... vì vậy nếu tôi gọi goodfeaturestotrack một lần thì khi cảnh đang thay đổi chậm tôi không nhận được điểm mới coz điểm ban đầu có thể không có mặt trong khung hình mới ... –

+0

@ user1466741 Để phát hiện chuyển động của máy ảnh, bạn có thể sử dụng tính năng dò tìm chuyển động bằng cách sử dụng [phép trừ khung] (http://www.youtube.com/watch?v=KREoXEy9ojY). Thuật toán này rất dễ dàng - bạn phải trừ hai khung nhất quán, làm ngưỡng và kiểm tra xem khu vực chuyển động (pixel trắng trên video) có lớn không (80% diện tích đầy đủ hoặc thứ gì đó) thì camera đang chuyển động. Tuy nhiên thuật toán này là xấu khi illumanion đang thay đổi (bật đèn bật/tắt) hoặc khi ai đó (hoặc thứ gì đó) đang di chuyển rất gần camera. – ArtemStorozhuk

+0

@Astor ... thanx cho ý tưởng nhưng với lưu lượng quang học tôi có thể nhận được hướng và độ lớn của chuyển động dễ dàng ... sẽ gọi hàm goodfeaturestotrack định kỳ (sau số lượng khung nhất định hoặc khi số lượng điểm tốt2bắt xuống) giải i có nghĩa là nếu tôi tiếp tục làm mới các điểm để theo dõi ... –

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