opencv 3/C+광 류 점 추적 실현

광 류 피라미드
calcOpticalFlowPyrLK()함수 매개 변수 설명:

void calcOpticalFlowPyrLK(
InputArray prevImg, //   8          buildOpticalFlowPyramid()      
InputArray nextImg,//          prevImg           
InputArray prevPts, //            ;            
InputOutputArray nextPts,//       (        )                    ; OPTFLOW_USE_INITIAL_FLOW     ,             。
OutputArray status, //      (   char);           ,           1,  ,   0.
OutputArray err,//      ;                   ,          flags     ;               (  status(  )       )。
Size winSize = Size(21,21), //               。
int maxLevel = 3,//       ;      0,       (  ),     1,       ,    ;            ,                ,    maxLevel。
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),//             (         criteria.maxCount         criteria.epsilon)
int flags = 0, //    
double minEigThreshold = 1e-4 //       2×2                    ;       minEigThreshold,              ,         ,             。
);

#include<opencv2/opencv.hpp>
using namespace cv;

//    
Mat frame, gray, pr_frame, pr_gray;
std::vector<Point2f> inPoints;
std::vector<Point2f> fpts[2];
void trackFeature();

int main()
{
  VideoCapture capture;
  capture.open(0);
  if(!capture.isOpened())
  {
    printf("can not open the camear......
"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); namedWindow("output", CV_WINDOW_AUTOSIZE); while (capture.read(frame)) { cvtColor(frame, gray, COLOR_BGR2GRAY); if (fpts[0].size() < 40) { imshow("input", frame); std::vector<Point2f> features; // goodFeaturesToTrack(gray, features, 300, 0.01, 10); fpts[0].insert(fpts[0].end(), features.begin(), features.end()); inPoints.insert(inPoints.end(), features.begin(), features.end()); } else printf("object tracking......
"); if (pr_gray.empty()) gray.copyTo(pr_gray); trackFeature(); for (int i = 0; i < fpts[0].size(); i++) circle(frame, fpts[0][i], 2, Scalar(0,255,0),2,8,0); gray.copyTo(pr_gray); frame.copyTo(pr_frame); imshow("output", frame); waitKey(1); } waitKey(0); capture.release(); return 0; } void trackFeature() { std::vector<uchar> status; std::vector<float> errors; // calcOpticalFlowPyrLK(pr_gray, gray, fpts[0], fpts[1], status, errors); int k = 0; for (int i = 0; i < fpts[1].size(); i++) { double dist = abs(fpts[0][i].x-fpts[1][i].x) + abs(fpts[0][i].y-fpts[1][i].y); if (dist > 2 && status[i]) { inPoints[k] = inPoints[i]; fpts[1][k++] = fpts[1][i]; } } inPoints.resize(k); fpts[1].resize(k); // RNG rng(0); for (int i = 0; i < fpts[0].size(); i++) { Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)); line(frame, inPoints[i], fpts[1][i], color,2); circle(frame, fpts[1][i], 2, Scalar(0,255,255),2); } std::swap(fpts[1], fpts[0]); }


이상 의 opencv 3/C++광 류 점 추적 을 실현 하 는 것 이 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기