opencv金字塔Lucas Canade技术来检测车辆

时间:2019-07-19 06:28:58

标签: c++ opencv

我尝试检测“ https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html”中的

c ++代码,但是最后两行代码导致编译在中间结束。 告诉我为什么这是一个错误以及如何解决。

问题的代码部分   old_gray = ROI1_gray.clone();   p0 = good_new;

我英语很难,所以我请翻译问问题。

#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc.hpp>
#include <gsl/gsl_fit.h>
#include <iostream>

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>
#include "opencv2\highgui\highgui_c.h"

using namespace cv;
using namespace std;

Mat frame, reframe;
Mat ROI1_gray;

Mat old_frame, old_reframe;
Mat old_gray;

//관심영역1 시작점
int startx_1 = 0;
int starty_1 = 340;

//관심영역1 끝점
int endx_1 = 640;
int endy_1 = 720;

int main(int argc, char** argv){


//저장된 동영상 불러오기
VideoCapture cap("test.mp4");


//영상 찾기 실패시
if (!cap.isOpened()){
    cerr << "error - 영상을 찾을수 없습니다" << endl;
    return -1;
}

int n = 100;

cap >> old_frame;
resize(old_frame, old_reframe, Size(1280, 720));
Mat oldROI_1(old_reframe, Rect(startx_1, starty_1, endx_1 - startx_1, endy_1 - starty_1));
cvtColor(oldROI_1, old_gray, COLOR_BGR2GRAY);

vector<Scalar> colors;
for (int i = 0; i < n; i++) {
    colors.push_back(Scalar(0, 0, 255));
}
vector<Point2f> p0, p1;
//goodFeaturesToTrack(영상, 검출된 코너를 담을 벡터, 코너의 최대 개수, 코너라고 판단하기 위한 기준이 되는 최소의 값, 유클리디안 거리, 코너를 찾을 관심영역, 평균 블록의 크기, 결정 플래그, 파라미터)
goodFeaturesToTrack(old_gray, p0, n, 0.3, 7, Mat(), 7, false, 0.04);

Mat mask = Mat::zeros(oldROI_1.size(), oldROI_1.type());



while (1) {
    //영상 읽어오기
    cap.read(frame);

    //영상 크기
    //resize(frame, reframe, Size(), 0.5, 0.5, INTER_AREA);
    resize(frame, reframe, Size(1280,720));


    //관심영역1 사각형 테두리 만들기
    rectangle(reframe, Point(startx_1, starty_1), Point(endx_1, endy_1), Scalar(0, 255, 0), 1);

    //관심영역1 지정(영상, 사각형( x축 시작점, y축 시작점, 가로 길이, 세로 길이))
    Mat ROI_1(reframe, Rect(startx_1, starty_1, endx_1 - startx_1, endy_1 - starty_1));



    cvtColor(ROI_1, ROI1_gray, COLOR_BGR2GRAY);


    // calculate optical flow
    vector<uchar> status;
    vector<float> err;
    //TermCriteria 클래스: 반복적인iterative 연산을 수행하는 알고리즘들의 종료 기준들 termination criteria을 정의한다
    //TermCriteria::TermCriteria(종료 기준에 대한 타입, 최대 반복 횟수 혹은 구성요소 elements의 계한 횟수, 반복 알고리즘이 중지되는 매개 변수의 원하는 정확도 또는 변경)
    TermCriteria criteria = TermCriteria((TermCriteria::COUNT) + (TermCriteria::EPS), 10, 0.03);
    calcOpticalFlowPyrLK(old_gray, ROI1_gray, p0, p1, status, err, Size(15, 15), 2, criteria);
    vector<Point2f> good_new;
    for (uint i = 0; i < p0.size(); i++){
        // Select good points
        if (status[i] == 1) {
            good_new.push_back(p1[i]);
            line(mask, p1[i], p0[i], colors[i], 2);
            circle(ROI_1, p1[i], 3, colors[i], -1);
        }
    }
    Mat img;
    add(ROI_1, mask, img);


    //영상 출력
    imshow("Live", reframe);
    imshow("check", img);

    //키 입력 체크(0.001초)
    int check = waitKey(1);

    //space키 일시정지
    if (check == 32) {
        waitKey(0);
    }
    //esc 종료
    else if (check == 27) {
        break;
    }


    old_gray = ROI1_gray.clone();
    p0 = good_new;


}

return 0;

}

0 个答案:

没有答案