float Bezier::getMinDist( int x, int y, float xScale, float yScale ) const { int nearest = findNearestPoint( x, y ); double xDist = xScale * (m_leftVect[nearest] - x); double yDist = yScale * (m_topVect[nearest] - y); return sqrt( xDist * xDist + yDist * yDist ); }
float Bezier::getNearestPercent( int x, int y ) const { int nearest = findNearestPoint( x, y ); return m_percVect[nearest]; }
// deal with unmatched region void dealUnMatchedRegion(const Mat& srcImg, const vector<vector<Point2f>>& srcPointsTab, const vector<vector<Point2f>>& srcFeaturesTab, const vector<int>& srcLabels, vector<int>& isMatched, vector<Mat>& transforms ) { int regionum = transforms.size(); int width = srcImg.size().width; int height = srcImg.size().height; vector<Scalar> means(regionum); computeMeans(srcImg, srcPointsTab, means); vector<Point2f> centers(regionum); computeCenters(srcPointsTab, centers); vector<vector<int>> colorNeighbors(regionum); buildColorNeighbors(means, colorNeighbors); //处理未匹配的区域 for (int i = 0; i < regionum; ++ i) { if (isMatched[i] != 0) continue; //集合颜色相近的特征点 int reIdx = i; vector<Point2f> nearFeatures(0); for (int j = 0; j < colorNeighbors[i].size(); ++j) { int nearIdx = colorNeighbors[i][j]; const vector<Point2f>& nearReFts = srcFeaturesTab[nearIdx]; copy(nearReFts.begin(), nearReFts.end(), std::back_inserter(nearFeatures)); } //颜色相近的特征点找最近的点 Point2f nearest; bool isFind = findNearestPoint(nearFeatures, centers[reIdx], nearest); if (isFind == true) { int nearIdx = srcLabels[(int)nearest.y * width + (int)nearest.x]; transforms[reIdx] = transforms[nearIdx].clone(); isMatched[reIdx] = isMatched[nearIdx]; // debug : 显示最近区域 cout << i << "-th unmatched region: the nearest one is " << nearIdx << endl; Mat test = Mat::zeros(height, width, CV_8UC3); fillRegion(srcPointsTab[i], means[i], test); circle(test, centers[i], 5, cv::Scalar(255,255,255)); for (int j = 0; j < colorNeighbors[i].size(); ++ j) { int nearIdx = colorNeighbors[i][j]; fillRegion(srcPointsTab[nearIdx], means[nearIdx], test); } circle(test, centers[nearIdx], 5, cv::Scalar(255, 255, 255)); string savefn = "output/near_regions_" + type2string(i) + ".png"; imwrite(savefn, test); //显示结束 } else { cout << i << "-th unmatched region: no similar colored region." << endl; } } }