如何使用 DLIB 跟踪 ROI 中的对象



我正在尝试获取流并定义ROI并使用dlib相关跟踪器跟踪ROI中的对象,但是编译中存在错误,找不到任何代码或解释可以描述此错误的任何解决方案。提前谢谢。

CVCAP.cpp

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "dlib/image_processing.h"
#include "dlib/gui_widgets.h"
#include "dlib/image_io.h"
#include "dlib/dir_nav.h"
using namespace dlib;
using namespace std;
int main(int argc, char * argv[]){
    CvCapture* camera = cvCaptureFromFile(argv[1]);
    if (camera==NULL)
        printf("camera is nulln");
    else
        printf("camera is not nulln");
    cvNamedWindow("CvCapture");
    while (cvWaitKey(1000)!=atoi("q")){
        double t1 = (double)cvGetTickCount();
        IplImage *img = cvQueryFrame(camera);
        cvSetImageROI(img, cvRect(140, 150, 340, 150));
        IplImage *img1 = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);
        cvCopy(img, img1, NULL);
        cvResetImageROI(img);
        cvShowImage("ROI",img1);
        correlation_tracker tracker;
        tracker.start_track(img1, centered_rect(point(120,100), 80, 150));
        image_window win;
        tracker.update(img1);
        win.set_image(img1); 
        win.clear_overlay(); 
        win.add_overlay(tracker.get_position());
        cout << "hit enter to process next frame" << endl;
        cin.get();
        double t2=(double)cvGetTickCount();
        printf("time: %gms  fps: %.2gn",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
        cvShowImage("CvCapture",img1);
    }
    cvReleaseCapture(&camera);
}

错误是:

In file included from dlib/image_processing.h:24:0,
                 from cvcap.cpp:3:
dlib/image_processing/correlation_tracker.h: In instantiation of ‘dlib::point_transform_affine dlib::correlation_tracker::make_chip(const image_type&, 
dlib::drectangle, std::vector<dlib::matrix<std::complex<double> > >&) const [with image_type = _IplImage*]’:
dlib/image_processing/correlation_tracker.h:65:47:   required from ‘void dlib::correlation_tracker::start_track(const image_type&, const dlib::drectang
le&) [with image_type = _IplImage*]’
cvcap.cpp:36:70:   required from here
dlib/image_processing/correlation_tracker.h:301:67: error: invalid use of incomplete type ‘struct dlib::image_traits<_IplImage*>’
             typedef typename image_traits<image_type>::pixel_type pixel_type;

更新

我编辑了我的代码,现在它正在编译,但是当我运行我的代码时,出现了跟踪框,但它没有跟踪对象。

for(;;) {
        if(!vcap.read(image)) {
            std::cout << "No frame" << std::endl;
            break;
        } else {
        std::cout << "Starting" << std::endl;
            array2d<rgb_pixel> img;
            assign_image(img, cv_image<rgb_pixel>(image));
            tracker.start_track(img, centered_rect(point(413,260), 98, 126));
            for (unsigned long i = 0; i < img.size(); i++) {
                tracker.update(img);
                win.set_image(img); 
                win.clear_overlay(); 
                win.add_overlay(tracker.get_position());
            }
    } 
  } 

你正在将 IplImage 传递给 dlib 例程。但是,如果您查看文档,它说您必须将opencv图像转换为cv_images,然后再将它们传递给dlib函数。您可以通过指出IplImage没有pixel_type特征的错误中看到这一点。解决方法是。

IplImage *img1 = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);
...
correlation_tracker tracker;
// Not sure if  the tracker wants a single channel image
// change rgb_alpha_pixel to uchar in that case.
tracker.start_track(dlib::cv_image<dlib::rgb_alpha_pixel>(img1), centered_rect(point(120,100), 80, 150));

像素类型和相关性跟踪器

编辑:将您的东西传递给opencv 3,这是为我编译的。你真的需要使用opencv 2吗?

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "dlib/image_processing.h"
#include "dlib/gui_widgets.h"
#include "dlib/image_io.h"
#include "dlib/dir_nav.h"
#include <dlib/opencv/cv_image.h>
using namespace cv;
using namespace dlib;
using namespace std;
int main(int argc, char * argv[]){
    VideoCapture cap(0);
    Mat frame;
    while (cap.read(frame)) {
        cvtColor(frame, frame, CV_RGB2GRAY);
        cv_image<unsigned char> img(frame);
        correlation_tracker tracker;
        tracker.start_track(img, centered_rect(point(120,100), 80, 150));
        image_window win;
        tracker.update(img);
        win.set_image(img);
        win.clear_overlay();
        win.add_overlay(tracker.get_position());
        cout << "hit enter to process next frame" << endl;
        cv::waitKey(0);
    }
}

并带有更丑陋的OpenCV 2。

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "dlib/image_processing.h"
#include "dlib/gui_widgets.h"
#include "dlib/image_io.h"
#include "dlib/dir_nav.h"
#include <dlib/opencv/cv_image.h>
using namespace cv;
using namespace dlib;
using namespace std;
int main(int argc, char * argv[]){
    CvCapture* camera = cvCaptureFromFile(argv[1]);
    if (camera==NULL)
        printf("camera is nulln");
    else
        printf("camera is not nulln");
    cvNamedWindow("CvCapture");
    while (cvWaitKey(1000)!=atoi("q")) {
        double t1 = (double)cvGetTickCount();
        IplImage *img = cvQueryFrame(camera);
        cvSetImageROI(img, cvRect(140, 150, 340, 150));
        IplImage *img1 = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);
        cvCopy(img, img1, NULL);
        cvResetImageROI(img);
        cvShowImage("ROI",img1);
        cvCvtColor(img1, img1, CV_RGB2GRAY);
        cv_image<unsigned char> img2(img1);
        correlation_tracker tracker;
        tracker.start_track(img2, centered_rect(point(120,100), 80, 150));
        image_window win;
        tracker.update(img2);
        win.set_image(img2);
        win.clear_overlay();
        win.add_overlay(tracker.get_position());
        cout << "hit enter to process next frame" << endl;
        cin.get();
        double t2=(double)cvGetTickCount();
        printf("time: %gms  fps: %.2gn",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
        cvShowImage("CvCapture",img1);
    }
    cvReleaseCapture(&camera);
}

如您所见,错误完全来自我之前告诉您的内容。

最新更新