针对不能运行FeatureTracker : OpenCV has benn compiled without SIFT support
因为SIFT和SURF是nonfree模块下的类,所以在调用该模块下的函数之前需要调用: initModule_nonfree();函数
我运行在2.4.7上能够正常运行
根据sample代码修改:
#include <stdio.h> #include <time.h> #include <iostream> #include "opencv2/highgui/highgui.hpp" #include "opencv2/contrib/hybridtracker.hpp" #include <opencv2\nonfree\nonfree.hpp> #ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS #endif using namespace cv; using namespace std; Mat frame, image; Rect selection; Point origin; bool selectObject = false; int trackObject = 0; int live = 1; static void drawRectangle(Mat* img, Rect win) { rectangle(*img, Point(win.x, win.y), Point(win.x + win.width, win.y + win.height), Scalar(0, 255, 0), 2, CV_AA); } static void onMouse(int event, int x, int y, int, void*) { if (selectObject) { selection.x = MIN(x, origin.x); selection.y = MIN(y, origin.y); selection.width = std::abs(x - origin.x); selection.height = std::abs(y - origin.y); selection &= Rect(0, 0, image.cols, image.rows); } switch (event) { case CV_EVENT_LBUTTONDOWN: origin = Point(x, y); selection = Rect(x, y, 0, 0); selectObject = true; break; case CV_EVENT_LBUTTONUP: selectObject = false; trackObject = -1; break; } } static void help() { printf("Usage: ./hytrack live or ./hytrack <test_file> \n\ For Live View or Benchmarking. Read documentation is source code.\n\n"); } int main(int argc, char** argv) { VideoCapture cap; char test_file[20] = ""; cap.open("out1.avi"); if (!cap.isOpened()) { cout << "Failed to open camera" << endl; return 0; } cout << "Opened " << endl; cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); cap >> frame; initModule_nonfree(); HybridTrackerParams params; // motion model params //params.motion_model = CvMotionModel::LOW_PASS_FILTER; params.motion_model = CvMotionModel::LOW_PASS_FILTER; params.low_pass_gain = 0.1f; // mean shift params params.ms_tracker_weight = 0.8f; //params.ms_params.tracking_type = CvMeanShiftTrackerParams::HS; params.ms_params.tracking_type = CvFeatureTrackerParams::SIFT; // feature tracking params params.ft_tracker_weight = 0.2f; params.ft_params.feature_type = CvFeatureTrackerParams::SIFT; params.ft_params.window_size = 0; HybridTracker tracker(params); char img_file[20] = "seqG/0001.png"; char img_file_num[10]; namedWindow("Win", 1); setMouseCallback("Win", onMouse, 0); int i = 0; float w[4]; for(;;) { i++; if (live) { cap >> frame; if( frame.empty() ) break; frame.copyTo(image); } sprintf(img_file_num, "Frame: %d", i); putText(image, img_file_num, Point(10, image.rows-20), FONT_HERSHEY_PLAIN, 0.75, Scalar(255, 255, 255)); if (!image.empty()) { if (trackObject < 0) { tracker.newTracker(image, selection); trackObject = 1; } if (trackObject) { tracker.updateTracker(image); drawRectangle(&image, tracker.getTrackingWindow()); } if (selectObject && selection.width > 0 && selection.height > 0) { Mat roi(image, selection); bitwise_not(roi, roi); } imshow("Win", image); waitKey(20); } else i = 0; } return 0; }