2013-02-20 91 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);