如何让cv :: calcOpticalFlowSF工作?

时间:2013-02-20 07:27:56

标签: c++ opencv opticalflow

我正在使用2.4.4版本的OpenCV。 - 我知道它的测试版 但是有一个关于示例文件夹中cv::calcOpticalFlowSF方法的示例:simpleflow_demo.cpp。但是当我复制这个演示并将其与我的输入图像一起使用时,它会开始处理,几秒钟后它就会返回崩溃报告。 关于该方法的文档有点奇怪,说输出文件是x和yflow而不是方法实际需要的cv::Mat& flow。 任何想法如何解决问题以使功能正常工作?

2 个答案:

答案 0 :(得分:4)

尝试这个适合我的简单演示,然后根据您的需要进行修改(显示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);

答案 1 :(得分:0)

在示例opencv / samples / cpp / simpleflow_demo.cpp中有一个代码块

if (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);