2011-09-13 3 views
0

내에서 OpenCV C의 일부에 문제가 있어요 ++ 코드 :C++ 벡터 :: OpenCV의 코드로 문제를 삭제

double getVectorMedian(vector<double> values) 
{ 
    size_t size = values.size(); 
    double median; 

    sort(values.begin(), values.end()); 

    if(size % 2 == 0) 
    { 
     median = (values[size/2 - 1] + values[size/2])/2; 
    } 
    else 
    { 
     median = values[size/2]; 
    } 

    return median; 
} 

void cleanSquares(const vector<vector<Point> >& squares) 
{ 
    float tolerance = 0.2; 
    size_t size = squares.size(); 
    vector<double> areas(size); 

    for(size_t i = 0; i < size; i++) 
    { 
     areas[i] = fabs(contourArea(Mat(squares[i]))); 
    } 

    double medianArea = getVectorMedian(areas); 
    double minArea = medianArea * (1 - tolerance); 
    double maxArea = medianArea * (1 + tolerance); 

    for(unsigned int i = size - 1; i >= 0; i--) 
    { 
     if(areas[i] > maxArea || areas[i] < minArea) 
     { 
      squares.erase(squares.begin() + i); // Here I get the error 
     } 
    } 
} 

내가지고있어 오류가 난

no matching function for call to ‘std::vector<std::vector<cv::Point_<int> > >::erase(__gnu_cxx::__normal_iterator<const std::vector<cv::Point_<int> >*, std::vector<std::vector<cv::Point_<int> > > >) const’ main.cpp /find_notes/src line 154 C/C++ Problem 

입니다 OpenCV squares.cpp 샘플 프로그램을 수정하고 이미지에서 발견 된 사각형의 중간 영역과 너무 다른 모든 사각형을 제거하려고합니다.

cleanSquares에서 마지막으로 후진 루프를 만들고 각 스퀘어가 너무 많이 다르며 그 경우 제곱 벡터에서 해당 벡터를 지우고 싶지 않은지 확인합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

void cleanSquares(const vector<vector<Point> >& squares)

squares는 const를 참조, 당신은 그것에서 지울 수 없습니다. 최종 의도에 따라 const를 버리거나 값으로 가져옵니다.

편안함을 느끼는 경우 지우개 (remove_if (...)) 관용어를 사용하는 것이 좋습니다.

+0

물론, 그 트릭을했다. 빠른 답변 주셔서 감사합니다! :-) – Tirithen

+0

나는 for 루프를 (size_t i = size - 1; i -> 0;)에 맞게 바꿔서 루프가 올바르게 거꾸로 계산되도록했다. 여기에 설명이있다. http://stackoverflow.com/questions/ 3623263/reverse-iteration-with-an-unsigned-loop-variable – Tirithen

+0

지우개 (remove_if (...)) 관용구를 사용했다면 문제가 없었을 것이므로 루프를 작성하지 않아도됩니다. 미래에 그것을 연구 해보십시오. –