La llamada de sobrecargado ‘Point_ (cv :: Point2f &)’ es ambigua

Estoy trabajando en un código de ejemplo para OpenCV2 & C ++ y me quedé atascado. El comstackdor (MinGW, g ++ 4.7.2 en Win7) dice que la llamada de ‘Point_ (cv :: Point2f &) sobrecargada’ es ambigua pero no puedo encontrar exactamente lo que está mal. Aquí está el error:

18:09:33 **** Incremental Build of configuration Debug for project Blobs **** Info: Internal Builder is used for build g++ "-IC:\\OpenCV246PC\\build\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o blobs.o "..\\blobs.cpp" ..\blobs.cpp: In function 'int main()': ..\blobs.cpp:65:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] ..\blobs.cpp:65:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] ..\blobs.cpp:99:37: error: call of overloaded 'Point_(cv::Point2f&)' is ambiguous ..\blobs.cpp:99:37: note: candidates are: In file included from ..\blobs.cpp:20:0: C:\OpenCV246PC\build\include/opencv2/core/core.hpp:740:5: note: cv::Point_::Point_(const CvPoint2D32f&) [with _Tp = int; CvPoint2D32f = CvPoint2D32f] C:\OpenCV246PC\build\include/opencv2/core/core.hpp:739:5: note: cv::Point_::Point_(const CvPoint&) [with _Tp = int; CvPoint = CvPoint] C:\OpenCV246PC\build\include/opencv2/core/core.hpp:738:5: note: cv::Point_::Point_(const cv::Point_&) [with _Tp = int; cv::Point_ = cv::Point_] // ERROR IS HERE // It god mixed up when I pasted, so line number is not the one compiler complains. cv::circle(result, cv::Point(center), static_cast(radius), cv::Scalar(0), 2); 

Y aquí está el código:

 #include  #include  #include  #include  #include  int main() { // Read input binary image cv::Mat image = cv::imread("binaryGroup.bmp", 0); if (!image.data) return 0; cv::namedWindow("Binary Image"); cv::imshow("Binary Image", image); // Get the contours of the connected components std::vector<std::vector > contours; cv::findContours(image, contours, // a vector of contours CV_RETR_EXTERNAL, // retrieve the external contours CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours // Print contours' length std::cout << "Contours: " << contours.size() << std::endl; std::vector<std::vector >::const_iterator itContours = contours.begin(); for (; itContours != contours.end(); ++itContours) { std::cout << "Size: " <size() << std::endl; } // draw black contours on white image cv::Mat result(image.size(), CV_8U, cv::Scalar(255)); cv::drawContours(result, contours, -1, // draw all contours cv::Scalar(0), // in black 2); // with a thickness of 2 cv::namedWindow("Contours"); cv::imshow("Contours", result); // Eliminate too short or too long contours int cmin = 100; // minimum contour length int cmax = 1000; // maximum contour length std::vector<std::vector >::iterator itc = contours.begin(); while (itc != contours.end()) { if (itc->size() size() > cmax) itc = contours.erase(itc); else ++itc; } // draw contours on the original image cv::Mat original = cv::imread("group.jpg"); cv::drawContours(original, contours, -1, // draw all contours cv::Scalar(255, 255, 255), // in white 2); // with a thickness of 2 cv::namedWindow("Contours on Animals"); cv::imshow("Contours on Animals", original); // Let's now draw black contours on white image result.setTo(cv::Scalar(255)); cv::drawContours(result, contours, -1, // draw all contours cv::Scalar(0), // in black 1); // with a thickness of 1 image = cv::imread("binaryGroup.bmp", 0); // testing the bounding box cv::Rect r0 = cv::boundingRect(cv::Mat(contours[0])); cv::rectangle(result, r0, cv::Scalar(0), 2); // testing the enclosing circle float radius; cv::Point2f center; // http://opencv.willowgarage.com/documentation/cpp/structural_analysis_and_shape_descriptors.html#cv-minenclosingcircle // void minEnclosingCircle(const Mat& points, Point2f& center, float& radius) cv::minEnclosingCircle(cv::Mat(contours[1]), center, radius); // http://opencv.willowgarage.com/documentation/cpp/drawing_functions.html#cv-circle // void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0) // ERROR IS HERE cv::circle(result, cv::Point(center), static_cast(radius), cv::Scalar(0), 2); // <--- ERROR IS HERE // cv::RotatedRect rrect= cv::fitEllipse(cv::Mat(contours[1])); // cv::ellipse(result,rrect,cv::Scalar(0),2); // testing the approximate polygon std::vector poly; cv::approxPolyDP(cv::Mat(contours[2]), poly, 5, true); std::cout << "Polygon size: " << poly.size() << std::endl; // Iterate over each segment and draw it std::vector::const_iterator itp = poly.begin(); while (itp != (poly.end() - 1)) { cv::line(result, *itp, *(itp + 1), cv::Scalar(0), 2); ++itp; } // last point linked to first point cv::line(result, *(poly.begin()), *(poly.end() - 1), cv::Scalar(20), 2); // testing the convex hull std::vector hull; cv::convexHull(cv::Mat(contours[3]), hull); // Iterate over each segment and draw it std::vector::const_iterator it = hull.begin(); while (it != (hull.end() - 1)) { cv::line(result, *it, *(it + 1), cv::Scalar(0), 2); ++it; } // last point linked to first point cv::line(result, *(hull.begin()), *(hull.end() - 1), cv::Scalar(20), 2); // testing the moments // iterate over all contours itc = contours.begin(); while (itc != contours.end()) { // compute all moments cv::Moments mom = cv::moments(cv::Mat(*itc++)); // draw mass center cv::circle(result, // position of mass center converted to integer cv::Point(mom.m10 / mom.m00, mom.m01 / mom.m00), 2, cv::Scalar(0), 2); // draw black dot } cv::namedWindow("Some Shape descriptors"); cv::imshow("Some Shape descriptors", result); // New call to findContours but with CV_RETR_LIST flag image = cv::imread("binaryGroup.bmp", 0); // Get the contours of the connected components cv::findContours(image, contours, // a vector of contours CV_RETR_LIST, // retrieve the external and internal contours CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours // draw black contours on white image result.setTo(cv::Scalar(255)); cv::drawContours(result, contours, -1, // draw all contours cv::Scalar(0), // in black 2); // with a thickness of 2 cv::namedWindow("All Contours"); cv::imshow("All Contours", result); cv::waitKey(); return 0; } 

