私は車のカスケードを使ってサンプルビデオのすべての車を検出しています。プログラムは現在、検出したそれぞれの車の周りに長方形を描画しています。しかし、長方形はフレームごとにサイズが変化し続ける。次のフレームの新しい矩形が前の矩形と重なっている場合は、元の矩形を維持して安定化を追加したいと思います。これを実装するには、前のフレームを保存して(前のフレームから車を検出する)、前のフレームの矩形と現在のフレームを比較しています。ビデオから前のフレームを取得するOpenCv Haar Cascade
Mat frame;
Mat prevFrame;
while (capture.isOpened()) {
capture.read(frame);
vector<Rect> cars; // center of rectangles where each rectangle contains the detected object
vector<Rect> prevCars; // to store previous tracked rectangles
// Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.
car_cascade.detectMultiScale(frame, cars, 1.1, 2);
if(!prevFrame.empty()) {
car_cascade.detectMultiScale(prevFrame, prevCars, 1.1, 2);
} else {
cout << "EMPTY" << endl; // for testing
}
cout << "current : " << cars.size() << endl; // print out number of cars
cout << "previous: " << prevCars.size() << endl; // print out number of cars
// more code goes here which I haven't written here
frame.copyTo(prevFrame); // set previous frame to current frame
imshow("Video", frame);
char key = waitKey(33);
if (key == 'q')
{
break;
}
}
しかし、前のフレームから検出された車の数は、以前の現在のものと同じではありません。例えば、
EMPTY 電流:3 前:0 <から0が空であるため 電流:3 前:2 < - 以前は2であるが、以前の電流は3 現在だったので3であるべきである:3追跡および更新車のRectをするために2
なぜ車とprevCarsの両方にベクトルが必要ですか?1つはほとんどOKです..... –
forループを使用してすべての車を繰り返し保存するため2つあります車に乗って、prevCarsの車と比較して、両方の長方形が境界になっているかどうかを確認してください。 –