2016-11-22 2 views
0

Ich habe ein Skript in Python geschrieben, das die cv2.minEnclosingCircle Methode aufruft, ich versuche, ein ähnliches Programm in C++ zu erstellen, aber ich bin nicht in der Lage Radius und Mittelpunkt als Referenz übergeben.ungültige Initialisierung des nicht-const Referenz des Typs 'cv :: Point2f &'

Ich habe versucht, alternative Antworten bezüglich ungültige Initialisierung zu verwenden und die OpenCV-Dokumentation in Bezug auf die Funktion zu folgen, aber es ist nicht klar, Ich bin Lage ohne das ‚&‘ Radius und Mittelpunkt passieren jedoch würde ich bevorzuge nicht. Hier

ist die Dokumentation in Bezug auf die Methode http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#minenclosingcircle

Hier ist mein Code:

 if (contours.size() > 0) 
     { 
      auto c = *std::max_element(contours.begin(),contours.end(), 
    [](std::vector<cv::Point> const& lhs, std::vector<cv::Point> const& rhs) 
    {return contourArea(lhs, false) < contourArea(rhs, false); }); 

      cv::minEnclosingCircle(c, &center, &radius); // not compiling 
     } 

ich erklärt haben, Radius und Mittelpunkt als Schwimmer und cv :: Point2f Typen sind.

Error: invalid initialization of non-const reference of type 'cv::Point2f& {aka cv::Point_<float>& }' from an rvalue of type 'cv::Point2f* {aka cv::Point_<float>*} 

Hier ist, wie ich es in Python zu tun:

if len(contours) > 0; 
     #find largest contour in mask, use to compute minEnCircle 
     c = max(contours, key = cv2.contourArea) 
     (x,y), radius) = cv2.minEnclosingCircle(c) #not compiling in c++ 
     M = cv2.moments(c) 
+0

Entschuldigung für den Tippfehler Miki! –

+2

Warum passierst du mit '&'? Rufen Sie einfach 'cv :: minEnclosingCircle (c, center, radius);' auf. 'center' und' radius' werden als Referenz übergeben, Sie brauchen nicht die '&' – Miki

+1

Mögliche Duplikate von [C++: Argument Passing "als Referenz übergeben"] (http://stackoverflow.com/questions/19827119/c -argument-passing-pass-by-reference) – Miki

Antwort

1

Sie können nicht die Variablen explizit mit & Operator in C++ übergeben müssen, kann dies einfach getan werden, wie:

std::vector<std::vector<cv::Point> > contours; 
std::vector<cv::Vec4i> hierarchy; 

// Here contours and hierarchy are implicitly passed by reference. 
cv::findContours(img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); 

cv::Point2f center; 
float radius; 
if (contours.size() > 0) { 
    // center and radius implicitly passed by reference. 
    cv::minEnclosingCircle(contours[0], center, radius); 
} 
std::cout << "Center : " << center << std::endl; 
std::cout << "Radius : " << radius << std::endl; 
Verwandte Themen