¿Que estoy haciendo mal?

EDITAR: Me gustaría que algunos de los que me dieron un voto negativo intenten resolver esto. Esta no es la única pregunta de este tipo aquí, sin embargo, ¿la mía ya ha sido rechazada tres veces?

Además, este es un ejemplo del libro escrito por un profesor de Canadá ( http://www.laganiere.name/opencvCookbook/ ), que enseña tanto OpenCV, ¿se supone que debo ser mejor en esto que él? ¿Debería avergonzarme que pregunte esto? ¿Soy novato tanto en C ++ como en OpenCV? ¿Debo preguntar en otros diez foros y luego, solo entonces, si no encuentro la respuesta, pregunte aquí en Stackoverflow?

Además, no soy perezoso, ayudé a este hombre reescribiendo su código ( OpenCV: graba las imágenes en una ventana y muestra el mismo video en la segunda ventana, pero solo con contornos ). Ayudé a alguien que sabe menos que yo. Pero, en este caso, no sé cómo resolver este problema en este código y, sin embargo, dentro de los 30 minutos, obtuve tres votos negativos.

ACTUALIZACIÓN: Como me señaló la comunidad OpenCV, en realidad debería permitirse convertir Point a Point2f y viceversa, pero el error de la versión 2.4.3 ( http://code.opencv.org/issues/2616#note-1 ) le impide hacerlo. Eso explica por qué este código se compiló para el autor original hace unos años, y no para mí. De todos modos, el usuario @alrikai proporcionó la respuesta correcta y la solución para esto.

El error se corrigió como: cv :: circle (resultado, cv :: Point2f (center), static_cast (radio), cv :: Scalar (0), 2); así que cv :: Point (centro) se convierte en este cv :: Point2f (centro)

Como se comentó anteriormente, el problema fue que estás haciendo un cv::Point desde un cv::Point2f . cv::Point se declara como typedef Point2i Point; , lo que significa que es equivalente a un cv::Point2i . Entonces, en esencia, estás intentando crear un cv::Point2i partir de un cv::Point2f , que no es válido.

Además, me alegro de que te haya funcionado.