Я только что отважился на компьютерное зрение и попытался демистифицировать различные тонкости этого. Я пытаюсь увеличить фильтр калмана с помощью функции обнаружения прибоя. Но я не понимаю, как вызвать и использовать метод kalman после того, как гомография и ограниченный прямоугольник были построены на обнаруженном кадре с использованием функций серфинга. Я обнаружил функции и извлек ключевые точки с помощью эталонного изображения после сравнения с входящими кадрами. Затем я использовал совпадение фланов.OpenCV: обнаружение и отслеживание объектов на основе обнаружения объектов
Теперь, возможно использовать фильтр kalman, так как я хочу отслеживать движение и получать предсказанное движение. Я много искал, но не нашел, что функции серфинга можно использовать с фильтром kalman. Все, что я получаю, - это предложения по использованию cvBlobs для отслеживания. Но, теоретически, фильтры кальмана используются для отслеживания. Тем не менее, я запутался, так как несколько реализаций отслеживания на основе видео с использованием серфинга показывают, что серфинг может использоваться для отслеживания сам по себе. Но мой вопрос
Если фильтр Калмана не может быть использован с прибой, то как я могу реализовать моменты, чтобы получить измеренные значения координат, как мне нужна информация для предсказания движения.
можно использовать серфинг с фильтром kalman для отслеживания, и если да, то как реализовать его после обнаружения и ограничения объекта с помощью прямоугольника, используя следующий код.
Пример: объект для отслеживания . Некоторые кадры
/* Объект обнаружения и распознавания из видео */
INT Основной() { Мат объект = imread ("book1.png", CV_LOAD_IMAGE_GRAYSCALE);
if(!object.data) { std::cout<< "Error reading object " << std::endl; return -1; } //Detect the keypoints using SURF Detector int minHessian = 500; SurfFeatureDetector detector(minHessian); std::vector<KeyPoint> kp_object; detector.detect(object, kp_object); //Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat des_object; extractor.compute(object, kp_object, des_object); FlannBasedMatcher matcher; namedWindow("Good Matches"); namedWindow("Tracking"); std::vector<Point2f> obj_corners(4); //Get the corners from the object obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint(object.cols, 0); obj_corners[2] = cvPoint(object.cols, object.rows); obj_corners[3] = cvPoint(0, object.rows); char key = 'a'; int framecount = 0; VideoCapture cap("booksvideo.avi"); for(; ;) { Mat frame; cap >> frame; imshow("Good Matches", frame); Mat des_image, img_matches; std::vector<KeyPoint> kp_image; std::vector<vector<DMatch > > matches; std::vector<DMatch > good_matches; std::vector<Point2f> obj; std::vector<Point2f> scene; std::vector<Point2f> scene_corners(4); Mat H; Mat image; //cvtColor(frame, image, CV_RGB2GRAY); detector.detect(image, kp_image); extractor.compute(image, kp_image, des_image); matcher.knnMatch(des_object, des_image, matches, 2); //THIS LOOP IS SENSITIVE TO SEGFAULTS for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) { if((matches[i][0].distance < 0.6*(matches[i][4].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) { good_matches.push_back(matches[i][0]); } } //Draw only "good" matches drawMatches(object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); if (good_matches.size() >= 4) { for(int i = 0; i < good_matches.size(); i++) { //Get the keypoints from the good matches obj.push_back(kp_object[ good_matches[i].queryIdx ].pt); scene.push_back(kp_image[ good_matches[i].trainIdx ].pt); } H = findHomography(obj, scene, CV_RANSAC); perspectiveTransform(obj_corners, scene_corners, H); //Draw lines between the corners (the mapped object in the scene image) line(img_matches, scene_corners[0] + Point2f(object.cols, 0), scene_corners[1] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); line(img_matches, scene_corners[1] + Point2f(object.cols, 0), scene_corners[2] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); line(img_matches, scene_corners[2] + Point2f(object.cols, 0), scene_corners[3] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); line(img_matches, scene_corners[3] + Point2f(object.cols, 0), scene_corners[0] + Point2f(object.cols, 0), Scalar(0, 255, 0), 4); } //Show detected matches imshow("Good Matches", img_matches); for(int i = 0; i < good_matches.size(); i++) { printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx); } waitKey(0);
}
возврат 0;
}
Хорошо, так как я могу использовать camshift с прибоем? Я нашел этот код http://opencv-srf.blogspot.ca/2010/09/object-detection-using-color-seperation.html, который использует значения цвета. Тем не менее, серфинг здесь работает на изображениях с серой шкалой. Так что, даже если я использую серовую шкалу, то как мне реализовать camshift после обнаружения объекта ограниченных прямоугольников с помощью surf. Я буду очень признателен, если вы можете поместить фрагмент кода, так как я не знаю, как вычислить центроид и работать с camshift и surf. –
Я также нашел аналогичный вопрос http://stackoverflow.com/questions/9701276/opencv-tracking-using-optical-flow/9702540#comment13031247_9702540, но, я думаю, он не использует серфинг. Итак, я подумал, можно ли объединить серфинг с https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/motempl.c?rev=1429, но тогда это находится в C ! Если я сменил изображения серфинга с Mat на IplImage, то что должно идти в вызове функции update_mhi (IplImage * img, IplImage * dst, int diff_threshold) и где я должен вызывать update_mhi() в модуле серфинга. Пожалуйста помоги. –
Основная цель заключается в том, что мне нужно найти координаты обнаруженного объекта, который, как я думаю, может быть сделан с помощью моментов. Я не знаю, как увеличить момент с обнаружением функции поиска, чтобы можно было предсказать предсказанное движение. –