2013-02-20 123 views
1

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

+0

你需要发布崩溃报告的实际细节。关于X和Y流分开的位是C API,而不是C++ API。 – ajshort 2013-02-20 11:38:19

回答

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); 
+0

谢谢你,我现在也有了使用这种光纤的DualFlow Dual。 – user1651460 2013-02-21 06:29:26

+0

谢谢你,你的代码帮助了很多!但我仍然有灰色图像的问题:\t cv :: cvtColor(image1Re,gray,CV_BGR2GRAY); cv :: cvtColor(image2Re,prevgray,CV_BGR2GRAY);'使用:gray和prevgray作为frame1和frame2的输入intead。你知道在这种情况下出了什么问题吗? – user1651460 2013-02-21 06:52:05

+0

只需查看calcOpticalFlowSF文档中的变量名称,就可以在算法中使用颜色,并且必须将其作为输入。 – 2013-02-21 13:59:43

0

在这个例子中的OpenCV /样品/ 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);