【发布时间】:2012-03-12 14:47:36
【问题描述】:
这是我检索矩形角的函数,输入是一个阈值图像(上面有一个车牌),我希望输出是一个带有板角点的向量(在向量内)。排序:left_up、right_up、right_bottom、left_bottom。
我使用 openCV 来查找轮廓(效果很好);经过一些过滤器后,我使用 approxPoly 来查找矩形。我找到了四个点,这很好,但我想订购它们。我认为以下方法会起作用: 把所有的点放在一个向量中
找到比较函数Left指定的min_element并从向量中擦除
找到另一个左元素并擦除,然后确定哪个在上,哪个在下。
剩下的两点是正确的点。
bool left(CvPoint &pt1, CvPoint &pt2) {
return pt1.x < pt2.x;
}
bool up(CvPoint &pt1, CvPoint &pt2) {
return pt1.y < pt2.y;
}
std::vector<std::vector<CvPoint> > findNumberPlate(IplImage* img) {
vector<CvPoint> numberplate;
vector<vector<CvPoint> > numberplates_output;
CvMemStorage* storage = cvCreateMemStorage(0);
CvMemStorage* storage2 = cvCreateMemStorage(0);
CvSeq* contour = 0;
cvFindContours(img, storage, &contour, sizeof (CvContour), CV_RETR_EXTERNAL);
CvSeq* result = 0;
for (CvSeq* c = contour; c != NULL; c = c->h_next) {
double area_contour = cvContourArea(c, CV_WHOLE_SEQ);
CvBox2D c_box = cvMinAreaRect2(c);
double area_box = c_box.size.height * c_box.size.width;
if (area_contour / area_box > 0.83 && area_contour > 2000) {
if (!storage2 == 0) cvClearMemStorage(storage2);
else storage2 = cvCreateMemStorage(0);
result = cvApproxPoly(c, sizeof (CvContour), storage2, CV_POLY_APPROX_DP, cvContourPerimeter(c)*0.03, 0);
if (result->total == 4) {
//find up/bottom & left/right
vector<CvPoint> points;
for (int i = 0; i < 4; i++) {
CvPoint* tempPoint = (CvPoint*) cvGetSeqElem(result, i);
points.push_back(cvPoint(tempPoint->x,tempPoint->y));
}
vector<CvPoint>::iterator itLeft1 = std::min_element(points.begin(), points.end(), left);
points.erase(itLeft1);
vector<CvPoint>::iterator itLeft2 = std::min_element(points.begin(), points.end(), left);
points.erase(itLeft2);
vector<CvPoint>::iterator itLeftUp = std::min(itLeft1, itLeft2, left);
vector<CvPoint>::iterator itLeftBottom = std::max(itLeft1, itLeft2, left);
CvPoint left_up = *itLeftUp;
CvPoint left_bottom = *itLeftBottom;
vector<CvPoint>::iterator itRightUp = std::min(points.begin(), points.end(), up);
vector<CvPoint>::iterator itRightBottom = std::max(points.begin(), points.end(), up);
CvPoint right_up = *itRightUp;
CvPoint right_bottom = *itRightBottom;
//etc
}
但是,当使用函数 min_element & max_element 时,我遇到了几个我不明白的错误。
findNumberPlate.cpp:57: error: no matching function for call to ‘min_element(__gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >, __gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >, <unresolved overloaded function type>)’
findNumberPlate.cpp:59: error: no matching function for call to ‘min_element(__gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >, __gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >, <unresolved overloaded function type>)’
findNumberPlate.cpp:62: error: no matching function for call to ‘min(__gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >&, __gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >&, <unresolved overloaded function type>)’
findNumberPlate.cpp:63: error: no matching function for call to ‘max(__gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >&, __gnu_cxx::__normal_iterator<CvPoint*, std::vector<CvPoint, std::allocator<CvPoint> > >&, <unresolved overloaded function type>)’
我不能将 CvPoints 与 min_element 一起使用吗?或者……谁能帮帮我?
谢谢!
【问题讨论】:
-
首先,您使用的是 cpp 而不是新的 opencv c++ 接口。第二:你导入
#include <algorithm>了吗? -
我包含:#include
#include #include #include #include #include -
对不起,我相信我给了你错误的答案。