使用哈尔输入的光流跟踪车辆

时间:2016-11-24 06:20:36

标签: c++ linux qt

我难以实施光流方法来跟踪来自haar级联输入的车辆。 到目前为止,我只能实现光流,但输入不是来自Haar Cascade。 你能帮助我吗 .. ?? 这是我的代码

using namespace cv;
using namespace std;

int main()
{
int count= 0; double areax, areay, KoorX, KoorY;
Mat prev_frame, gray, temp, prev_img;
Mat frameROI, imgROI, frameLKP;
Mat ROI, prevROI, ROIOF;

//Parameter OFLKP
int win_size = 24; 
int maxCorners =24;
int maxlevel =8; 
TermCriteria termcrit(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS,20,0.01);
vector<uchar>found;
vector<float>error;

//Parameter Shi-Tomasi
vector<Point2f> prevcorners, corners;
double qualityLevel = 0.05; //0.4
double minDistance = 1; //2
int blockSize = 3;
bool useHarrisDetector = false;
double k = 0.04;

vector<Point2f> frame_corners; // CvPoint array of features
frame_corners.reserve(maxCorners);
vector<Point2f> prevframe_corners;
prevframe_corners.reserve(maxCorners);

//=======> Manggil dan buka video
VideoCapture video("Uji1.avi");
//=======> Manggil .xml
CascadeClassifier Casmobil;
String Casmobil_file = "car2500.xml";
Casmobil.load(Casmobil_file);

namedWindow("Video", 1);
namedWindow("Tracking OF", 1);
namedWindow("Deteksi Haar", 1);

video >> prev_frame;
Rect roi = Rect(50, 180, 540, 240);
prevROI=prev_frame(roi);
cvtColor(prevROI, gray, CV_BGR2GRAY);
gray.convertTo(prev_img, CV_8UC1);

while(true)
{
    //=====> baca frame dr video
    video >> frameROI;
    //=====> ROI
    Rect roi = Rect(50, 180, 540, 240);
    Mat ROI=frameROI(roi);

    cvtColor(ROI, gray, CV_BGR2GRAY); //=====> RGB to Grayscale
    gray.convertTo(imgROI, CV_8UC1);

    Mat ROIOF = frameROI(roi);

    //======> Deteksi
    vector<Rect> mobil;
    Casmobil.detectMultiScale(gray, mobil, 1.1, 3,
             CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,
             Size(0,0));

    //======> Gambar kotak
    for (size_t i = 0; i < mobil.size(); i++)
    {
        Rect kotak = mobil[i];
        areax = (mobil[i].x + mobil[i].width*0.5);
        areay = (mobil[i].y + mobil[i].height*0.5);
        Point center = Point(areax ,areay);
        rectangle(ROI, kotak,CV_RGB(0,255,0),2,8,0);
        circle(ROI, center, 3,CV_RGB(255, 0, 0),-2);
    }

    //prev_frame
    goodFeaturesToTrack(imgROI, frame_corners,maxCorners,
                qualityLevel,minDistance,Mat(),
                blockSize,useHarrisDetector,k);
    cornerSubPix(imgROI, frame_corners, Size(win_size, win_size),
                Size( -1, -1 ),termcrit);
    calcOpticalFlowPyrLK(imgROI, prev_img, frame_corners,
                prevframe_corners, found, error,
                Size(win_size, win_size), maxlevel,termcrit);


    for( int j = 0; j < frame_corners.size(); j++ )
     {
        circle(ROIOF, frame_corners[j], 2, CV_RGB(255, 0, 0), -1);
        circle(ROIOF, prevframe_corners[j], 2, CV_RGB(0, 0, 255), -1);
        //circle(copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)), -1, 8, 0 );
        line(ROIOF, prevframe_corners[j], frame_corners[j], CV_RGB(0, 255, 0),2, 8, 0);
    }


    prev_img = imgROI.clone();

    imshow("Video ", frameROI);
    imshow("Deteksi Haar", ROI);
    imshow("Tracking OF", ROIOF);
    if(waitKey(400) >= 0) break;
}
return 0;
}

感谢,,

我是否需要通过从哈尔结果中裁剪图像来替换goodfeaturesToTrack中的输入图像? 喜欢 :  Mat Crop = imgROI(mobil[i]);

goodFeaturesToTrack(Crop,frame_corners,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);

0 个答案:

没有答案