OpenCV 2.4.4 버전을 사용하고 있습니다. - 나는 그 베타가 인 것을 알고있다.하지만 이라는 예제 폴더에있는 메서드는 cv::calcOpticalFlowSF
이라는 예제가있다. 그러나이 데모를 복사하여 입력 이미지와 함께 사용하면 처리가 시작되고 몇 초 후에 충돌 보고서가 다시 나타납니다. 메서드에 대한 설명서는 약간 이상합니다. 출력 파일은 메서드에서 실제로 원하는 cv::Mat& flow
대신 x 및 yflow입니다. 아이디어를 통해 문제를 해결하고 기능을 작동 시키려면 어떻게해야합니까?cv :: calcOpticalFlowSF가 작동하는 방법?
답변
(here에서 디스플레이 도움을) 당신의 요구에 맞게 수정 한 후, 나를 위해 일한이 간단한 데모를보십시오 :
Mat frame1 = imread("/home/radford/Desktop/1.png");
Mat frame2 = imread("/home/radford/Desktop/2.png");
namedWindow("flow");
Mat flow;
calcOpticalFlowSF(frame1, frame2, flow, 3, 2, 4);
Mat xy[2];
split(flow, xy);
//calculate angle and magnitude
Mat magnitude, angle;
cartToPolar(xy[0], xy[1], magnitude, angle, true);
//translate magnitude to range [0;1]
double mag_max;
minMaxLoc(magnitude, 0, &mag_max);
magnitude.convertTo(magnitude, -1, 1.0/mag_max);
//build hsv image
Mat _hsv[3], hsv;
_hsv[0] = angle;
_hsv[1] = Mat::ones(angle.size(), CV_32F);
_hsv[2] = magnitude;
merge(_hsv, 3, hsv);
//convert to BGR and show
Mat bgr;//CV_32FC3 matrix
cvtColor(hsv, bgr, COLOR_HSV2BGR);
imshow("flow", bgr);
waitKey(0);
이제는 opticalFlow DualTVL1도 함께 사용해 주셔서 감사합니다. – user1651460
고맙습니다. 코드가 많은 도움이되었습니다. 하지만 나는 회색 이미지에 문제가있다. \t'cv :: cvtColor (image1Re, gray, CV_BGR2GRAY); cv :: cvtColor (image2Re, prevgray, CV_BGR2GRAY);'프레임 1 및 프레임 2의 입력 인디케이터로 gray 및 prevgray를 사용합니다. 이 경우 무엇이 잘못 될지 아십니까? – user1651460
calcOpticalFlowSF 문서의 변수 이름을 살펴 보았을 때 색상이 알고리즘에서 사용되는 것처럼 보이므로 입력으로 필요합니다. –
을 예에서 OpenCV의/샘플/CPP/코드 블록
이 simpleflow_demo.cppif (frame1.type() != 16 || frame2.type() != 16) {
printf(APP_NAME "Images should be of equal type CV_8UC3\n");
exit(1);
}
따라서 회색 이미지는 CV_8UC3으로 변환되어야합니다. 예를 들어 cvtColor (gray, grey3, CV_GRAY2RGB);
크래시 보고서의 실제 세부 정보를 게시해야합니다. 별도의 X 및 Y 플로우에 대한 비트는 C++ API가 아닌 C API 용입니다. – ajshort