 e845184843
			
		
	
	e845184843
	
	
	
		
			
			* #1538 from StevenPuttemans:bugfix_3283 * #1545 from alalek:ocl_test_fix_rng * #1551 from alalek:cmake_install_win * #1570 from ilya-lavrenov:ipp_warn_fix * #1573 from alalek:perf_simple_strategy * #1574 from alalek:svm_workaround * #1576 from alalek:ocl_fix_cl_double * #1577 from ilya-lavrenov:ocl_setto_opencl12 * #1578 from asmorkalov:android_fd_cp_fix * #1579 from ilya-lavrenov:ocl_norm * #1582 from sperrholz:ocl-arithm-additions * #1586 from ilya-lavrenov:ocl_setto_win_fix * #1589 from ilya-lavrenov:pr1582_fix * #1591 from alalek:ocl_remove_cl_hpp_h * #1592 from alalek:ocl_program_cache_update * #1593 from ilya-lavrenov:ocl_war_on_double * #1594 from ilya-lavrenov:ocl_perf * #1595 from alalek:cl_code_cleanup * #1596 from alalek:test_fix_run_py * #1597 from alalek:ocl_fix_cleanup * #1598 from alalek:ocl_fix_build_mac * #1599 from ilya-lavrenov:ocl_mac_kernel_warnings * #1601 from ilya-lavrenov:ocl_fix_tvl1_and_sparse * #1602 from alalek:ocl_test_dump_info * #1603 from ilya-lavrenov:ocl_disable_svm_noblas * #1605 from alalek:ocl_fixes * #1606 from ilya-lavrenov:ocl_imgproc * #1607 from ilya-lavrenov:ocl_fft_cleanup * #1608 from alalek:fix_warn_upd_haar * #1609 from ilya-lavrenov:ocl_some_optimization * #1610 from alalek:ocl_fix_perf_kalman * #1612 from alalek:ocl_fix_string_info * #1614 from ilya-lavrenov:ocl_svm_misprint * #1616 from ilya-lavrenov:ocl_cvtColor * #1617 from ilya-lavrenov:ocl_info * #1622 from a0byte:2.4 * #1625 from ilya-lavrenov:to_string Conflicts: cmake/OpenCVConfig.cmake cmake/OpenCVDetectPython.cmake cmake/OpenCVGenConfig.cmake modules/core/CMakeLists.txt modules/nonfree/src/surf.ocl.cpp modules/ocl/include/opencv2/ocl/ocl.hpp modules/ocl/include/opencv2/ocl/private/util.hpp modules/ocl/perf/main.cpp modules/ocl/src/arithm.cpp modules/ocl/src/cl_operations.cpp modules/ocl/src/cl_programcache.cpp modules/ocl/src/color.cpp modules/ocl/src/fft.cpp modules/ocl/src/filtering.cpp modules/ocl/src/gemm.cpp modules/ocl/src/haar.cpp modules/ocl/src/imgproc.cpp modules/ocl/src/matrix_operations.cpp modules/ocl/src/pyrlk.cpp modules/ocl/src/split_merge.cpp modules/ocl/src/svm.cpp modules/ocl/test/main.cpp modules/ocl/test/test_fft.cpp modules/ocl/test/test_moments.cpp modules/ocl/test/test_objdetect.cpp modules/ocl/test/test_optflow.cpp modules/ocl/test/utility.hpp modules/python/CMakeLists.txt modules/ts/include/opencv2/ts.hpp modules/ts/src/ts_perf.cpp samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp
		
			
				
	
	
		
			183 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *
 | |
|  * Hybrid Tracking in OpenCV
 | |
|  * Usage: ./hybridtrackingsample live
 | |
|  *
 | |
|  * For Benchmarking against the Bonn benchmark dataset
 | |
|  * wget http://www.iai.uni-bonn.de/~kleind/tracking/datasets/seqG.zip
 | |
|  * unzip seqG.zip -d ./seqG
 | |
|  * ffmpeg -i seqG/Vid_G_rubikscube.avi seqG/%04d.png
 | |
|  * ./hytrack seqG/Vid_G_rubikscube.txt
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <time.h>
 | |
| #include <iostream>
 | |
| 
 | |
| #include "opencv2/highgui/highgui.hpp"
 | |
| #include "opencv2/contrib/hybridtracker.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 EVENT_LBUTTONDOWN:
 | |
|         origin = Point(x, y);
 | |
|         selection = Rect(x, y, 0, 0);
 | |
|         selectObject = true;
 | |
|         break;
 | |
|     case 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)
 | |
| {
 | |
|     if(argc != 2) {
 | |
|         help();
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     FILE* f = 0;
 | |
|     VideoCapture cap;
 | |
|     char test_file[20] = "";
 | |
| 
 | |
|     if (strcmp(argv[1], "live") != 0)
 | |
|     {
 | |
|         sprintf(test_file, "%s", argv[1]);
 | |
|         f = fopen(test_file, "r");
 | |
|         char vid[20];
 | |
|         int values_read = fscanf(f, "%s\n", vid);
 | |
|         CV_Assert(values_read == 1);
 | |
|         cout << "Benchmarking against " << vid << endl;
 | |
|         live = 0;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         cap.open(0);
 | |
|         if (!cap.isOpened())
 | |
|         {
 | |
|             cout << "Failed to open camera" << endl;
 | |
|             return 0;
 | |
|         }
 | |
|         cout << "Opened camera" << endl;
 | |
|         cap.set(CAP_PROP_FRAME_WIDTH, 640);
 | |
|         cap.set(CAP_PROP_FRAME_HEIGHT, 480);
 | |
|         cap >> frame;
 | |
|     }
 | |
| 
 | |
|     HybridTrackerParams params;
 | |
|     // motion model params
 | |
|     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;
 | |
|     // feature tracking params
 | |
|     params.ft_tracker_weight = 0.2f;
 | |
|     params.ft_params.feature_type = CvFeatureTrackerParams::OPTICAL_FLOW;
 | |
|     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);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             int values_read = fscanf(f, "%d %f %f %f %f\n", &i, &w[0], &w[1], &w[2], &w[3]);
 | |
|             CV_Assert(values_read == 5);
 | |
|             sprintf(img_file, "seqG/%04d.png", i);
 | |
|             image = imread(img_file, IMREAD_COLOR);
 | |
|             if (image.empty())
 | |
|                 break;
 | |
|             selection = Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
 | |
|                              cvRound(w[2]*image.cols), cvRound(w[3]*image.rows));
 | |
|         }
 | |
| 
 | |
|         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);
 | |
|             }
 | |
| 
 | |
|             drawRectangle(&image, Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
 | |
|                                        cvRound(w[2]*image.cols), cvRound(w[3]*image.rows)));
 | |
|             imshow("Win", image);
 | |
| 
 | |
|             waitKey(100);
 | |
|         }
 | |
|         else
 | |
|             i = 0;
 | |
|     }
 | |
| 
 | |
|     fclose(f);
 | |
|     return 0;
 | |
| }
 |