#include using namespace cv; int main() { VideoCapture cap("C:/Users/ThinkStation/Desktop/tracking/Test_2.mp4"); // video dosyasını aç if(!cap.isOpened()) { std::cerr << "Video açılamadı." << std::endl; return -1; } Mat prev_frame, curr_frame; cap >> prev_frame; // ilk çerçeveyi al // Optical flow için parametreleri ayarla std::vector prev_pts, curr_pts; std::vector status; std::vector err; TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS, 20, 0.03); Size winSize(31,31); double prev_time = 0, curr_time = 0; double speed = 0; while(cap.read(curr_frame)) { prev_time = curr_time; curr_time = cap.get(CAP_PROP_POS_MSEC) / 1000.0; // geçen süreyi al (saniye cinsinden) cvtColor(prev_frame, prev_frame, COLOR_BGR2GRAY); cvtColor(curr_frame, curr_frame, COLOR_BGR2GRAY); // Optical flow hesapla if(!prev_pts.empty()) { calcOpticalFlowPyrLK(prev_frame, curr_frame, prev_pts, curr_pts, status, err, winSize, 3, termcrit, 0, 0.001); double dx = 0, dy = 0; int count = 0; // Hız hesapla for(size_t i = 0; i < status.size(); i++) { if(status[i] == 1) { dx += curr_pts[i].x - prev_pts[i].x; dy += curr_pts[i].y - prev_pts[i].y; count++; } } if(count > 0) { dx /= count; dy /= count; // Hızı hesapla speed = sqrt(dx * dx + dy * dy) / (curr_time - prev_time); // piksel/saniye } } // Takip edilecek nesnenin bölgesini belirle Rect roi(100, 100, 50, 50); prev_pts.clear(); prev_pts.push_back(Point2f(roi.x + roi.width / 2, roi.y + roi.height / 2)); // Çerçeve üzerinde nesneyi göster rectangle(curr_frame, roi, Scalar(0, 0, 255), 2); circle(curr_frame, prev_pts[0], 2, Scalar(0, 255, 0), 2); // Sonuçları ekrana yazdır std::cout << "Hız: " << speed << " piksel/saniye" << std::endl; imshow("Video", curr_frame); if(waitKey(10) == 27) break; std::swap(prev_frame, curr_frame); std::swap(prev_pts, curr_pts); } return 0; }