2016-11-09 75 views
1

我正在使用C++和OpenCV。現在我想定義一個Mat類型(例如CV_32FC3),以供我的代碼中的許多Mats使用。OpenCV#定義墊的類型

爲了實現這一點,我想:

#define FLOW_TYPE CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 

然而,這會導致錯誤

預期 ')'

預期表達

然後我試圖,

#define FLOW_TYPE CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    int test = FLOW_TYPE; 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, test); 
} 

哪些工作,但在我看來是醜陋的。

我真的不明白爲什麼或如何工作,以及爲什麼第一個代碼段會導致錯誤。我不是C++專家,所以任何幫助表示讚賞。

回答

2

你的錯誤是在定義結束時的;。您的代碼必須是:

#define FLOW_TYPE CV_32FC3 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 

更漂亮,如果你刪除所有的定義是這樣的:

constexpr auto FLOW_TYPE = CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 
+0

太棒了!這解決了它。你能解釋爲什麼'constexpr auto'會比使用'#define'更好嗎? –

+0

另外,你知道爲什麼它使用'int test = FLOW_TYPE;'作爲局部變量嗎? –

+1

@WouterFlorijn因爲它用雙分號擴展爲'int test = CV_32FC3 ;;',但這不是錯誤。 'cv :: Mat flow = cv :: Mat(frame1.rows,frame1.cols,CV_32FC3;);'是相反的錯誤(注意'CV_32FC3'後面的分號) – Miki

1

你,因爲它擴大到

cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, CV_32FC3;); 

這將導致錯誤有一個錯誤(注意CV_32FC3之後的分號)。 隨着局部變量,而不是它擴展爲:

int test = CV_32FC3;; 

雙分號,但是這不是一個錯誤。

您可以糾正這種不定義分號:

#define FLOW_TYPE CV_32FC3 

它可能會更容易直接定義要使用哪一種矩陣,並使用Mat_<Tp>更容易獲得(你不這樣做需要使用.at<Tp>(...)訪問的元素,只是括號):

using FlowMat = cv::Mat3f; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    FlowMat flow(frame1.rows, frame1.cols); 

    // or, to zero initialize 
    // FlowMat flow = FlowMat::zeros(frame1.rows, frame1.cols); 

} 

或者:

using FlowType = cv::Vec3f; 
using FlowMat = cv::Mat_<FlowType>; 

void foo(cv::Mat& frame1, cv::Mat& frame2) 
{ 
    FlowMat flow = FlowMat::zeros(frame1.rows, frame1.cols); 

    flow(2, 3) = FlowType(1, 2, 3); 
    FlowType value = flow(2, 3); 

    // ... 
}