2014-10-28 186 views
0

我想在Visual Studio 2013中使用OpenCV v3.0測試一些運動估計(這可能是我的第一個錯誤!)。我得到一個未處理的異常,試圖使用createOptFlow_DualTVL1()和createOptFlow_Farneback(),然後,爲了測試,嘗試cv :: accumulate(),它拋出了相同的異常。異常拋出InputOutputArray

看來,OpenCV不能寫入我傳遞這些函數的Mat對象。我無法讀取實際的cvException,因爲我沒有PDB文件,因爲我自己沒有編譯這個版本。這可能是我的下一站,但在我之前我想我會看到有沒有人看到過這種行爲。

這裏有一個最小的工作示例:

#include <opencv2/opencv.hpp> 
    #include <opencv2/core/core.hpp> 
    #include <opencv2/objdetect/objdetect.hpp> 
    #include <opencv2/highgui/highgui.hpp> 
    #include <opencv2/imgproc/imgproc.hpp> 
    #include <opencv2/video/tracking.hpp> 
    #include <opencv2/videoio/videoio.hpp> 

    #include <iostream> 
    #include <stdio.h> 
    #include <fstream> 
    #include <string> 
    #include <regex> 

    using namespace std; 
    using namespace cv; 

    int main(int argc, const char** argv) 
    { 
      VideoCapture captureDevice; 
      std::string videoname = "example.mp4"; 
      captureDevice.open(videoname); 

      //setup image files used in the capture process 
      Mat currFrame, dst; 

      captureDevice >> currFrame; 
      accumulate(currFrame, dst, cv::noArray()); 

      imshow("outputCapture", dst); 
      //pause for 33ms 
      waitKey(33); 

      return 0; 
    } 

回答

2

dst應該是相同的大小爲currFrameCV_32FC3型。 因此,呼籲accumulate之前添加此行代碼 -

dst.create(currFrame.size(), CV_32FC3); 

由於dst是float類型的,你需要將其轉換爲UCHAR來顯示它。爲此,轉換,如下圖所示 -

Mat dst_disp; 
dst.convertTo(dst_disp, CV_8UC3); 
imshow("outputCapture",dst_disp); 

此外,當你在dst積累更多的幀,則需要通過幀數正常化(假設N)緩存在dst。簡單地說,將dst除以N,然後將結果轉換爲CV_8UC3並顯示。例如,如果你積累了dst 1000幀做如下圖所示,

// Accumulate 1000 frames 
for(int i = 0; i < 1000; i++) 
    accumulate(currFrame, dst, cv::noArray()); 
// Normalize 
dst = dst/ 1000; 
// Display the frame 
Mat dst_disp; 
dst.convertTo(dst_disp, CV_8UC3); 
imshow("outputCapture",dst_disp); 

否則,你可能會得到一個全白圖像。

UPDATE

從下面@ berak的評論。

對於歸一化,簡單地使用

dst.convert(dst_disp, CV_8UC3, 1.0/N); 

其中N例如在以上會更好甚至1000

+1

:DST =墊(currFrame.size(),CV_32FC3,標量::所有( 0)); //因爲Mat.create不會初始化內存 – berak 2014-10-28 20:17:53

+1

也:convert(dst_disp,CV_8UC3,1.0/N); //一次性完成。 – berak 2014-10-28 20:19:28

+0

感謝您的改進@berak。我已更新這篇文章以引用您的意見。 – bikz05 2014-10-28 20:23:09