2016-09-07 8 views
0

存在しない点の座標ベクトルを並べる必要がありますが、その座標を行列で指定して得られた値にする必要があります。例mergesortベクトルc + opencv

vector <Point> // v has two coordinates within 
Mat D (2,2) ; 
int a = v [ 0 ] .x ; 
int b = v [ 0 ] .y ; 
int c = v [ 1 ] .x ; 
int d = v [ 1 ] .y ; 
if (D.at <int> (a, b) < D.at<int> (c, d)) 
// Sort in ascending order 

のために私は「座標値」を検索するために、適切な変更をマージソートを使用しようとしました:

void work::merge(vector<cv::Point>& Q1, int low, int high, int mid, Mat & Densita) 
{ 
    cout << "merge" << endl; 
    int i, j, k; 
    vector<cv::Point> c; 
    i = low; 
    k = low; 
    j = mid + 1; 
    while (i <= mid && j <= high) 
    { 
     cout << "-" << endl; 
     int X = Q1[i].x; 
     int Y = Q1[i].y; 
     int W = Q1[j].x; 
     int Q = Q1[j].y; 
     int a = Densita.at<int>(X, Y); 
     int b = Densita.at<int>(W,Q); 
     if (a < b) 
     { 
      cout << "min" << endl; 
      c.push_back(cv::Point(X, Y)); 
      k++; 
      i++; 
     } 
     else 
     { 
      cout << "max" << endl; 
      c.push_back(cv::Point(W, Q)); 
      k++; 
      j++; 
     } 
    } 
    while (i <= mid) 
    { 
     cout << "D" << endl; 
     int X = Q1[i].x; 
     int Y = Q1[i].y; 
     c.push_back(cv::Point(X, Y)); 
     k++; 
     i++; 
    } 
    while (j <= high) 
    { 
     cout << "§" << endl; 
     int W = Q1[j].x; 
     int Q = Q1[j].y; 
     c.push_back(cv::Point(W, Q)); 
     k++; 
     j++; 
    } 
    for (k = low; k < high; k++) 
    { 
     cout << "***" << endl; 
     Q1.at(k) = c.at(k); 
    } 

} 


void work::mergesort(vector<cv::Point>& Q1, int low, int high, Mat & Densita) 
{ 
    cout << "RichiamoMergesort" << endl; 
    int mid; 
    if (low < high) 
    { 
     mid = (low + high)/2; 
     mergesort(Q1, low, mid, Densita); 
     mergesort(Q1, mid + 1, high, Densita); 
     merge(Q1, low, high, mid, Densita); 
    } 
} 

をしかし、マージを入力した後、彼は少し動作し、その後、私は、このエラーを返しました

invalid vector<T> subscript ------>with vs2015 

なぜですか?私は何を間違えているのですか?の解き方 ?

答えて

0

これを実現するには、std::sort関数のカスタムコンパレータを書き直す必要があります。

struct PointCmp { 
    Mat* d; 
    PointCmp(Mat* _d): d(_d) {} 

    inline bool operator() (const Point& p1, const Point& p2) { 
     return d->at<int>(p1.x, p1.y) < d->at<int>(p2.x, p2.y); 
    } 
}; 

int main() { 
    // other stuff 
    std::vector<Point> v;  
    Mat d(2, 2); 
    std::sort(v.begin(), v.end(), PointCmp(&d)); 
} 
+0

ありがとうございます。このコードは私の仕事にとっては良いことです。 – kiaka