#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/dir_nav.h>
#include <dlib/opencv.h>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
using namespace std;
using namespace cv;
using namespace dlib;
static dlib::drectangle cvtRectToDrect(cv::Rect _rect)
{
return dlib::drectangle(_rect.tl().x, _rect.tl().y, _rect.br().x - 1, _rect.br().y - 1);
}
static dlib::array2d<unsigned char> cvtMatToArray2d(cv::Mat _mat) // cv::Mat, not cv::Mat&. Make sure use copy of image, not the original one when converting to grayscale
{
//Don't need to use color image in HOG-feature-based tracker
//Convert color image to grayscale
if (_mat.channels() == 3)
cv::cvtColor(_mat, _mat, cv::COLOR_RGB2GRAY);
//Convert opencv 'MAT' to dlib 'array2d<unsigned char>'
dlib::array2d<unsigned char> dlib_img;
dlib::assign_image(dlib_img, dlib::cv_image<unsigned char>(_mat));
return dlib_img;
}
int main(int argc, char* argv[])
{
string videoPath = "d://78.avi";
cv::VideoCapture cap(videoPath);
Mat frame;
// quit if unabke to read video file
if (!cap.isOpened())
{
cout << "Error opening video file " << videoPath << endl;
return -1;
}
cap.set(CAP_PROP_POS_FRAMES, 50);
// read first frame
cap >> frame;
bool showCrosshair = false;
bool fromCenter = false;
cv::Rect rt = cv::selectROI("Video", frame, showCrosshair, fromCenter);
dlib::correlation_tracker tracker;
dlib::drectangle dlib_rect = cvtRectToDrect( rt );
dlib::array2d<unsigned char> dlib_frame = cvtMatToArray2d(frame);
tracker.start_track(dlib_frame, dlib_rect);
while (cap.isOpened())
{
cap >> frame;
// stop the program if reached end of video
if (frame.empty())
break;
//cv::Rect current = tracker.update(frame);
dlib::array2d<unsigned char> dlib_img = cvtMatToArray2d( frame );
// Track using dlib::update function
double confidence = tracker.update(dlib_img);
dlib::drectangle updated_rect = tracker.get_position();
cv::Rect outRect = cv::Rect(updated_rect.tl_corner().x(), updated_rect.tl_corner().y(), updated_rect.width(), updated_rect.height());
cv::rectangle(frame, outRect, cv::Scalar(0, 255, 255), 2);
cv::imshow("Dlib Tracking...", frame);
cv::waitKey(1);
}
}
这是今天写的测试代码。