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;
}