我正在研究OpenCV2&的一些示例代码。 C ++和我卡住了。编译器(WinG上的MinGW,g ++ 4.7.2)说调用重载的'Point_(cv :: Point2f&)'是不明确的,但我无法找到exatcly有什么问题。这是错误:
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_<_Tp>::Point_(const CvPoint2D32f&) [with _Tp = int; CvPoint2D32f = CvPoint2D32f]
C:\OpenCV246PC\build\include/opencv2/core/core.hpp:739:5: note: cv::Point_<_Tp>::Point_(const CvPoint&) [with _Tp = int; CvPoint = CvPoint]
C:\OpenCV246PC\build\include/opencv2/core/core.hpp:738:5: note: cv::Point_<_Tp>::Point_(const cv::Point_<_Tp>&) [with _Tp = int; cv::Point_<_Tp> = cv::Point_<int>]
// 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<int>(radius), cv::Scalar(0), 2);
这是代码:
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
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<cv::Point> > 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<cv::Point> >::const_iterator itContours = contours.begin();
for (; itContours != contours.end(); ++itContours)
{
std::cout << "Size: " << itContours->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<cv::Point> >::iterator itc = contours.begin();
while (itc != contours.end())
{
if (itc->size() < cmin || itc->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<int>(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<cv::Point> 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<cv::Point>::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<cv::Point> hull;
cv::convexHull(cv::Mat(contours[3]), hull);
// Iterate over each segment and draw it
std::vector<cv::Point>::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;
}
我做错了什么?
编辑:我希望有些投票给我的人试图解决这个问题。 这不是这种类型的唯一问题,但我已经三次投票了吗?此外,这是来自加拿大教授(http://www.laganiere.name/opencvCookbook/)的书中的例子,他教授OpenCV,我应该比他更好吗?我问这个问题,我该感到羞耻吗?我是C ++和OpenCV的新手吗?我应该在十个其他论坛上询问,然后,如果我没有找到答案,请在Stackoverflow上询问吗?
而且,我并不懒惰,我通过重写他的代码来帮助这个人(OpenCV: record footage in one window and Display the same video in 2nd window but with contours only)。我帮助了一个比我更了解的人。但是,在这种情况下,我只是不知道如何在这段代码中解决这个问题,但在30分钟内我得到了三张投票?
更新:正如OpenCV社区指出的那样,实际上应该允许将Point转换为Point2f,反之亦然,但版本2.4.3(http://code.opencv.org/issues/2616#note-1)中的错误会阻止它这样做。这解释了为什么这段代码几年前为原作者编译,而不是为我编写。 无论如何,用户@alrikai为此提供了正确的答案和解决方法。
错误更正为:cv :: circle(结果,cv :: Point2f(中),static_cast(半径),cv ::标量(0),2);所以cv :: Point(中心)成为这个cv :: Point2f(中心)
答案 0 :(得分:0)
如上所述,问题是您从cv::Point
开始cv::Point2f
。 cv::Point
被声明为typedef Point2i Point;
,这意味着它等同于cv::Point2i
。所以从本质上讲,您是尝试从cv::Point2i
创建cv::Point2f
,这是无效的。
另外,很高兴听到它适合你