2016-11-09 13 views
1

Ich benutze C++ und OpenCV. Jetzt möchte ich einen bestimmten Mat Typ definieren (wie CV_32FC3), der von vielen Mats in meinem Code verwendet werden soll.OpenCV #define type für Mat

Um dies zu erreichen, habe ich versucht:

#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); 
} 

Doch diese Fehler verursacht

erwartet a ')'

einen folgenden Ausdruck erwartet

Dann habe ich versucht, ,

#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); 
} 

Was funktioniert, ist aber meiner Meinung nach hässlich.

Ich verstehe nicht wirklich warum oder wie das funktioniert, und warum der erste Ausschnitt Fehler verursacht. Ich bin kein C++ - Experte, daher wird jede Hilfe geschätzt.

Antwort

2

Ihr Fehler ist in der ; am Ende der Definition. Ihr Code muss sein:

#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); 
} 

schön mehr, wenn Sie entfernen sich alle definieren wie folgt aus:

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

Großartig! Das behebt es. Können Sie erklären, warum "constexpr auto" besser wäre als "# define"? –

+0

Weißt du auch, warum es funktioniert mit 'int test = FLOW_TYPE;' als lokale Variable? –

+1

@WouterFlorijn Weil es zu 'int test = CV_32FC3 ;;' mit doppeltem Semikolon expandiert, aber das ist kein Fehler. 'cv :: Matfluss = cv :: Mat (frame1.rows, frame1.cols, CV_32FC3;);' ist stattdessen ein Fehler (beachte das Semikolon nach 'CV_32FC3') – Miki

1

Sie haben einen Fehler, da es erweitert

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

, die den Fehler verursacht (Beachten Sie das Semikolon nach CV_32FC3). Mit den lokalen Variablen statt erweitert es:

int test = CV_32FC3;; 

mit Doppel Semikolon, aber das ist kein Fehler.

Sie können ohne Semikolon diese definieren korrigieren:

#define FLOW_TYPE CV_32FC3 

Es wäre wahrscheinlich einfacher direkt zu definieren, welche Art von Matrix Sie verwenden möchten, und verwenden Sie Mat_<Tp> für einen leichteren Zugang (Sie dies nicht tun müssen .at<Tp>(...) verwenden, um Elemente zugreifen, aber nur die Klammern):

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

} 

Oder:

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

    // ... 
}